Call SIGACTION() instead of signal().
authorWayne Davison <wayned@samba.org>
Thu, 2 Feb 2006 02:39:25 +0000 (02:39 +0000)
committerWayne Davison <wayned@samba.org>
Thu, 2 Feb 2006 02:39:25 +0000 (02:39 +0000)
cleanup.c
socket.c

index 0163dd2..08609e1 100644 (file)
--- a/cleanup.c
+++ b/cleanup.c
@@ -26,6 +26,10 @@ extern int keep_partial;
 extern int log_got_error;
 extern char *partial_dir;
 
+#if defined HAVE_SIGACTION && defined HAVE_SIGPROCMASK
+static struct sigaction sigact;
+#endif
+
 /**
  * Close all open sockets and files, allowing a (somewhat) graceful
  * shutdown() of socket connections.  This eliminates the abortive
@@ -94,8 +98,8 @@ void _exit_cleanup(int code, const char *file, int line)
        }
        inside_cleanup++;
 
-       signal(SIGUSR1, SIG_IGN);
-       signal(SIGUSR2, SIG_IGN);
+       SIGACTION(SIGUSR1, SIG_IGN);
+       SIGACTION(SIGUSR2, SIG_IGN);
 
        if (verbose > 3) {
                rprintf(FINFO,"_exit_cleanup(code=%d, file=%s, line=%d): entered\n",
index bc61bae..7e77969 100644 (file)
--- a/socket.c
+++ b/socket.c
 extern char *bind_address;
 extern int default_af_hint;
 
+#if defined HAVE_SIGACTION && defined HAVE_SIGPROCMASK
+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,
@@ -433,7 +437,9 @@ static RETSIGTYPE sigchld_handler(UNUSED(int val))
 #ifdef WNOHANG
        while (waitpid(-1, NULL, WNOHANG) > 0) {}
 #endif
+#if !defined HAVE_SIGACTION && !defined HAVE_SIGPROCMASK
        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;
 
+#if defined HAVE_SIGACTION && defined HAVE_SIGPROCMASK
+       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;