Matt McCutchen's Web Site
/
rsync
/
rsync.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use the regular delete* vars instead of the saw_delete* vars
[rsync/rsync.git]
/
socket.c
diff --git
a/socket.c
b/socket.c
index
bc61bae
..
9079093
100644
(file)
--- a/
socket.c
+++ b/
socket.c
@@
-36,6
+36,10
@@
extern char *bind_address;
extern int default_af_hint;
extern char *bind_address;
extern int default_af_hint;
+#ifdef HAVE_SIGACTION
+static struct sigaction sigact;
+#endif
+
/**
* Establish a proxy connection on an open socket to a web proxy by
* using the CONNECT method. If proxy_user and proxy_pass are not NULL,
/**
* Establish a proxy connection on an open socket to a web proxy by
* using the CONNECT method. If proxy_user and proxy_pass are not NULL,
@@
-54,13
+58,13
@@
static int establish_proxy_connection(int fd, char *host, int port,
proxy_user, ":", proxy_pass, NULL);
len = strlen(buffer);
proxy_user, ":", proxy_pass, NULL);
len = strlen(buffer);
- if ((len*8 + 5) / 6 >= (int)sizeof authbuf) {
+ if ((len*8 + 5) / 6 >= (int)sizeof authbuf
- 3
) {
rprintf(FERROR,
"authentication information is too long\n");
return -1;
}
rprintf(FERROR,
"authentication information is too long\n");
return -1;
}
- base64_encode(buffer, len, authbuf);
+ base64_encode(buffer, len, authbuf
, 1
);
authhdr = "\r\nProxy-Authorization: Basic ";
} else {
*authbuf = '\0';
authhdr = "\r\nProxy-Authorization: Basic ";
} else {
*authbuf = '\0';
@@
-329,9
+333,9
@@
static int *open_socket_in(int type, int port, const char *bind_addr,
int af_hint)
{
int one = 1;
int af_hint)
{
int one = 1;
- int s, *socks, maxs, i;
+ int s, *socks, maxs, i
, ecnt
;
struct addrinfo hints, *all_ai, *resp;
struct addrinfo hints, *all_ai, *resp;
- char portbuf[10];
+ char portbuf[10]
, **errmsgs
;
int error;
memset(&hints, 0, sizeof hints);
int error;
memset(&hints, 0, sizeof hints);
@@
-349,17
+353,25
@@
static int *open_socket_in(int type, int port, const char *bind_addr,
/* Count max number of sockets we might open. */
for (maxs = 0, resp = all_ai; resp; resp = resp->ai_next, maxs++) {}
/* Count max number of sockets we might open. */
for (maxs = 0, resp = all_ai; resp; resp = resp->ai_next, maxs++) {}
- if (!(socks = new_array(int, maxs + 1)))
+ socks = new_array(int, maxs + 1);
+ errmsgs = new_array(char *, maxs);
+ if (!socks || !errmsgs)
out_of_memory("open_socket_in");
/* We may not be able to create the socket, if for example the
* machine knows about IPv6 in the C library, but not in the
* kernel. */
out_of_memory("open_socket_in");
/* We may not be able to create the socket, if for example the
* machine knows about IPv6 in the C library, but not in the
* kernel. */
- for (resp = all_ai, i = 0; resp; resp = resp->ai_next) {
+ for (resp = all_ai, i =
ecnt =
0; resp; resp = resp->ai_next) {
s = socket(resp->ai_family, resp->ai_socktype,
resp->ai_protocol);
if (s == -1) {
s = socket(resp->ai_family, resp->ai_socktype,
resp->ai_protocol);
if (s == -1) {
+ int r = asprintf(&errmsgs[ecnt++],
+ "socket(%d,%d,%d) failed: %s\n",
+ (int)resp->ai_family, (int)resp->ai_socktype,
+ (int)resp->ai_protocol, strerror(errno));
+ if (r < 0)
+ out_of_memory("open_socket_in");
/* See if there's another address that will work... */
continue;
}
/* See if there's another address that will work... */
continue;
}
@@
-381,6
+393,10
@@
static int *open_socket_in(int type, int port, const char *bind_addr,
/* Now we've got a socket - we need to bind it. */
if (bind(s, resp->ai_addr, resp->ai_addrlen) < 0) {
/* Nope, try another */
/* Now we've got a socket - we need to bind it. */
if (bind(s, resp->ai_addr, resp->ai_addrlen) < 0) {
/* Nope, try another */
+ int r = asprintf(&errmsgs[ecnt++],
+ "bind() failed: %s\n", strerror(errno));
+ if (r < 0)
+ out_of_memory("open_socket_in");
close(s);
continue;
}
close(s);
continue;
}
@@
-392,6
+408,15
@@
static int *open_socket_in(int type, int port, const char *bind_addr,
if (all_ai)
freeaddrinfo(all_ai);
if (all_ai)
freeaddrinfo(all_ai);
+ /* Only output the socket()/bind() messages if we were totally
+ * unsuccessful, or if the daemon is being run with -vv. */
+ for (s = 0; s < ecnt; s++) {
+ if (!i || verbose > 1)
+ rwrite(FLOG, errmsgs[s], strlen(errmsgs[s]));
+ free(errmsgs[s]);
+ }
+ free(errmsgs);
+
if (!i) {
rprintf(FERROR,
"unable to bind any inbound sockets on port %d\n",
if (!i) {
rprintf(FERROR,
"unable to bind any inbound sockets on port %d\n",
@@
-433,7
+458,9
@@
static RETSIGTYPE sigchld_handler(UNUSED(int val))
#ifdef WNOHANG
while (waitpid(-1, NULL, WNOHANG) > 0) {}
#endif
#ifdef WNOHANG
while (waitpid(-1, NULL, WNOHANG) > 0) {}
#endif
+#ifndef HAVE_SIGACTION
signal(SIGCHLD, sigchld_handler);
signal(SIGCHLD, sigchld_handler);
+#endif
}
}
@@
-442,6
+469,10
@@
void start_accept_loop(int port, int (*fn)(int, int))
fd_set deffds;
int *sp, maxfd, i;
fd_set deffds;
int *sp, maxfd, i;
+#ifdef HAVE_SIGACTION
+ sigact.sa_flags = SA_NOCLDSTOP;
+#endif
+
/* open an incoming socket */
sp = open_socket_in(SOCK_STREAM, port, bind_address, default_af_hint);
if (sp == NULL)
/* open an incoming socket */
sp = open_socket_in(SOCK_STREAM, port, bind_address, default_af_hint);
if (sp == NULL)
@@
-499,7
+530,7
@@
void start_accept_loop(int port, int (*fn)(int, int))
if (fd < 0)
continue;
if (fd < 0)
continue;
-
signal
(SIGCHLD, sigchld_handler);
+
SIGACTION
(SIGCHLD, sigchld_handler);
if ((pid = fork()) == 0) {
int ret;
if ((pid = fork()) == 0) {
int ret;