diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | signal.c | 127 |
2 files changed, 78 insertions, 59 deletions
@@ -1,3 +1,10 @@ +Fri Jun 15 22:33:55 2007 Tanaka Akira <akr@fsij.org> + + * signal.c (default_handler): func argument removed. + (trap_handler): support SYSTEM_DEFAULT. call default_handler + internally. + (sig_trap): don't call default_handler. + Fri Jun 15 22:33:29 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> * common.mk (realclean): separate local and ext. @@ -6,7 +13,8 @@ Fri Jun 15 22:33:29 2007 Nobuyoshi Nakada <nobu@ruby-lang.org> Fri Jun 15 20:50:02 2007 Tanaka Akira <akr@fsij.org> - * keywords: enclose C code in declaration section by %{ and %}. + * keywords: enclose C code in declaration section by %{ and %} to + avoid extra semicolon after #ifdef RIPPER. Fri Jun 15 18:56:52 2007 Tanaka Akira <akr@fsij.org> @@ -634,13 +634,62 @@ struct trap_arg { VALUE cmd; }; +static sighandler_t +default_handler(int sig) +{ + sighandler_t func; + switch (sig) { + case SIGINT: +#ifdef SIGHUP + case SIGHUP: +#endif +#ifdef SIGQUIT + case SIGQUIT: +#endif +#ifdef SIGTERM + case SIGTERM: +#endif +#ifdef SIGALRM + case SIGALRM: +#endif +#ifdef SIGUSR1 + case SIGUSR1: +#endif +#ifdef SIGUSR2 + case SIGUSR2: +#endif + func = sighandler; + break; +#ifdef SIGBUS + case SIGBUS: + func = sigbus; + break; +#endif +#ifdef SIGSEGV + case SIGSEGV: + func = sigsegv; + break; +#endif +#ifdef SIGPIPE + case SIGPIPE: + func = sigpipe; + break; +#endif + default: + func = SIG_DFL; + break; + } + + return func; +} + static RETSIGTYPE wrong_trap(int sig) { } static sighandler_t -trap_handler(VALUE *cmd) +trap_handler(VALUE *cmd, int sig) { sighandler_t func = wrong_trap; VALUE command; @@ -654,22 +703,32 @@ trap_handler(VALUE *cmd) SafeStringValue(command); /* taint check */ switch (RSTRING_LEN(command)) { case 0: - func = SIG_IGN; + goto sig_ign; break; + case 14: + if (strncmp(RSTRING_PTR(command), "SYSTEM_DEFAULT", 14) == 0) { + func = SIG_DFL; + *cmd = 0; + } + break; case 7: if (strncmp(RSTRING_PTR(command), "SIG_IGN", 7) == 0) { - func = SIG_IGN; +sig_ign: + func = SIG_IGN; + *cmd = 0; } else if (strncmp(RSTRING_PTR(command), "SIG_DFL", 7) == 0) { - func = SIG_DFL; +sig_dfl: + func = default_handler(sig); + *cmd = 0; } else if (strncmp(RSTRING_PTR(command), "DEFAULT", 7) == 0) { - func = SIG_DFL; + goto sig_dfl; } break; case 6: if (strncmp(RSTRING_PTR(command), "IGNORE", 6) == 0) { - func = SIG_IGN; + goto sig_ign; } break; case 4: @@ -689,9 +748,6 @@ trap_handler(VALUE *cmd) func = sighandler; } } - if (func == SIG_IGN || func == SIG_DFL) { - *cmd = 0; - } return func; } @@ -734,53 +790,6 @@ trap_signm(VALUE vsig) return sig; } -static sighandler_t -default_handler(sighandler_t func, int sig) -{ - if (func == SIG_DFL) { - switch (sig) { - case SIGINT: -#ifdef SIGHUP - case SIGHUP: -#endif -#ifdef SIGQUIT - case SIGQUIT: -#endif -#ifdef SIGTERM - case SIGTERM: -#endif -#ifdef SIGALRM - case SIGALRM: -#endif -#ifdef SIGUSR1 - case SIGUSR1: -#endif -#ifdef SIGUSR2 - case SIGUSR2: -#endif - func = sighandler; - break; -#ifdef SIGBUS - case SIGBUS: - func = sigbus; - break; -#endif -#ifdef SIGSEGV - case SIGSEGV: - func = sigsegv; - break; -#endif -#ifdef SIGPIPE - case SIGPIPE: - func = sigpipe; - break; -#endif - } - } - - return func; -} - static VALUE trap(struct trap_arg *arg) { @@ -851,10 +860,12 @@ rb_trap_restore_mask(void) * signal name. The command or block specifies code to be run when the * signal is raised. If the command is the string ``IGNORE'' or * ``SIG_IGN'', the signal will be ignored. If the command is - * ``DEFAULT'' or ``SIG_DFL'', the operating system's default handler + * ``DEFAULT'' or ``SIG_DFL'', the Ruby's default handler * will be invoked. If the command is ``EXIT'', the script will be * terminated by the signal. Otherwise, the given command or block * will be run. + * If the command is ``SYSTEM_DEFAULT'', the operating system's default + * handler will be invoked. * The special signal name ``EXIT'' or signal number zero will be * invoked just prior to program termination. * trap returns the previous handler for the given signal. @@ -885,7 +896,7 @@ sig_trap(int argc, VALUE *argv) } else if (argc == 2) { arg.cmd = argv[1]; - arg.func = default_handler(trap_handler(&arg.cmd), arg.sig); + arg.func = trap_handler(&arg.cmd, arg.sig); } if (OBJ_TAINTED(arg.cmd)) { |