]> arthur.barton.de Git - netatalk.git/commitdiff
unblock signals after fork().
authordidg <didg>
Fri, 14 Nov 2003 14:25:41 +0000 (14:25 +0000)
committerdidg <didg>
Fri, 14 Nov 2003 14:25:41 +0000 (14:25 +0000)
include/atalk/server_child.h
libatalk/asp/asp_getsess.c
libatalk/dsi/dsi_tcp.c
libatalk/util/server_child.c

index c983a863400a2b6d82b4624496244a89a5416e13..9e17883e0cb3b808b7834f07653baa7a4758abf3 100644 (file)
@@ -32,5 +32,6 @@ extern void server_child_free __P((server_child *));
 extern void server_child_kill __P((server_child *, const int, const int));
 extern void server_child_setup __P((server_child *, const int, void (*)()));
 extern void server_child_handler __P((server_child *));
+extern void server_reset_signal __P((void));
 
 #endif
index 6d0259f15d46f16fa367250caf1a1122deb671c7..ed19736876fd8065630bd294a7526465fc8674f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: asp_getsess.c,v 1.7.2.1 2003-11-05 06:41:02 didg Exp $
+ * $Id: asp_getsess.c,v 1.7.2.2 2003-11-14 14:25:41 didg Exp $
  *
  * Copyright (c) 1990,1996 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
@@ -219,8 +219,7 @@ ASP asp_getsession(ASP asp, server_child *server_children,
 
        switch ((pid = fork())) {
        case 0 : /* child */
-         signal(SIGTERM, SIG_DFL);
-         signal(SIGHUP, SIG_DFL);
+         server_reset_signal();
          /* free/close some things */
          for (i = 0; i < children->nsessions; i++ ) {
            if ( asp_ac[i] != NULL )
index ca0060b5cfde4550258a395bd577d27ff2ba658c..bd0dcd4362c07b2a73ecb50e4fdb61ecec6ac8b9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: dsi_tcp.c,v 1.9.4.1 2003-11-05 06:41:02 didg Exp $
+ * $Id: dsi_tcp.c,v 1.9.4.2 2003-11-14 14:25:41 didg Exp $
  *
  * Copyright (c) 1997, 1998 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
@@ -126,9 +126,8 @@ static int dsi_tcp_open(DSI *dsi)
     u_int8_t block[DSI_BLOCKSIZ];
     size_t stored;
     
-    /* reset a couple signals */
-    signal(SIGTERM, SIG_DFL); 
-    signal(SIGHUP, SIG_DFL);
+    /* reset signals */
+    server_reset_signal();
 
     /* install an alarm to deal with non-responsive connections */
     newact.sa_handler = timeout_handler;
index cb6ee25eaf2fe8919f4921ec04b6b3b545fed4ef..929b53c9d897bf4e6a603740f9efbb8af573afe4 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: server_child.c,v 1.7.2.1 2003-11-05 06:41:03 didg Exp $
+ * $Id: server_child.c,v 1.7.2.2 2003-11-14 14:25:41 didg Exp $
  *
  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
@@ -31,6 +31,8 @@
 #ifdef HAVE_SYS_WAIT_H
 #include <sys/wait.h>
 #endif /* HAVE_SYS_WAIT_H */
+#include <sys/time.h>
+
 #ifndef WEXITSTATUS
 #define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
 #endif /* ! WEXITSTATUS */
@@ -274,3 +276,30 @@ void server_child_handler(server_child *children)
     }
   }
 }
+
+/* --------------------------- 
+ * reset children signals
+*/
+void server_reset_signal(void)
+{
+    struct sigaction    sv;
+    sigset_t            sigs;
+    const struct itimerval none = {{0, 0}, {0, 0}};
+
+    setitimer(ITIMER_REAL, &none, NULL);
+    memset(&sv, 0, sizeof(sv));
+    sv.sa_handler =  SIG_DFL;
+    sigemptyset( &sv.sa_mask );
+    
+    sigaction(SIGALRM, &sv, 0 );
+    sigaction(SIGHUP,  &sv, 0 );
+    sigaction(SIGTERM, &sv, 0 );
+    sigaction(SIGCHLD, &sv, 0 );
+    
+    sigemptyset(&sigs);
+    sigaddset(&sigs, SIGALRM);
+    sigaddset(&sigs, SIGHUP);
+    sigaddset(&sigs, SIGCHLD);
+    sigprocmask(SIG_UNBLOCK, &sigs, NULL);
+        
+}