1
0
Fork 0
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:
Martijn Dekker 2020-06-22 14:59:24 +02:00
parent add82e1984
commit 3ba4900e9c
8 changed files with 108 additions and 11 deletions

View file

@ -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
*/