mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
Make 'stop' and 'suspend' regular built-ins
The 'stop' and 'suspend' default aliases are now converted into regular built-in commands so that 'unalias -a' does not remove them, 'suspend' can do some sanity checks, and something like cmd=stop; $cmd $! will now work. src/cmd/ksh93/bltins/trap.c: - b_kill(): Incorporate 'stop' functionality, which is simply setting the same flag and variable as '-s STOP' would have done. - b_suspend(): Add simple builtin function that sends SIGSTOP to the main shell. Check for no operands, and refuse to suspend a login shell (which would leave the user stuck with no way out). Also check that 'kill' succeeds; if we're in an asynchronous subshell, it is possible the main shell no longer exists. src/cmd/ksh93/data/aliases.c: - Remove "stop" and "suspend" default aliases. (Why were these conditional upon SIGTSTP when they actually issued SIGSTOP?) src/cmd/ksh93/include/builtins.h, src/cmd/ksh93/data/builtins.c, src/cmd/ksh93/data/msg.c: - Add declarations of "stop" and "suspend" regular built-ins. - Add option strings (AST manual/--man pages) for them. - Add e_toomanyops ("too many operands") reusable error message for b_suspend(). Other new commands may want this at some point. src/cmd/ksh93/sh.1: - Remove "stop" and "suspend" default aliases. - Document "stop" and "suspend" regular built-in commands.
This commit is contained in:
parent
add82e1984
commit
3ba4900e9c
8 changed files with 108 additions and 11 deletions
|
@ -171,7 +171,16 @@ int b_kill(int argc,char *argv[],Shbltin_t *context)
|
|||
register Shell_t *shp = context->shp;
|
||||
int usemenu = 0;
|
||||
NOT_USED(argc);
|
||||
#if defined(JOBS) && defined(SIGSTOP)
|
||||
if(**argv == 's') /* <s>top == kill -s STOP */
|
||||
{
|
||||
flag |= S_FLAG;
|
||||
signame = "STOP";
|
||||
}
|
||||
while((n = optget(argv, **argv == 's' ? sh_optstop : sh_optkill))) switch(n)
|
||||
#else
|
||||
while((n = optget(argv,sh_optkill))) switch(n)
|
||||
#endif /* defined(JOBS) && defined(SIGSTOP) */
|
||||
{
|
||||
case ':':
|
||||
if((signame=argv[opt_info.index++]) && (sig=sig_number(shp,signame+1))>=0)
|
||||
|
@ -233,6 +242,25 @@ endopts:
|
|||
return(shp->exitval);
|
||||
}
|
||||
|
||||
#if defined(JOBS) && defined(SIGSTOP)
|
||||
/*
|
||||
* former default alias suspend='kill -s STOP $$'
|
||||
*/
|
||||
int b_suspend(int argc,char *argv[],Shbltin_t *context)
|
||||
{
|
||||
NOT_USED(argc);
|
||||
if(optget(argv, sh_optsuspend)) /* no options supported (except AST --man, etc.) */
|
||||
errormsg(SH_DICT, ERROR_exit(2), "%s", opt_info.arg);
|
||||
if(argv[opt_info.index]) /* no operands supported */
|
||||
errormsg(SH_DICT, ERROR_exit(2), e_toomanyops);
|
||||
if(sh_isoption(SH_LOGIN_SHELL))
|
||||
errormsg(SH_DICT, ERROR_exit(1), "cannot suspend a login shell");
|
||||
if(kill(context->shp->gd->pid, SIGSTOP) != 0)
|
||||
errormsg(SH_DICT, ERROR_exit(1), "could not signal main shell at PID %d", context->shp->gd->pid);
|
||||
return(0);
|
||||
}
|
||||
#endif /* defined(JOBS) && defined(SIGSTOP) */
|
||||
|
||||
/*
|
||||
* Given the name or number of a signal return the signal number
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue