Dan Pasanen | c6e3786 | 2014-10-02 14:08:59 -0500 | [diff] [blame] | 1 | /* suspend.c, created from suspend.def. */ |
| 2 | #line 22 "./suspend.def" |
| 3 | |
| 4 | #line 38 "./suspend.def" |
| 5 | |
| 6 | #include <config.h> |
| 7 | |
| 8 | #if defined (JOB_CONTROL) |
| 9 | #if defined (HAVE_UNISTD_H) |
| 10 | # ifdef _MINIX |
| 11 | # include <sys/types.h> |
| 12 | # endif |
| 13 | # include <unistd.h> |
| 14 | #endif |
| 15 | |
| 16 | #include "../bashtypes.h" |
| 17 | #include <signal.h> |
| 18 | #include "../bashintl.h" |
| 19 | #include "../shell.h" |
| 20 | #include "../jobs.h" |
| 21 | #include "common.h" |
| 22 | #include "bashgetopt.h" |
| 23 | |
| 24 | static sighandler suspend_continue __P((int)); |
| 25 | |
| 26 | static SigHandler *old_cont; |
| 27 | #if 0 |
| 28 | static SigHandler *old_stop; |
| 29 | #endif |
| 30 | |
| 31 | /* Continue handler. */ |
| 32 | static sighandler |
| 33 | suspend_continue (sig) |
| 34 | int sig; |
| 35 | { |
| 36 | set_signal_handler (SIGCONT, old_cont); |
| 37 | #if 0 |
| 38 | set_signal_handler (SIGSTOP, old_stop); |
| 39 | #endif |
| 40 | SIGRETURN (0); |
| 41 | } |
| 42 | |
| 43 | /* Suspending the shell. If -f is the arg, then do the suspend |
| 44 | no matter what. Otherwise, complain if a login shell. */ |
| 45 | int |
| 46 | suspend_builtin (list) |
| 47 | WORD_LIST *list; |
| 48 | { |
| 49 | int opt, force; |
| 50 | |
| 51 | reset_internal_getopt (); |
| 52 | force = 0; |
| 53 | while ((opt = internal_getopt (list, "f")) != -1) |
| 54 | switch (opt) |
| 55 | { |
| 56 | case 'f': |
| 57 | force++; |
| 58 | break; |
| 59 | default: |
| 60 | builtin_usage (); |
| 61 | return (EX_USAGE); |
| 62 | } |
| 63 | |
| 64 | list = loptend; |
| 65 | |
| 66 | if (job_control == 0) |
| 67 | { |
| 68 | sh_nojobs (_("cannot suspend")); |
| 69 | return (EXECUTION_FAILURE); |
| 70 | } |
| 71 | |
| 72 | if (force == 0) |
| 73 | { |
| 74 | no_args (list); |
| 75 | |
| 76 | if (login_shell) |
| 77 | { |
| 78 | builtin_error (_("cannot suspend a login shell")); |
| 79 | return (EXECUTION_FAILURE); |
| 80 | } |
| 81 | } |
| 82 | |
| 83 | /* XXX - should we put ourselves back into the original pgrp now? If so, |
| 84 | call end_job_control() here and do the right thing in suspend_continue |
| 85 | (that is, call restart_job_control()). */ |
| 86 | old_cont = (SigHandler *)set_signal_handler (SIGCONT, suspend_continue); |
| 87 | #if 0 |
| 88 | old_stop = (SigHandler *)set_signal_handler (SIGSTOP, SIG_DFL); |
| 89 | #endif |
| 90 | killpg (shell_pgrp, SIGSTOP); |
| 91 | return (EXECUTION_SUCCESS); |
| 92 | } |
| 93 | |
| 94 | #endif /* JOB_CONTROL */ |