Make sure to save/restore errno in signal handlers
authorFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 8 Nov 2013 14:41:01 +0000 (15:41 +0100)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 8 Nov 2013 14:41:01 +0000 (15:41 +0100)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
contrib/netsimpcap/src/netsimpcap.c
gui/linux-gtk/src/main.c
src/main.c
src/olsr_switch/main.c

index 8246d36..fae45b3 100644 (file)
@@ -70,6 +70,10 @@ u_int8_t mac_bc[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 static void
 signalHandler(int signo __attribute__ ((unused)))
 {
+  /*
+   * Normally errno must be saved here and restored before returning but since
+   * we do a simple assignment we don't need to do that in this signal handler.
+   */
   running = 0;
 }
 
index 1be3506..652c7d2 100644 (file)
@@ -129,12 +129,14 @@ __attribute__((noreturn))
 void
 shutdown_(int sig)
 {
+  int errNr = errno;
   printf("Cleaning up...\n");
 
   if (ipc_close() < 0)
     printf("Could not close socket!\n");
 
   printf("BYE-BYE!\n");
+  errno = errNr;
   exit(sig);
 }
 
index a4a7736..820549b 100644 (file)
@@ -733,6 +733,9 @@ int main(int argc, char *argv[]) {
  *@param signo the signal that triggered this callback
  */
 void olsr_reconfigure(int signo __attribute__ ((unused))) {
+#ifndef _WIN32
+  int errNr = errno;
+#endif
   /* if we are started with -nofork, we do not want to go into the
    * background here. So we can simply stop on -HUP
    */
@@ -758,6 +761,9 @@ void olsr_reconfigure(int signo __attribute__ ((unused))) {
       olsr_syslog(OLSR_LOG_INFO, "RECONFIGURING!\n");
     }
   }
+#ifndef _WIN32
+  errno = errNr;
+#endif
   olsr_shutdown(0);
 }
 #endif /* _WIN32 */
@@ -795,6 +801,9 @@ SignalHandler(unsigned long signo)
 static void olsr_shutdown(int signo __attribute__ ((unused)))
 #endif /* _WIN32 */
 {
+#ifndef _WIN32
+  int errNr = errno;
+#endif
   struct interface *ifn;
   int exit_value;
 
@@ -917,6 +926,9 @@ static void olsr_shutdown(int signo __attribute__ ((unused)))
   exit_value = olsr_cnf->exit_value;
   olsrd_free_cnf(olsr_cnf);
 
+#ifndef _WIN32
+  errno = errNr;
+#endif
   exit(exit_value);
 }
 
index 893a9cd..53fa4c2 100644 (file)
@@ -105,10 +105,14 @@ void
 ohs_close(int signo __attribute__ ((unused)))
 #endif /* _WIN32 */
 {
+#ifndef _WIN32
+  int errNr = errno;
+#endif
   printf("OHS: exit\n");
-
   close(srv_socket);
-
+#ifndef _WIN32
+  errno = errNr;
+#endif
   exit(0);
 }