Improved the regex to match syslog lines and be easier to read.
[rsync/rsync.git] / socket.c
index bc61bae..8a96061 100644 (file)
--- a/socket.c
+++ b/socket.c
 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,
@@ -54,13 +58,13 @@ static int establish_proxy_connection(int fd, char *host, int port,
                         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;
                }
 
-               base64_encode(buffer, len, authbuf);
+               base64_encode(buffer, len, authbuf, 1);
                authhdr = "\r\nProxy-Authorization: Basic ";
        } else {
                *authbuf = '\0';
@@ -433,7 +437,9 @@ static RETSIGTYPE sigchld_handler(UNUSED(int val))
 #ifdef WNOHANG
        while (waitpid(-1, NULL, WNOHANG) > 0) {}
 #endif
+#ifndef HAVE_SIGACTION
        signal(SIGCHLD, sigchld_handler);
+#endif
 }
 
 
@@ -442,6 +448,10 @@ void start_accept_loop(int port, int (*fn)(int, int))
        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)
@@ -499,7 +509,7 @@ void start_accept_loop(int port, int (*fn)(int, int))
                if (fd < 0)
                        continue;
 
-               signal(SIGCHLD, sigchld_handler);
+               SIGACTION(SIGCHLD, sigchld_handler);
 
                if ((pid = fork()) == 0) {
                        int ret;