more of this:

• shell flags are now handled in one single place (sh_flags.h)
• sync comments (between enum and array) and manpage with reality
• FMONITOR is now no longer needed for Hartz IV shells
This commit is contained in:
tg 2009-09-20 16:40:58 +00:00
parent 0cf2df79e9
commit 588921333e
7 changed files with 205 additions and 128 deletions

8
exec.c
View File

@ -22,7 +22,7 @@
#include "sh.h"
__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.64 2009/08/28 20:30:55 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.65 2009/09/20 16:40:55 tg Exp $");
static int comexec(struct op *, struct tbl *volatile, const char **,
int volatile, volatile int *);
@ -671,7 +671,11 @@ comexec(struct op *t, struct tbl *volatile tp, const char **ap,
if (flags&XEXEC) {
j_exit();
if (!(flags&XBGND) || Flag(FMONITOR)) {
if (!(flags&XBGND)
#ifndef MKSH_UNEMPLOYED
|| Flag(FMONITOR)
#endif
) {
setexecsig(&sigtraps[SIGINT], SS_RESTORE_ORIG);
setexecsig(&sigtraps[SIGQUIT], SS_RESTORE_ORIG);
}

32
jobs.c
View File

@ -22,7 +22,7 @@
#include "sh.h"
__RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.59 2009/08/01 20:32:44 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/jobs.c,v 1.60 2009/09/20 16:40:55 tg Exp $");
#if HAVE_KILLPG
#define mksh_killpg killpg
@ -157,9 +157,9 @@ j_init(void)
{
#ifndef MKSH_UNEMPLOYED
bool mflagset = Flag(FMONITOR) != 127;
#endif
Flag(FMONITOR) = 0;
#endif
(void)sigemptyset(&sm_default);
sigprocmask(SIG_SETMASK, &sm_default, NULL);
@ -464,7 +464,11 @@ exchild(struct op *t, int flags,
if (Flag(FBGNICE) && (flags & XBGND))
(void)nice(4);
#endif
if ((flags & XBGND) && !Flag(FMONITOR)) {
if ((flags & XBGND)
#ifndef MKSH_UNEMPLOYED
&& !Flag(FMONITOR)
#endif
) {
setsig(&sigtraps[SIGINT], SIG_IGN,
SS_RESTORE_IGN|SS_FORCE);
setsig(&sigtraps[SIGQUIT], SIG_IGN,
@ -970,7 +974,9 @@ j_waitj(Job *j,
if (flags & JW_ASYNCNOTIFY)
j->flags |= JF_W_ASYNCNOTIFY;
#ifndef MKSH_UNEMPLOYED
if (!Flag(FMONITOR))
#endif
flags |= JW_STOPPEDWAIT;
while (j->state == PRUNNING ||
@ -1068,13 +1074,19 @@ j_waitj(Job *j,
j_systime = j->systime;
rv = j->status;
if (!(flags & JW_ASYNCNOTIFY) &&
(!Flag(FMONITOR) || j->state != PSTOPPED)) {
if (!(flags & JW_ASYNCNOTIFY)
#ifndef MKSH_UNEMPLOYED
&& (!Flag(FMONITOR) || j->state != PSTOPPED)
#endif
) {
j_print(j, JP_SHORT, shl_out);
shf_flush(shl_out);
}
if (j->state != PSTOPPED &&
(!Flag(FMONITOR) || !(flags & JW_ASYNCNOTIFY)))
if (j->state != PSTOPPED
#ifndef MKSH_UNEMPLOYED
&& (!Flag(FMONITOR) || !(flags & JW_ASYNCNOTIFY))
#endif
)
remove_job(j, where);
return (rv);
@ -1249,7 +1261,11 @@ check_job(Job *j)
}
}
#endif
if (!Flag(FMONITOR) && !(j->flags & (JF_WAITING|JF_FG)) &&
if (
#ifndef MKSH_UNEMPLOYED
!Flag(FMONITOR) &&
#endif
!(j->flags & (JF_WAITING|JF_FG)) &&
j->state != PSTOPPED) {
if (j == async_job || (j->flags & JF_KNOWN)) {
j->flags |= JF_ZOMBIE;

4
main.c
View File

@ -33,7 +33,7 @@
#include <locale.h>
#endif
__RCSID("$MirOS: src/bin/mksh/main.c,v 1.144 2009/09/06 17:42:13 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/main.c,v 1.145 2009/09/20 16:40:55 tg Exp $");
extern char **environ;
@ -287,7 +287,9 @@ main(int argc, const char *argv[])
#endif
/* this to note if monitor is set on command line (see below) */
#ifndef MKSH_UNEMPLOYED
Flag(FMONITOR) = 127;
#endif
argi = parse_args(argv, OF_CMDLINE, NULL);
if (argi < 0)
exit(1);

61
misc.c
View File

@ -29,7 +29,7 @@
#include <grp.h>
#endif
__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.122 2009/09/19 22:32:23 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.123 2009/09/20 16:40:56 tg Exp $");
#undef USE_CHVT
/* XXX conditions correct? */
@ -98,61 +98,12 @@ Xcheck_grow_(XString *xsp, const char *xp, unsigned int more)
return (xsp->beg + (xp - old_beg));
}
#define SHFLAGS_DEFNS
#include "sh_flags.h"
const struct shoption options[] = {
/* Special cases (see parse_args()): -A, -o, -s.
* Options are sorted by their longnames - the order of these
* entries MUST match the order of sh_flag F* enumerations in sh.h.
*/
{ "allexport", 'a', OF_ANY },
#if HAVE_ARC4RANDOM
{ "arc4random", 0, OF_ANY },
#endif
{ "braceexpand", 0, OF_ANY }, /* non-standard */
#if HAVE_NICE
{ "bgnice", 0, OF_ANY },
#endif
{ NULL, 'c', OF_CMDLINE },
{ "emacs", 0, OF_ANY },
{ "errexit", 'e', OF_ANY },
{ "gmacs", 0, OF_ANY },
{ "ignoreeof", 0, OF_ANY },
{ "interactive", 'i', OF_CMDLINE },
{ "keyword", 'k', OF_ANY },
{ "login", 'l', OF_CMDLINE },
{ "markdirs", 'X', OF_ANY },
#ifndef MKSH_UNEMPLOYED
{ "monitor", 'm', OF_ANY },
#else
{ NULL, 'm', 0 }, /* needed */
#endif
{ "noclobber", 'C', OF_ANY },
{ "noexec", 'n', OF_ANY },
{ "noglob", 'f', OF_ANY },
{ "nohup", 0, OF_ANY },
{ "nolog", 0, OF_ANY }, /* no effect */
#ifndef MKSH_UNEMPLOYED
{ "notify", 'b', OF_ANY },
#endif
{ "nounset", 'u', OF_ANY },
{ "physical", 0, OF_ANY }, /* non-standard */
{ "posix", 0, OF_ANY }, /* non-standard */
{ "privileged", 'p', OF_ANY },
{ "restricted", 'r', OF_CMDLINE },
{ "stdin", 's', OF_CMDLINE }, /* pseudo non-st.. */
{ "trackall", 'h', OF_ANY },
{ "utf8-mode", 'U', OF_ANY }, /* non-standard */
{ "verbose", 'v', OF_ANY },
#ifndef MKSH_NOVI
{ "vi", 0, OF_ANY },
{ "viraw", 0, OF_ANY }, /* no effect */
{ "vi-tabcomplete", 0, OF_ANY }, /* non-standard */
{ "vi-esccomplete", 0, OF_ANY }, /* non-standard */
#endif
{ "xtrace", 'x', OF_ANY },
/* Anonymous flags: used internally by shell only
* (not visible to user)
*/
{ NULL, 0, OF_INTERNAL }, /* FTALKING_I */
#define SHFLAGS_ITEMS
#include "sh_flags.h"
};
/*

34
mksh.1
View File

@ -1,4 +1,4 @@
.\" $MirOS: src/bin/mksh/mksh.1,v 1.189 2009/09/20 12:12:00 tg Exp $
.\" $MirOS: src/bin/mksh/mksh.1,v 1.190 2009/09/20 16:40:56 tg Exp $
.\" $OpenBSD: ksh.1,v 1.129 2009/05/28 06:09:06 jmc Exp $
.\"-
.\" Copyright © 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
@ -3561,7 +3561,7 @@ scripts, while the original Korn shell only treats profiles as
scripts.
.Pp
.It Xo
.Ic set Op Ic +\-abCefhkmnpsuvXx
.Ic set Op Ic +\-abCefhiklmnprsUuvXx
.Op Ic +\-o Ar option
.Op Ic +\-A Ar name
.Op Fl \-
@ -3654,8 +3654,16 @@ Create tracked aliases for all executed commands (see
.Sx Aliases
above).
Enabled by default for non-interactive shells.
.It Fl i \*(Ba Ic interactive
The shell is an interactive shell.
This option can only be used when the shell is invoked.
See above for a description of what this means.
.It Fl k \*(Ba Ic keyword
Parameter assignments are recognised anywhere in a command.
.It Fl l \*(Ba Ic login
The shell is a login shell.
This option can only be used when the shell is invoked.
See above for a description of what this means.
.It Fl m \*(Ba Ic monitor
Enable job control (default for interactive shells).
.It Fl n \*(Ba Ic noexec
@ -3668,6 +3676,10 @@ It is set automatically if, when the shell starts,
the real UID or GID does not match
the effective UID (EUID) or GID (EGID), respectively.
See above for a description of what this means.
.It Fl r \*(Ba Ic restricted
The shell is a restricted shell.
This option can only be used when the shell is invoked.
See above for a description of what this means.
.It Fl s \*(Ba Ic stdin
If used when the shell is invoked, commands are read from standard input.
Set automatically if the shell is invoked with no arguments.
@ -3754,19 +3766,11 @@ must be used.
To avoid infinite loops, the shell will exit if
.Dv EOF
is read 13 times in a row.
.It Ic interactive
The shell is an interactive shell.
This option can only be used when the shell is invoked.
See above for a description of what this means.
.It Ic login
The shell is a login shell.
This option can only be used when the shell is invoked.
See above for a description of what this means.
.It Ic nohup
Do not kill running jobs with a
.Dv SIGHUP
signal when a login shell exits.
Currently set by default, but this will
Currently set by default, but this may
change in the future to be compatible with
.At
.Nm ksh ,
@ -3812,10 +3816,6 @@ and this autodetection feature was requested at compilation time.
As a side effect, setting this flag turns off
.Ic braceexpand
mode, which can be turned back on manually.
.It Ic restricted
The shell is a restricted shell.
This option can only be used when the shell is invoked.
See above for a description of what this means.
.It Ic vi
Enable
.Xr vi 1 Ns -like
@ -3856,9 +3856,9 @@ If no options or arguments are given, the values of all names are printed.
For unknown historical reasons, a lone
.Ql \-
option is treated specially \*(en it clears both the
.Fl x
and
.Fl v
and
.Fl x
options.
.Pp
.It Ic shift Op Ar number

49
sh.h
View File

@ -134,7 +134,7 @@
#endif
#ifdef EXTERN
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.344 2009/09/20 13:08:11 tg Exp $");
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.345 2009/09/20 16:40:57 tg Exp $");
#endif
#define MKSH_VERSION "R39 2009/09/19"
@ -548,54 +548,13 @@ extern const struct shoption options[];
* flags (the order of these enums MUST match the order in misc.c(options[]))
*/
enum sh_flag {
FEXPORT = 0, /* -a: export all */
#if HAVE_ARC4RANDOM
FARC4RANDOM, /* use 0:rand(3) 1:arc4random(3) 2:switch on write */
#endif
FBRACEEXPAND, /* enable {} globbing */
#if HAVE_NICE
FBGNICE, /* bgnice */
#endif
FCOMMAND, /* -c: (invocation) execute specified command */
FEMACS, /* emacs command editing */
FERREXIT, /* -e: quit on error */
FGMACS, /* gmacs command editing */
FIGNOREEOF, /* eof does not exit */
FTALKING, /* -i: interactive */
FKEYWORD, /* -k: name=value anywhere */
FLOGIN, /* -l: a login shell */
FMARKDIRS, /* mark dirs with / in file name completion */
FMONITOR, /* -m: job control monitoring */
FNOCLOBBER, /* -C: don't overwrite existing files */
FNOEXEC, /* -n: don't execute any commands */
FNOGLOB, /* -f: don't do file globbing */
FNOHUP, /* -H: don't kill running jobs when login shell exits */
FNOLOG, /* don't save functions in history (ignored) */
#ifndef MKSH_UNEMPLOYED
FNOTIFY, /* -b: asynchronous job completion notification */
#endif
FNOUNSET, /* -u: using an unset var is an error */
FPHYSICAL, /* -o physical: don't do logical cds/pwds */
FPOSIX, /* -o posix (try to be more compatible) */
FPRIVILEGED, /* -p: use suid_profile */
FRESTRICTED, /* -r: restricted shell */
FSTDIN, /* -s: (invocation) parse stdin */
FTRACKALL, /* -h: create tracked aliases for all commands */
FUTFMODE, /* -U: enable utf-8 processing */
FVERBOSE, /* -v: echo input */
#ifndef MKSH_NOVI
FVI, /* vi command editing */
FVIRAW, /* always read in raw mode (ignored) */
FVITABCOMPLETE, /* enable tab as file name completion char */
FVIESCCOMPLETE, /* enable ESC as file name completion in command mode */
#endif
FXTRACE, /* -x: execution trace */
FTALKING_I, /* (internal): initial shell was interactive */
#define SHFLAGS_ENUMS
#include "sh_flags.h"
FNFLAGS /* (place holder: how many flags are there) */
};
#define Flag(f) (shell_flags[(int)(f)])
#define UTFMODE Flag(FUTFMODE)
#define UTFMODE Flag(FUNICODE)
EXTERN unsigned char shell_flags[FNFLAGS];

145
sh_flags.h Normal file
View File

@ -0,0 +1,145 @@
#if defined(SHFLAGS_DEFNS)
__RCSID("$MirOS: src/bin/mksh/sh_flags.h,v 1.1 2009/09/20 16:40:58 tg Exp $");
#define FN(sname,cname,ochar,flags) /* nothing */
#elif defined(SHFLAGS_ENUMS)
#define FN(sname,cname,ochar,flags) cname,
#define F0(sname,cname,ochar,flags) cname = 0,
#elif defined(SHFLAGS_ITEMS)
#define FN(sname,cname,ochar,flags) { sname, ochar, flags },
#endif
#ifndef F0
#define F0 FN
#endif
/*
* special cases (see parse_args()): -A, -o, -s
*
* options are sorted by their longnames
*/
/* -a all new parameters are created with the export attribute */
F0("allexport", FEXPORT, 'a', OF_ANY)
#if HAVE_ARC4RANDOM
/* ./. for $RANDOM (non-standard), use the following function scheme: */
/* 0:rand(3) 1:arc4random(3) 2:switch from 1 to 0 on write */
FN("arc4random", FARC4RANDOM, 0, OF_ANY)
#endif
#if HAVE_NICE
/* ./. bgnice */
FN("bgnice", FBGNICE, 0, OF_ANY)
#endif
/* ./. enable {} globbing (non-standard) */
FN("braceexpand", FBRACEEXPAND, 0, OF_ANY)
/* ./. Emacs command line editing mode */
FN("emacs", FEMACS, 0, OF_ANY)
/* -e quit on error */
FN("errexit", FERREXIT, 'e', OF_ANY)
/* ./. Emacs command line editing mode, gmacs variant */
FN("gmacs", FGMACS, 0, OF_ANY)
/* ./. reading EOF does not exit */
FN("ignoreeof", FIGNOREEOF, 0, OF_ANY)
/* -i interactive shell */
FN("interactive", FTALKING, 'i', OF_CMDLINE)
/* -k name=value are recognised anywhere */
FN("keyword", FKEYWORD, 'k', OF_ANY)
/* -l login shell */
FN("login", FLOGIN, 'l', OF_CMDLINE)
/* -X mark dirs with / in file name completion */
FN("markdirs", FMARKDIRS, 'X', OF_ANY)
#ifndef MKSH_UNEMPLOYED
/* -m job control monitoring */
FN("monitor", FMONITOR, 'm', OF_ANY)
#endif
/* -C don't overwrite existing files */
FN("noclobber", FNOCLOBBER, 'C', OF_ANY)
/* -n don't execute any commands */
FN("noexec", FNOEXEC, 'n', OF_ANY)
/* -f don't do file globbing */
FN("noglob", FNOGLOB, 'f', OF_ANY)
/* ./. don't kill running jobs when login shell exits */
FN("nohup", FNOHUP, 0, OF_ANY)
/* ./. don't save functions in history (no effect) */
FN("nolog", FNOLOG, 0, OF_ANY)
#ifndef MKSH_UNEMPLOYED
/* -b asynchronous job completion notification */
FN("notify", FNOTIFY, 'b', OF_ANY)
#endif
/* -u using an unset variable is an error */
FN("nounset", FNOUNSET, 'u', OF_ANY)
/* ./. don't do logical cds/pwds (non-standard) */
FN("physical", FPHYSICAL, 0, OF_ANY)
/* ./. mock POSIX mode (try to be more compatible; non-standard) */
FN("posix", FPOSIX, 0, OF_ANY)
/* -p use suid_profile; privileged shell */
FN("privileged", FPRIVILEGED, 'p', OF_ANY)
/* -r restricted shell */
FN("restricted", FRESTRICTED, 'r', OF_CMDLINE)
/* -s (invocation) parse stdin (pseudo non-standard) */
FN("stdin", FSTDIN, 's', OF_CMDLINE)
/* -h create tracked aliases for all commands */
FN("trackall", FTRACKALL, 'h', OF_ANY)
/* -U enable UTF-8 processing (non-standard) */
FN("utf8-mode", FUNICODE, 'U', OF_ANY)
/* -v echo input */
FN("verbose", FVERBOSE, 'v', OF_ANY)
#ifndef MKSH_NOVI
/* ./. Vi command line editing mode */
FN("vi", FVI, 0, OF_ANY)
/* ./. enable ESC as file name completion character (non-standard) */
FN("vi-esccomplete", FVIESCCOMPLETE, 0, OF_ANY)
/* ./. enable Tab as file name completion character (non-standard) */
FN("vi-tabcomplete", FVITABCOMPLETE, 0, OF_ANY)
/* ./. always read in raw mode (no effect) */
FN("viraw", FVIRAW, 0, OF_ANY)
#endif
/* -x execution trace (display commands as they are run) */
FN("xtrace", FXTRACE, 'x', OF_ANY)
/* -c (invocation) execute specified command */
FN(NULL, FCOMMAND, 'c', OF_CMDLINE)
/*
* anonymous flags: used internally by shell only (not visible to user)
*/
/* ./. (internal) initial shell was interactive */
FN(NULL, FTALKING_I, 0, OF_INTERNAL)
#undef FN
#undef F0
#undef SHFLAGS_DEFNS
#undef SHFLAGS_ENUMS
#undef SHFLAGS_ITEMS