Compare commits
2 Commits
1e47b86f42
...
7b6c7de1fa
Author | SHA1 | Date |
---|---|---|
Juhani Krekelä | 7b6c7de1fa | |
Juhani Krekelä | 658b89f5d8 |
|
@ -218,7 +218,7 @@ attempt_connect:
|
||||||
#if defined(SOL_SOCKET) && defined(SO_REUSEADDR)
|
#if defined(SOL_SOCKET) && defined(SO_REUSEADDR)
|
||||||
EINTRLOOP(rs, setsockopt(s_unix_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&a1, sizeof a1));
|
EINTRLOOP(rs, setsockopt(s_unix_fd, SOL_SOCKET, SO_REUSEADDR, (void *)&a1, sizeof a1));
|
||||||
#endif
|
#endif
|
||||||
rs = blocking_connect(s_unix_fd, &s_unix.s, s_unix_l);
|
EINTRLOOP(rs, connect(s_unix_fd, &s_unix.s, s_unix_l));
|
||||||
if (rs) {
|
if (rs) {
|
||||||
retry:
|
retry:
|
||||||
/*debug("connect: %d, %s", errno, strerror(errno));*/
|
/*debug("connect: %d, %s", errno, strerror(errno));*/
|
||||||
|
|
|
@ -672,7 +672,7 @@ static void try_connect(struct connection *c)
|
||||||
#if defined(__aarch64__) && defined(__ILP32__)
|
#if defined(__aarch64__) && defined(__ILP32__)
|
||||||
errno = EINPROGRESS; /* arm64 ilp32 bug */
|
errno = EINPROGRESS; /* arm64 ilp32 bug */
|
||||||
#endif
|
#endif
|
||||||
rs = connect(s, (struct sockaddr *)(void *)&sa, sizeof sa);
|
EINTRLOOP(rs, connect(s, (struct sockaddr *)(void *)&sa, sizeof sa));
|
||||||
#ifdef SUPPORT_IPV6
|
#ifdef SUPPORT_IPV6
|
||||||
} else if (addr->af == AF_INET6) {
|
} else if (addr->af == AF_INET6) {
|
||||||
struct sockaddr_in6 sa;
|
struct sockaddr_in6 sa;
|
||||||
|
@ -686,14 +686,14 @@ static void try_connect(struct connection *c)
|
||||||
#if defined(__aarch64__) && defined(__ILP32__)
|
#if defined(__aarch64__) && defined(__ILP32__)
|
||||||
errno = EINPROGRESS; /* arm64 ilp32 bug */
|
errno = EINPROGRESS; /* arm64 ilp32 bug */
|
||||||
#endif
|
#endif
|
||||||
rs = connect(s, (struct sockaddr *)(void *)&sa, sizeof sa);
|
EINTRLOOP(rs, connect(s, (struct sockaddr *)(void *)&sa, sizeof sa));
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
rs = -1;
|
rs = -1;
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
}
|
}
|
||||||
if (rs) {
|
if (rs) {
|
||||||
if (errno != EALREADY && errno != EINPROGRESS && errno != EINTR) {
|
if (errno != EALREADY && errno != EINPROGRESS) {
|
||||||
#ifdef BEOS
|
#ifdef BEOS
|
||||||
if (errno == EWOULDBLOCK) errno = ETIMEDOUT;
|
if (errno == EWOULDBLOCK) errno = ETIMEDOUT;
|
||||||
#endif
|
#endif
|
||||||
|
|
2
dns.c
2
dns.c
|
@ -773,7 +773,7 @@ int ipv6_full_access(void)
|
||||||
sin6.sin6_family = AF_INET6;
|
sin6.sin6_family = AF_INET6;
|
||||||
sin6.sin6_port = htons(1024);
|
sin6.sin6_port = htons(1024);
|
||||||
memcpy(&sin6.sin6_addr.s6_addr, "\052\001\004\060\000\015\000\000\002\314\236\377\376\044\176\032", 16);
|
memcpy(&sin6.sin6_addr.s6_addr, "\052\001\004\060\000\015\000\000\002\314\236\377\376\044\176\032", 16);
|
||||||
c = blocking_connect(h, (struct sockaddr *)(void *)&sin6, sizeof sin6);
|
EINTRLOOP(c, connect(h, (struct sockaddr *)(void *)&sin6, sizeof sin6));
|
||||||
EINTRLOOP(rs, close(h));
|
EINTRLOOP(rs, close(h));
|
||||||
if (!c) return 1;
|
if (!c) return 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
1
links.h
1
links.h
|
@ -1140,7 +1140,6 @@ extern int terminate_loop;
|
||||||
int can_write(int fd);
|
int can_write(int fd);
|
||||||
int can_read(int fd);
|
int can_read(int fd);
|
||||||
int can_read_timeout(int fd, int sec);
|
int can_read_timeout(int fd, int sec);
|
||||||
int blocking_connect(int fd, struct sockaddr *addr, socklen_t addrlen);
|
|
||||||
int close_std_handle(int);
|
int close_std_handle(int);
|
||||||
void restore_std_handle(int, int);
|
void restore_std_handle(int, int);
|
||||||
unsigned long select_info(int);
|
unsigned long select_info(int);
|
||||||
|
|
16
select.c
16
select.c
|
@ -125,22 +125,6 @@ int can_read(int fd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// PATCH: Handle connect not being restartable
|
|
||||||
int blocking_connect(int fd, struct sockaddr *addr, socklen_t addrlen)
|
|
||||||
{
|
|
||||||
int connect_error;
|
|
||||||
socklen_t len = sizeof(connect_error);
|
|
||||||
|
|
||||||
if (!connect(fd, addr, addrlen)) return 0;
|
|
||||||
if (errno != EINTR) return -1;
|
|
||||||
|
|
||||||
can_do_io(fd, 1, -1); // Wait until connected/failed
|
|
||||||
getsockopt(fd, SOL_SOCKET, SO_ERROR, &connect_error, &len);
|
|
||||||
errno = connect_error;
|
|
||||||
return !connect_error ? 0 : -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int close_std_handle(int std)
|
int close_std_handle(int std)
|
||||||
{
|
{
|
||||||
#ifndef DOS
|
#ifndef DOS
|
||||||
|
|
Loading…
Reference in New Issue