sh.c revision 1de7ff79aa681dad1598edaf52be6493d01ff971
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Use is subject to license terms.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* All Rights Reserved */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Copyright (c) 1980 Regents of the University of California.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * All rights reserved. The Berkeley Software License Agreement
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * specifies the terms and conditions for redistribution.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#pragma ident "%Z%%M% %I% %E% SMI"
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* #include <sys/ioctl.h> */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * We use these csh(1) private versions of the select macros, (see select(3C))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * so as not to be limited by the size of struct fd_set (ie 1024).
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define CSH_FD_SET(n, p) ((*((p) + ((n)/NFDBITS))) |= (1 << ((n) % NFDBITS)))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define CSH_FD_CLR(n, p) ((*((p) + ((n)/NFDBITS))) &= ~(1 << ((n) % NFDBITS)))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define CSH_FD_ISSET(n, p) ((*((p) + ((n)/NFDBITS))) & (1 << ((n) % NFDBITS)))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtchar *pathlist[] = { S_usrbin /* "/usr/bin" */, S_DOT /* "." */, 0 };
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtchar *dumphist[] = { S_history /* "history" */, S_h /* "-h" */, 0, 0 };
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtchar *loadhist[] = { S_source /* "source" */, S_h /* "-h" */, S_NDOThistory /* "~/.history" */, 0 };
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshvoid srcunit(int, bool, bool);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbvoid initdesc(int, char *[]);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid initdesc_x(int, char *[], int);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid secpolicy_print(int, const char *);
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2easvoid phup(void);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Trace routines
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Initialize trace file.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Called from main.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * write message to trace file
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego fprintf(trace, fmt, a, b, c, d, e, f, g, h, i, j);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States tchar **v, *cp, *p, *q, *r;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int f;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States struct sigvec osv;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States struct sigaction sa;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States tchar s_prompt[MAXHOSTNAMELEN+3];
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States char *c_max_var_len;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int c_max_var_len_size;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States pfcshflag = 0;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /*
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * set up the error exit, if there is an error before
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * this is done, it will core dump, and we don't
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * tolerate core dumps
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * if were here, there was an error in the csh
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas * startup so just punt
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This is a profile shell if the simple name of argv[0] is
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * pfcsh or -pfcsh
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh /* Copy arguments */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * Initialize paraml list
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (eq(v[0], S_aout /* "a.out" */)) /* A.out's are quittable */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) time(&chktim);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Move the descriptors to safe places.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The variable didfds is 0 while we have only FSH* to work with.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * When didfds is true, we have 0,1,2 and prefer to use these.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Also, setup data for csh internal file descriptor book keeping.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Initialize the shell variables.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * ARGV and PROMPT are initialized later.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * STATUS is also munged in several places.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CHILD is munged when forking/waiting
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw c_max_var_len_size = snprintf(NULL, 0, "%ld", MAX_VAR_LEN);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) snprintf(c_max_var_len, (c_max_var_len_size + 1),
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* don't do globbing here, just set exact copies */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw dinit(cp = getenvs_("HOME")); /* dinit thinks that HOME==cwd in a */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* login shell */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States local_setenv(S_HOME, savestr(cp));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Grab other useful things from the environment.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Should we grab everything??
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If USER is not defined, set it here.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright local_setenv(S_USER, strtots((tchar *)0, pw->pw_name));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright else if (loginsh) { /* Give up setting USER variable. */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright printf("Warning: USER environment variable could not be set.\n");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Re-initialize path if set in environment
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* restore globbing until the user says otherwise */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Record the interrupt states from the parent process.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If the parent is non-interruptible our hand must be forced
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or we (and our children) won't be either.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Our children inherit termination from our parent.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * We catch it only if we are the login shell.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* parents interruptibility */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* parents terminability */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) signal(SIGHUP, phup); /* exit processing on HUP */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Process the arguments.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Note that processing of -v/-x is actually delayed till after
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * script processing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (c > 0 && (cp = v[0])[0] == '-' && *++cp != '\0' && !batch) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw do switch (*cp++) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (c == 1)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (quitit) /* With all due haste, for debugging */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Unless prevented by -c, -i, -s, or -t, if there
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * are remaining arguments the first of them is the name
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * of a shell file from which to read commands.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (!batch && (uid != geteuid() || getgid() != getegid())) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright Perror(S_csh /* "csh" */); /* ... doesn't return */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (nofile == 0 && c > 0) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright SHIN = dmove(nofile, FSHIN); /* Replace FSHIN */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Consider input a tty if it really is or we are interactive.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Decide whether we should play with signals or not.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * If we are explicitly told (via -i, or -) or we are a login
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * shell (arg0 starts with -) or the input and output are both
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * the ttys("csh", or "csh</dev/ttyx>/dev/ttyx")
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Note that in only the login shell is it likely that parent
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * may have set signals to be ignored
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (loginsh || intact || intty && isatty(SHOUT))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Save the remaining arguments in argv.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Set up the prompt.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw strcat_(s_prompt, uid == 0 ? S_SHARPSP /* "# " */ : S_PERSENTSP /* "% " */);
634e26ec75c89095090605284938356a3145f2b8Casper H.S. Dik * If we are an interactive shell, then start fiddling
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * with the signals; this is a tricky game.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) signal(SIGQUIT, SIG_IGN);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Wait till in foreground, in case someone
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * stupidly runs
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * dont want to try to grab away the tty.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States f = OLDSTD;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States else
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States f = -1;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesretry:
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (ioctl(f, TIOCGPGRP, (char *)&tpgrp) == 0 &&
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States tpgrp != -1) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (tpgrp != shpgrp) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States void (*old)() = (void (*)())signal(SIGTTIN, SIG_DFL);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) kill(0, SIGTTIN);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) signal(SIGTTIN, old);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States goto retry;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States opgrp = shpgrp;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) setpgid(0, shpgrp);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) ioctl(f, TIOCSPGRP, (char *)&shpgrp);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) fcntl(dcopy(f, FSHTTY), F_SETFD, 1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States } else {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesnotty:
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesprintf("Warning: no access to tty; thus no job control in this shell...\n");
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States tpgrp = -1;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Set SIGCHLD handler, making sure that reads restart after it runs.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States sigemptyset(&sa.sa_mask);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States sa.sa_handler = pchild;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) sigaction(SIGCHLD, &sa, (struct sigaction *)NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Set an exit here in case of an interrupt or error reading
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * the shell start-up scripts.
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as * If this is a login csh, and /etc/.login exists,
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as * source /etc/.login first.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States strtots(tmp_login, "/.login");
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States srccat_inlogin(tmp_etc, tmp_login);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* Will have value("home") here because set fast if don't */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh srccat(value(S_home /* "home" */), S_SLADOTcshrc /* "/.cshrc" */);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh /* Hash path */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (!fast && !arginp && !onelflg && !havhash)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States dohash(xhash);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Reconstruct the history list now, so that it's
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * available from within .login.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States dosource(loadhist);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (loginsh) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States srccat_inlogin(value(S_home /* "home" */), S_SLADOTlogin /* "/.login" */);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * To get cdpath hashing $cdpath must have a
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * value, not $CDPATH. So if after reading
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * the startup files ( .cshrc ), and
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * user has specified a value for cdpath, then
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * cache $cdpath paths. xhash2 is global array
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * for $cdpath caching.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /*
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States * Now are ready for the -v and -x flags
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (nverbose)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States setNS(S_echo /* "echo" */);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
b89a8333f5e1f75ec0c269b22524bd2eccb972banatalie li - Sun Microsystems - Irvine United States * All the rest of the world is inside this call.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * The argument to process indicates whether it should
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * catch "error unwinds". Thus if we are a interactive shell
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * our call here will never return by being blown past on an error.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (loginsh) {
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) close(SHIN); /* No need for unsetfd(). */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesvoid
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesuntty(void)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesvoid
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesimportpath(tchar *cp)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int i = 0;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States for (dp = cp; *dp; dp++)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (*dp == ':')
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States i++;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /*
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * i+2 where i is the number of colons in the path.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * There are i+1 directories in the path plus we need
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * room for a zero terminator.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States pv = (tchar **)xcalloc((unsigned)(i + 2), sizeof (tchar **));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States dp = cp;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States i = 0;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (*dp)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States for (;;) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if ((c = *dp) == ':' || c == 0) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *dp = 0;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States pv[i++] = savestr(*cp ? cp : dot);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (c) {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States cp = dp + 1;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States *dp = ':';
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States } else
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States dp++;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Source to the file which is the catenation of the argument names.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statessrccat(tchar *cp, tchar *dp)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States tchar *ep = strspl(cp, dp);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States int unit = dmove(open_(ep, 0), -1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Source to the file which is the catenation of the argument names.
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas * This one does not check the ownership.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Source to a unit. If onlyown it must be our file or our group or
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * we don't chance it. This occurs on ".cshrc"s and the like.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* We have to push down a lot of state here */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* All this could go into a structure */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States#ifdef TELL
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States bool otell = cantell;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States#endif
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* The (few) real local variables */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (stb.st_uid != uid && stb.st_gid != getgid())) {
8d7e41661dc4633488e93b13363137523ce59977jose borrego * There is a critical section here while we are pushing down the
8d7e41661dc4633488e93b13363137523ce59977jose borrego * input stream since we have stuff in different structures.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * If we weren't careful an interrupt could corrupt SHIN's Bin
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * structure and kill the shell.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * We could avoid the critical region by grouping all the stuff
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * in a single structure and pointing at it to move it all at
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * once. This is less efficient globally on many variable references
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * however.
8d7e41661dc4633488e93b13363137523ce59977jose borrego /* Setup the new values of the state stuff saved above */
8d7e41661dc4633488e93b13363137523ce59977jose borrego copy((char *)&saveB, (char *)&B, sizeof saveB);
8d7e41661dc4633488e93b13363137523ce59977jose borrego oSHIN = SHIN, SHIN = unit, arginp = 0, onelflg = 0;
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas * Now if we are allowing commands to be interrupted,
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * we let ourselves be interrupted.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) sigsetmask(omask);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /* We made it to the new state... free up its storage */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /* This code could get run twice but xfree doesn't care */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (i = 0; i < fblocks; i++)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* Reset input arena */
8d7e41661dc4633488e93b13363137523ce59977jose borrego intty = oldintty, whyles = oldwhyl, gointr = ogointr;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * If process reset() (effectively an unwind) then
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * we must also unwind.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (reenter >= 2)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States error(NULL);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesvoid
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesrechist(void)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (value(S_savehist /* "savehist" */)[0] == '\0')
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) strcpy_(buf, value(S_home /* "home" */));
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) strcat_(buf, S_SLADOThistory /* "/.history" */);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) strcpy_(buf, value(S_savehist /* "savehist" */));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States setintr = 0; /* No interrupts after "logout" */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw srccat(value(S_home /* "home" */), S_SLADOTlogout /* "/.logout" */);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Note that if STATUS is corrupted (i.e. getn bombs)
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * then error will exit directly because we poke child here.
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas * Otherwise we might continue unwarrantedly (sic).
8d7e41661dc4633488e93b13363137523ce59977jose borrego * in the event of a HUP we want to save the history
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesvoid
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statestchar *jobargv[2] = { S_jobs /* "jobs" */, 0 };
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States/*
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Catch an interrupt, e.g. during lexical input.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * If we are an interactive shell, we reset the interrupt catch
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * immediately. In any case we drain the shell output,
94fff7907278e4540aa7abee2b1b0ea71d36f7faAlan Wright * and finally go through the normal error mechanism, which
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * gets a chance to make the shell go away.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * If we have an active "onintr" then we search for the label.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Note that if one does "onintr -" then we shan't be interruptible
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * so we needn't worry about that here.
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh printf("\n"); /* Some like this, others don't */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * Process is the main driving routine for the shell.
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * It runs all command processing, except for those within { ... }
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * in expressions (which is run by a routine evalav in sh.exp.c which
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * is a stripped down process), and `...` evaluation which is run
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * also by a subset of this code in sh.glob.c in the routine backeval.
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh * The code here is a little strange because part of it is interruptible
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * and hence freeing of structures appears to occur when none is necessary
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * if this is ignored.
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * Note that if catch is not set then we will unwind on any error.
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * If an end-of-file occurs, we return.
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh justpr = enterhist; /* execute if not entering history */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * Interruptible during interactive reads
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh (void) sigsetmask(sigblock(0) & ~sigmask(SIGINT));
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * For the sake of reset()
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * Every error is eventually caught here or
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * the shell dies. It is at this
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * point that we clean up any left-over open
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * files, by closing all but a fixed number
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * of pre-defined files. Thus routines don't
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * have to worry about leaving files open due
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * to deeper errors... they will get closed here.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If we are at the end of the input buffer
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * then we are going to read fresh stuff.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Otherwise, we are rereading input and don't
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * need or want to prompt.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Echo not only on VERBOSE, but also with history expansion.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The parser may lose space if interrupted.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Save input text on the history list if
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * reading in old history, or it
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * is from the terminal at the top level and not
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * in a loop.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Print lexical error messages, except when sourcing
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * history lists.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If had a history command :p modifier then
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * this is as far as we should go
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Parse the words of the input into a parse tree.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Execute the parse tree
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * POSIX requires SIGCHLD to be held
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * until all processes have joined the
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * process group in order to avoid race
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * condition.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*++t == NOSTR)
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as if (u < 0 && !hflg)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Check for mail.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If we are a login shell, then we don't want to tell
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * about any mail file unless its been modified
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * after the time we started.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This prevents us from telling the user things he already
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * knows, since the login program insists on saying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * "You have mail."
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (v == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) time(&t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw intvl = (cnt && number(*vp)) ? (--cnt, getn(*vp++)) : MAILINTVL;
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego * Extract a home directory from the password file
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego * The argument points to a buffer where the name of the
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego * user whose home directory is sought is currently.
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego * We write the home directory of the user back there.
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego /* getpwname will not be modified, so we need temp. buffer */
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego (void) strcpy_(home, strtots(home_ts, pp->pw_dir));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States _exit(i);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States#endif
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesvoid
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesprintprompt(void)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States tchar *cp;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Print the prompt string
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States for (cp = value(S_prompt /* "prompt" */); *cp; cp++)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (*cp == HIST)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States printf("%d", eventno + 1);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States else {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (*cp == '\\' && cp[1] == HIST)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States cp++;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States Putchar(*cp | QUOTE);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States }
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States } else
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /*
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Prompt for forward reading loop
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * body content.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States printf("? ");
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States flush();
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States}
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States/*
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego * Save char * block.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statestchar **
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego (tchar **)xcalloc((unsigned)(num+ 1), sizeof (tchar **));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States while (*v && num--)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Following functions and data are used for csh to do its
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * file descriptors book keeping.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic int *fdinuse = NULL; /* The list of files opened by csh */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic int nbytesused = 0; /* no of bytes allocated to fdinuse */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic int max_fd = 0; /* The maximum descriptor in fdinuse */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic int my_pid; /* The process id set in initdesc() */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic int NoFile = NOFILE; /* The number of files I can use. */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Get the number of files this csh can use.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Move the initial descriptors to their eventual
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * resting places, closing all other units.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Also, reserve 0/1/2, so NIS+ routines do not get
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * hold of them. And initialize fdinuse list and set
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * the current process id.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * If this csh was invoked from setuid'ed script file,
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * do not close the third argument passed. The file
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * must be one of /dev/fd/0,1,2,,,
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * (execv() always passes three arguments when it execs a script
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * file in a form of #! /bin/csh -b.)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * If is_reinit is set in initdesc_x(), then we only close the file
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * descriptors that we actually opened (as recorded in fdinuse).
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesvoid
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesreinitdesc(int argc, char *argv[])
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Callback functions for closing all file descriptors.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (fd >= 3 && fd < NoFile && fd != script_fd &&
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightinitdesc_x(int argc, char *argv[], int is_reinit)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /*
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States * Get pid of this shell
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Get the hard limit numbers of descriptors
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * this csh can use.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If this csh was invoked for executing setuid script file,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * the third argument passed is the special file name
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * which should not be closed. This special file name is
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * in the form /dev/fd/X.
if (!is_reinit)
dup(0);
dup(0);
if (!is_reinit)
closem(void)
close(f);
max_fd = 0;
new_process(void)
max_fd = i;
max_fd = 0;
switch (level) {
case SECPOLICY_WARN:
case SECPOLICY_ERROR: