Imported from ../bash-3.1.tar.gz.
[platform/upstream/bash.git] / builtins / trap.def
index f6a8ee4..669bea7 100644 (file)
@@ -1,13 +1,13 @@
 This file is trap.def, from which is created trap.c.
 It implements the builtin "trap" in Bash.
 
 This file is trap.def, from which is created trap.c.
 It implements the builtin "trap" in Bash.
 
-Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.
+Copyright (C) 1987-2005 Free Software Foundation, Inc.
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
 Bash 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
 
 This file is part of GNU Bash, the Bourne Again SHell.
 
 Bash 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 1, or (at your option) any later
+Software Foundation; either version 2, or (at your option) any later
 version.
 
 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
 version.
 
 Bash is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -17,31 +17,35 @@ for more details.
 
 You should have received a copy of the GNU General Public License along
 with Bash; see the file COPYING.  If not, write to the Free Software
 
 You should have received a copy of the GNU General Public License along
 with Bash; see the file COPYING.  If not, write to the Free Software
-Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
 
 $PRODUCES trap.c
 
 $BUILTIN trap
 $FUNCTION trap_builtin
 
 $PRODUCES trap.c
 
 $BUILTIN trap
 $FUNCTION trap_builtin
-$SHORT_DOC trap [arg] [signal_spec] or trap -l
+$SHORT_DOC trap [-lp] [arg signal_spec ...]
 The command ARG is to be read and executed when the shell receives
 The command ARG is to be read and executed when the shell receives
-signal(s) SIGNAL_SPEC.  If ARG is absent all specified signals are
-reset to their original values.  If ARG is the null string each
-SIGNAL_SPEC is ignored by the shell and by the commands it invokes.
-If SIGNAL_SPEC is EXIT (0) the command ARG is executed on exit from
-the shell.  If SIGNAL_SPEC is DEBUG, ARG is executed after every
-command.  If ARG is `-p' then the trap commands associated with
-each SIGNAL_SPEC are displayed.  If no arguments are supplied or if
-only `-p' is given, trap prints the list of commands associated with
-each signal number.  SIGNAL_SPEC is either a signal name in <signal.h>
-or a signal number.  `trap -l' prints a list of signal names and their
-corresponding numbers.  Note that a signal can be sent to the shell
-with "kill -signal $$".
+signal(s) SIGNAL_SPEC.  If ARG is absent (and a single SIGNAL_SPEC
+is supplied) or `-', each specified signal is reset to its original
+value.  If ARG is the null string each SIGNAL_SPEC is ignored by the
+shell and by the commands it invokes.  If a SIGNAL_SPEC is EXIT (0)
+the command ARG is executed on exit from the shell.  If a SIGNAL_SPEC
+is DEBUG, ARG is executed after every simple command.  If the`-p' option
+is supplied then the trap commands associated with each SIGNAL_SPEC are
+displayed.  If no arguments are supplied or if only `-p' is given, trap
+prints the list of commands associated with each signal.  Each SIGNAL_SPEC
+is either a signal name in <signal.h> or a signal number.  Signal names
+are case insensitive and the SIG prefix is optional.  `trap -l' prints
+a list of signal names and their corresponding numbers.  Note that a
+signal can be sent to the shell with "kill -signal $$".
 $END
 
 #include <config.h>
 
 #if defined (HAVE_UNISTD_H)
 $END
 
 #include <config.h>
 
 #if defined (HAVE_UNISTD_H)
+#  ifdef _MINIX
+#    include <sys/types.h>
+#  endif
 #  include <unistd.h>
 #endif
 
 #  include <unistd.h>
 #endif
 
@@ -55,7 +59,8 @@ $END
 #include "common.h"
 #include "bashgetopt.h"
 
 #include "common.h"
 #include "bashgetopt.h"
 
-static int display_traps ();
+static void showtrap __P((int));
+static int display_traps __P((WORD_LIST *));
 
 /* The trap command:
 
 
 /* The trap command:
 
@@ -76,13 +81,13 @@ static int display_traps ();
 #define REVERT 1               /* Revert to this signals original value. */
 #define IGNORE 2               /* Ignore this signal. */
 
 #define REVERT 1               /* Revert to this signals original value. */
 #define IGNORE 2               /* Ignore this signal. */
 
-extern int interactive;
+extern int posixly_correct;
 
 int
 trap_builtin (list)
      WORD_LIST *list;
 {
 
 int
 trap_builtin (list)
      WORD_LIST *list;
 {
-  int list_signal_names, display, result, opt;
+  int list_signal_names, display, result, opt, first_signal;
 
   list_signal_names = display = 0;
   result = EXECUTION_SUCCESS;
 
   list_signal_names = display = 0;
   result = EXECUTION_SUCCESS;
@@ -104,6 +109,8 @@ trap_builtin (list)
     }
   list = loptend;
 
     }
   list = loptend;
 
+  opt = DSIG_NOCASE|DSIG_SIGPREFIX;    /* flags for decode_signal */
+
   if (list_signal_names)
     return (display_signal_list ((WORD_LIST *)NULL, 1));
   else if (display || list == 0)
   if (list_signal_names)
     return (display_signal_list ((WORD_LIST *)NULL, 1));
   else if (display || list == 0)
@@ -111,16 +118,31 @@ trap_builtin (list)
   else
     {
       char *first_arg;
   else
     {
       char *first_arg;
-      int operation, sig;
+      int operation, sig, first_signal;
 
       operation = SET;
       first_arg = list->word->word;
 
       operation = SET;
       first_arg = list->word->word;
-      if (first_arg && *first_arg && signal_object_p (first_arg))
+      first_signal = first_arg && *first_arg && all_digits (first_arg) && signal_object_p (first_arg, opt);
+
+      /* Backwards compatibility */
+      if (first_signal)
+       operation = REVERT;
+      /* When in posix mode, the historical behavior of looking for a
+        missing first argument is disabled.  To revert to the original
+        signal handling disposition, use `-' as the first argument. */
+      else if (posixly_correct == 0 && first_arg && *first_arg &&
+               (*first_arg != '-' || first_arg[1]) &&
+               signal_object_p (first_arg, opt) && list->next == 0)
        operation = REVERT;
       else
        {
          list = list->next;
        operation = REVERT;
       else
        {
          list = list->next;
-         if (*first_arg == '\0')
+         if (list == 0)
+           {
+             builtin_usage ();
+             return (EX_USAGE);
+           }
+         else if (*first_arg == '\0')
            operation = IGNORE;
          else if (first_arg[0] == '-' && !first_arg[1])
            operation = REVERT;
            operation = IGNORE;
          else if (first_arg[0] == '-' && !first_arg[1])
            operation = REVERT;
@@ -128,12 +150,11 @@ trap_builtin (list)
 
       while (list)
        {
 
       while (list)
        {
-         sig = decode_signal (list->word->word);
+         sig = decode_signal (list->word->word, opt);
 
          if (sig == NO_SIG)
            {
 
          if (sig == NO_SIG)
            {
-             builtin_error ("%s: not a signal specification",
-                            list->word->word);
+             sh_invalidsig (list->word->word);
              result = EXECUTION_FAILURE;
            }
          else
              result = EXECUTION_FAILURE;
            }
          else
@@ -190,17 +211,29 @@ static void
 showtrap (i)
      int i;
 {
 showtrap (i)
      int i;
 {
-  char *t, *p;
+  char *t, *p, *sn;
 
   p = trap_list[i];
 
   p = trap_list[i];
-
   if (p == (char *)DEFAULT_SIG)
     return;
 
   if (p == (char *)DEFAULT_SIG)
     return;
 
-  t = (p == (char *)IGNORE_SIG) ? (char *)NULL : single_quote (p);
-  printf ("trap -- %s %s\n", t ? t : "''", signal_name (i));
-  if (t)
-    free (t);
+  t = (p == (char *)IGNORE_SIG) ? (char *)NULL : sh_single_quote (p);
+  sn = signal_name (i);
+  /* Make sure that signals whose names are unknown (for whatever reason)
+     are printed as signal numbers. */
+  if (STREQN (sn, "SIGJUNK", 7) || STREQN (sn, "unknown", 7))
+    printf ("trap -- %s %d\n", t ? t : "''", i);
+  else if (posixly_correct)
+    {
+      if (STREQN (sn, "SIG", 3))
+       printf ("trap -- %s %s\n", t ? t : "''", sn+3);
+      else
+       printf ("trap -- %s %s\n", t ? t : "''", sn);
+    }
+  else
+    printf ("trap -- %s %s\n", t ? t : "''", sn);
+
+  FREE (t);
 }
 
 static int
 }
 
 static int
@@ -211,18 +244,18 @@ display_traps (list)
 
   if (list == 0)
     {
 
   if (list == 0)
     {
-      for (i = 0; i <NSIG; i++)
+      for (i = 0; i < BASH_NSIG; i++)
        showtrap (i);
       return (EXECUTION_SUCCESS);
     }
 
   for (result = EXECUTION_SUCCESS; list; list = list->next)
     {
        showtrap (i);
       return (EXECUTION_SUCCESS);
     }
 
   for (result = EXECUTION_SUCCESS; list; list = list->next)
     {
-      i = decode_signal (list->word->word);
+      i = decode_signal (list->word->word, DSIG_NOCASE|DSIG_SIGPREFIX);
       if (i == NO_SIG)
        {
       if (i == NO_SIG)
        {
+         sh_invalidsig (list->word->word);
          result = EXECUTION_FAILURE;
          result = EXECUTION_FAILURE;
-         builtin_error ("%s: not a signal specification", list->word->word);
        }
       else
        showtrap (i);
        }
       else
        showtrap (i);