diff options
| author | Byron Rakitzis <byron@archone.tamu.edu> | 1992-05-27 00:00:01 +0100 |
|---|---|---|
| committer | Toby Goodwin <toby@paccrat.org> | 2015-05-16 21:22:56 +0100 |
| commit | 26bb34cf036027dfa22dfae8d8fc2f6bfd6acb75 (patch) | |
| tree | 589705b2492ce4681760846d9ca45600f0af298d /main.c | |
release: rc-1.4
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 115 |
1 files changed, 115 insertions, 0 deletions
@@ -0,0 +1,115 @@ +/* main.c: handles initialization of rc and command line options */ + +#include "rc.h" + +bool dashdee, dashee, dashvee, dashex, dashell, dasheye, + dashen, dashpee, interactive; +int rc_pid; + +static bool dashoh; + +static void assigndefault(char *,...); +static void checkfd(int, enum redirtype); + +extern void main(int argc, char *argv[], char *envp[]) { + char *dashsee[2], *dollarzero, *null[1]; + int c; + initprint(); + dashsee[0] = dashsee[1] = NULL; + dollarzero = argv[0]; + rc_pid = getpid(); + dashell = (*argv[0] == '-'); /* Unix tradition */ + while ((c = rc_getopt(argc, argv, "nolpeivdxc:")) != -1) + switch (c) { + case 'l': + dashell = TRUE; + break; + case 'e': + dashee = TRUE; + break; + case 'i': + dasheye = interactive = TRUE; + break; + case 'v': + dashvee = TRUE; + break; + case 'x': + dashex = TRUE; + break; + case 'd': + dashdee = TRUE; + break; + case 'c': + dashsee[0] = rc_optarg; + goto quitopts; + case 'n': + dashen = TRUE; + break; + case 'p': + dashpee = TRUE; + break; + case 'o': + dashoh = TRUE; + break; + case '?': + exit(1); + } +quitopts: + argv += rc_optind; + /* use isatty() iff -i is not set, and iff the input is not from a script or -c flag */ + if (!dasheye && dashsee[0] == NULL && *argv == NULL) + interactive = isatty(0); + if (!dashoh) { + checkfd(0, rFrom); + checkfd(1, rCreate); + checkfd(2, rCreate); + } + initsignal(); + inithash(); + initparse(); + assigndefault("prompt", "; ", "", (void *)0); +#ifdef DEFAULTPATH + assigndefault("path", DEFAULTPATH, (void *)0); +#endif + assigndefault("ifs", " ", "\t", "\n", (void *)0); + assigndefault("pid", nprint("%d", rc_pid), (void *)0); + initenv(envp); + initinput(); + null[0] = NULL; + starassign(dollarzero, null, FALSE); /* assign $0 to $* */ + inithandler(); + if (dashsee[0] != NULL) { /* input from the -c flag? */ + if (*argv != NULL) + starassign(dollarzero, argv, FALSE); + pushstring(dashsee, TRUE); + } else if (*argv != NULL) { /* else from a file? */ + b_dot(--argv); + rc_exit(getstatus()); + } else { /* else stdin */ + pushfd(0); + } + dasheye = FALSE; + doit(TRUE); + rc_exit(getstatus()); +} + +static void assigndefault(char *name,...) { + va_list ap; + List *l; + char *v; + va_start(ap, name); + for (l = NULL; (v = va_arg(ap, char *)) != NULL;) + l = append(l, word(v, NULL)); + varassign(name, l, FALSE); + if (streq(name, "path")) + alias(name, l, FALSE); + va_end(ap); +} + +/* open an fd on /dev/null if it is inherited closed */ + +static void checkfd(int fd, enum redirtype r) { + int new = rc_open("/dev/null", r); + if (new != fd && new != -1) + close(new); +} |