/* suspend.c, created from suspend.def. */ #line 22 "./suspend.def" #line 38 "./suspend.def" #include #if defined (JOB_CONTROL) #if defined (HAVE_UNISTD_H) # ifdef _MINIX # include # endif # include #endif #include "../bashtypes.h" #include #include "../bashintl.h" #include "../shell.h" #include "../jobs.h" #include "common.h" #include "bashgetopt.h" static sighandler suspend_continue __P((int)); static SigHandler *old_cont; #if 0 static SigHandler *old_stop; #endif /* Continue handler. */ static sighandler suspend_continue (sig) int sig; { set_signal_handler (SIGCONT, old_cont); #if 0 set_signal_handler (SIGSTOP, old_stop); #endif SIGRETURN (0); } /* Suspending the shell. If -f is the arg, then do the suspend no matter what. Otherwise, complain if a login shell. */ int suspend_builtin (list) WORD_LIST *list; { int opt, force; reset_internal_getopt (); force = 0; while ((opt = internal_getopt (list, "f")) != -1) switch (opt) { case 'f': force++; break; default: builtin_usage (); return (EX_USAGE); } list = loptend; if (job_control == 0) { sh_nojobs (_("cannot suspend")); return (EXECUTION_FAILURE); } if (force == 0) { no_args (list); if (login_shell) { builtin_error (_("cannot suspend a login shell")); return (EXECUTION_FAILURE); } } /* XXX - should we put ourselves back into the original pgrp now? If so, call end_job_control() here and do the right thing in suspend_continue (that is, call restart_job_control()). */ old_cont = (SigHandler *)set_signal_handler (SIGCONT, suspend_continue); #if 0 old_stop = (SigHandler *)set_signal_handler (SIGSTOP, SIG_DFL); #endif killpg (shell_pgrp, SIGSTOP); return (EXECUTION_SUCCESS); } #endif /* JOB_CONTROL */