Reworked passing of envars to Pinentry.
[gnupg.git] / common / signal.c
index dc026c1..98859a4 100644 (file)
@@ -1,11 +1,12 @@
 /* signal.c - signal handling
- * Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002,
+ *               2005 Free Software Foundation, Inc.
  *
  * This file is part of GnuPG.
  *
  * GnuPG is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * the Free Software Foundation; either version 3 of the License, or
  * (at your option) any later version.
  *
  * GnuPG is distributed in the hope that it will be useful,
@@ -14,8 +15,7 @@
  * GNU General Public License for more details.
  *
  * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include <config.h>
 #include "util.h"
 
 
+#ifndef HAVE_DOSISH_SYSTEM
 static volatile int caught_fatal_sig;
 static volatile int caught_sigusr1;
+#endif
 static void (*cleanup_fnc)(void);
 
 
+#ifndef HAVE_DOSISH_SYSTEM
 static void
 init_one_signal (int sig, RETSIGTYPE (*handler)(int), int check_ign )
 {
-#ifndef HAVE_DOSISH_SYSTEM
 # ifdef HAVE_SIGACTION
   struct sigaction oact, nact;
   
@@ -64,56 +66,90 @@ init_one_signal (int sig, RETSIGTYPE (*handler)(int), int check_ign )
       signal (sig, SIG_IGN);
     }
 # endif
-#endif /*!HAVE_DOSISH_SYSTEM*/
 }
+#endif /*!HAVE_DOSISH_SYSTEM*/
 
+#ifndef HAVE_DOSISH_SYSTEM
 static const char *
 get_signal_name( int signum )
 {
-#if defined(SYS_SIGLIST_DECLARED) && defined(NSIG)
+  /* Note that we can't use strsignal(), because it is not
+     reentrant. */
+#if HAVE_DECL_SYS_SIGLIST && defined(NSIG)
   return (signum >= 0 && signum < NSIG) ? sys_siglist[signum] : "?";
 #else
-  return "some signal";
+  return NULL;
 #endif
 }
+#endif /*!HAVE_DOSISH_SYSTEM*/
 
+#ifndef HAVE_DOSISH_SYSTEM
 static RETSIGTYPE
 got_fatal_signal (int sig)
 {
   const char *s;
 
   if (caught_fatal_sig)
-       raise (sig);
+    raise (sig);
   caught_fatal_sig = 1;
-
+  
   if (cleanup_fnc)
     cleanup_fnc ();
-  /* better don't translate these messages */
+  /* Better don't translate these messages. */
   write (2, "\n", 1 );
   s = log_get_prefix (NULL);
   if (s)
     write(2, s, strlen (s));
-  write (2, ": ", 2 );
+  write (2, ": signal ", 9 );
   s = get_signal_name(sig);
-  write (2, s, strlen(s) );
+  if (s)
+    write (2, s, strlen(s) );
+  else
+    {
+      /* We are in a signal handler so we can't use any kind of printf
+         even not sprintf.  So we use a straightforward algorithm.  We
+         got a report that on one particular system, raising a signal
+         while in this handler, the parameter SIG get sclobbered and
+         things are messed up because we modify its value.  Although
+         this is a bug in that system, we will protect against it.  */
+      if (sig < 0 || sig >= 100000)
+        write (2, "?", 1);
+      else 
+        {
+          int i, value, any=0;
+
+          for (value=sig,i=10000; i; i /= 10)
+            {
+              if (value >= i || ((any || i==1) && !(value/i)))
+                {
+                  write (2, "0123456789"+(value/i), 1);
+                  if ((value/i))
+                    any = 1;
+                  value %= i;
+                }
+            }
+        }
+    }
   write (2, " caught ... exiting\n", 20);
   
-  /* reset action to default action and raise signal again */
+  /* Reset action to default action and raise signal again */
   init_one_signal (sig, SIG_DFL, 0);
-  /* fixme: remove_lockfiles ();*/
+  /* Fixme: remove_lockfiles ();*/
 #ifdef __riscos__
   close_fds ();
 #endif /* __riscos__ */
   raise( sig );
 }
+#endif /*!HAVE_DOSISH_SYSTEM*/
 
-
+#ifndef HAVE_DOSISH_SYSTEM
 static RETSIGTYPE
 got_usr_signal (int sig)
 {
+  (void)sig;
   caught_sigusr1 = 1;
 }
-
+#endif /*!HAVE_DOSISH_SYSTEM*/
 
 void
 gnupg_init_signals (int mode, void (*fast_cleanup)(void))