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

@ -37,10 +37,6 @@ const struct shtable2 shtab_aliases[] =
"integer", NV_NOFREE|BLT_DCL, "typeset -li",
"nameref", NV_NOFREE|BLT_DCL, "typeset -n",
"r", NV_NOFREE, "hist -s",
#ifdef SIGTSTP
"stop", NV_NOFREE, "kill -s STOP",
"suspend", NV_NOFREE, "kill -s STOP $$",
#endif /*SIGTSTP */
"", 0, (char*)0
};

View file

@ -109,6 +109,10 @@ const struct shtable3 shtab_builtins[] =
"/bin/kill", NV_BLTIN|BLT_ENV, bltin(kill),
# endif /* SIGTSTP */
"jobs", NV_BLTIN|BLT_ENV, bltin(jobs),
# ifdef SIGSTOP
"stop", NV_BLTIN|BLT_ENV, bltin(kill),
"suspend", NV_BLTIN|BLT_ENV, bltin(suspend),
# endif /* SIGSTOP */
#endif /* JOBS */
"false", NV_BLTIN|BLT_ENV, bltin(false),
"getopts", NV_BLTIN|BLT_ENV, bltin(getopts),
@ -1060,6 +1064,42 @@ _JOB_
"[+SEE ALSO?\bps\b(1), \bjobs\b(1), \bkill\b(2), \bsignal\b(2)]"
;
#if defined(JOBS) && defined(SIGSTOP)
const char sh_optstop[] =
"[-1c?\n@(#)$Id: stop (ksh93) 2020-06-22 $\n]"
"[+NAME?stop - suspend a process]"
"[+DESCRIPTION?\bstop\b sends a \bSIGSTOP\b signal to one or more processes "
"specified by \ajob\a, suspending them until they receive \bSIGCONT\b.]"
_JOB_
"\n"
"\njob ...\n"
"\n"
"[+EXIT STATUS?]{"
"[+0?At least one matching process was found for each \ajob\a "
"operand, and \bSIGSTOP\b was successfully sent to at least one "
"matching process.]"
"[+>0?An error occurred.]"
"}"
"[+SEE ALSO?\bkill\b(1)]"
;
const char sh_optsuspend[] =
"[-1c?\n@(#)$Id: suspend (ksh93) 2020-06-22 $\n]"
"[+NAME?suspend - stop the shell]"
"[+DESCRIPTION?\bsuspend\b sends a \bSIGSTOP\b signal to the main shell "
"process, suspending the script or child shell session until it "
"receives \bSIGCONT\b (for instance, when typing \bfg\b in the "
"parent shell).]"
"[+?\bsuspend\b is equivalent to \bkill -s STOP \"$$\"\b, except that "
"it accepts no operands and refuses to suspend a login shell.]"
"[+EXIT STATUS?]{"
"[+0?The shell was successfully suspended and continued.]"
"[+>0?An error occurred.]"
"}"
"[+SEE ALSO?\bkill\b(1)]"
;
#endif /* defined(JOBS) && defined(SIGSTOP) */
const char sh_optlet[] =
"[-1c?@(#)$Id: let (AT&T Research) 2000-04-02 $\n]"
USAGE_LICENSE

View file

@ -53,6 +53,7 @@ const char e_option[] = "%s: bad option(s)";
const char e_toomany[] = "open file limit exceeded";
const char e_argtype[] = "invalid argument of type %c";
const char e_oneoperand[] = "one operand expected";
const char e_toomanyops[] = "too many operands";
const char e_formspec[] = "%c: unknown format specifier";
const char e_badregexp[] = "%s: invalid regular expression";
const char e_number[] = "%s: bad number";