sh.c revision 1de7ff79aa681dad1598edaf52be6493d01ff971
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Use is subject to license terms.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* All Rights Reserved */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
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 */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#pragma ident "%Z%%M% %I% %E% SMI"
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <locale.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include "sh.h"
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* #include <sys/ioctl.h> */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <fcntl.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <sys/filio.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include "sh.tconst.h"
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <pwd.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <stdlib.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include "sh_policy.h" /* for pfcsh */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#ifdef TRACE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <stdio.h>
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright#endif
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
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 */
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)))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define CSH_FD_ZERO(p, n) memset((void *)(p), 0, (n))
8d7e41661dc4633488e93b13363137523ce59977jose borrego
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 };
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtchar HIST = '!';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtchar HISTSUB = '^';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint nofile;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwbool reenter;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwbool nverbose;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwbool nexececho;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwbool quitit;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwbool fast;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwbool batch;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintoshbool prompt = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwbool enterhist = 0;
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwextern gid_t getegid(), getgid();
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brownextern uid_t geteuid(), getuid();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwextern tchar **strblktotsblk(/* char **, int */);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid importpath(tchar *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid srccat(tchar *, tchar *);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid srccat_inlogin(tchar *, tchar *);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintoshvoid srcunit(int, bool, bool);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintoshvoid rechist(void);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid goodbye(void);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid pintr1(bool);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintoshvoid process(bool);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid dosource(tchar **);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightvoid mailchk(void);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightvoid printprompt(void);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightvoid sigwaiting(void);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightvoid siglwp(void);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbvoid initdesc(int, char *[]);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid initdesc_x(int, char *[], int);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid closem(void);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightvoid unsetfd(int);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid secpolicy_print(int, const char *);
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2easvoid phup(void);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#ifdef TRACE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwFILE *trace;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Trace routines
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#define TRACEFILE "/tmp/trace.XXXXXX"
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Initialize trace file.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Called from main.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregovoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwtrace_init(void)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char name[128];
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh char *p;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw strcpy(name, TRACEFILE);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh p = mktemp(name);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh trace = fopen(p, "w");
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * write message to trace file
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*VARARGS1*/
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightvoid
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrighttprintf(fmt, a, b, c, d, e, f, g, h, i, j)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright char *fmt;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (trace) {
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego fprintf(trace, fmt, a, b, c, d, e, f, g, h, i, j);
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego fflush(trace);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright#endif
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwmain(int c, char **av)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
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 */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw haderr = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw setexit();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (haderr) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * if were here, there was an error in the csh
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas * startup so just punt
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas */
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas printf("csh startup error, csh exiting...\n");
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas flush();
8d7e41661dc4633488e93b13363137523ce59977jose borrego exitstat();
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh }
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) setlocale(LC_ALL, "");
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#endif
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) textdomain(TEXT_DOMAIN);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * This is a profile shell if the simple name of argv[0] is
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * pfcsh or -pfcsh
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw p = strtots(NOSTR, "pfcsh");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw r = strtots(NOSTR, "-pfcsh");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((p != NOSTR) && (r != NOSTR) &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ((q = strtots(NOSTR, *av)) != NOSTR)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (c > 0 && (eq(p, simple(q)) || eq(r, simple(q)))) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw pfcshflag = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw xfree(q);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (p != NOSTR)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw xfree(p);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (r != NOSTR)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw xfree(r);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh if (pfcshflag == 1) {
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh secpolicy_init();
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh }
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh /* Copy arguments */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh v = strblktotsblk(av, c);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh /*
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * Initialize paraml list
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh paraml.next = paraml.prev = &paraml;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw settimes(); /* Immed. estab. timing base */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (eq(v[0], S_aout /* "a.out" */)) /* A.out's are quittable */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw quitit = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uid = getuid();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw loginsh = **v == '-';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (loginsh)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) time(&chktim);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
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 *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Also, setup data for csh internal file descriptor book keeping.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw initdesc(c, av);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright /*
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 */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw c_max_var_len_size = snprintf(NULL, 0, "%ld", MAX_VAR_LEN);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw c_max_var_len = (char *)xalloc(c_max_var_len_size + 1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) snprintf(c_max_var_len, (c_max_var_len_size + 1),
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "%ld", MAX_VAR_LEN);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw set(S_SUNW_VARLEN, strtots(NOSTR, c_max_var_len));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw xfree(c_max_var_len);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* don't do globbing here, just set exact copies */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw setNS(S_noglob);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw set(S_status /* "status" */, S_0 /* "0" */);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw dinit(cp = getenvs_("HOME")); /* dinit thinks that HOME==cwd in a */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* login shell */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (cp == NOSTR)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw fast++; /* No home -> can't read scripts */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (strlen_(cp) >= BUFSIZ - 10) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw cp = NOSTR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw fast++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw printf("%s\n", gettext("Pathname too long"));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw set(S_home /* "home" */, savestr(cp));
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States local_setenv(S_HOME, savestr(cp));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
8d7e41661dc4633488e93b13363137523ce59977jose borrego set(S_home /* "home" */, savestr(cp));
8d7e41661dc4633488e93b13363137523ce59977jose borrego }
3db3f65c6274eb042354801a308c8e9bc4994553amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Grab other useful things from the environment.
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Should we grab everything??
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
3db3f65c6274eb042354801a308c8e9bc4994553amw if ((cp = getenvs_("USER")) != NOSTR)
3db3f65c6274eb042354801a308c8e9bc4994553amw set(S_user /* "user" */, savestr(cp));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else {
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If USER is not defined, set it here.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct passwd *pw;
8d7e41661dc4633488e93b13363137523ce59977jose borrego pw = getpwuid(getuid());
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (pw != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw set(S_user, strtots((tchar *)0, pw->pw_name));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright local_setenv(S_USER, strtots((tchar *)0, pw->pw_name));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright else if (loginsh) { /* Give up setting USER variable. */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright printf("Warning: USER environment variable could not be set.\n");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((cp = getenvs_("TERM")) != NOSTR)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw set(S_term /* "term" */, savestr(cp));
8d7e41661dc4633488e93b13363137523ce59977jose borrego /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Re-initialize path if set in environment
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((cp = getenvs_("PATH")) == NOSTR)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw set1(S_path /* "path" */, saveblk(pathlist), &shvhed);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw importpath(cp);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright set(S_shell /* "shell" */, S_SHELLPATH);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw doldol = putn(getpid()); /* For $$ */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* restore globbing until the user says otherwise */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unsetv(S_noglob);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
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 */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* parents interruptibility */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) sigvec(SIGINT, (struct sigvec *)0, &osv);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw parintr = osv.sv_handler;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* parents terminability */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) sigvec(SIGTERM, (struct sigvec *)0, &osv);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw parterm = osv.sv_handler;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright _signal(SIGLWP, siglwp);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw _signal(SIGWAITING, sigwaiting);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (loginsh) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) signal(SIGHUP, phup); /* exit processing on HUP */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) signal(SIGXCPU, phup); /* ...and on XCPU */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) signal(SIGXFSZ, phup); /* ...and on XFSZ */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Process the arguments.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Note that processing of -v/-x is actually delayed till after
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * script processing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw c--, v++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (c > 0 && (cp = v[0])[0] == '-' && *++cp != '\0' && !batch) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw do switch (*cp++) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 'b': /* -b Next arg is input file */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw batch++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 'c': /* -c Command input from arg */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (c == 1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw exit(0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw c--, v++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw arginp = v[0];
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw prompt = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw nofile++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw cflg++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 'e': /* -e Exit on any error */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw exiterr++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 'f': /* -f Fast start */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw fast++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 'i': /* -i Interactive, even if !intty */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw intact++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw nofile++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 'n': /* -n Don't execute */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw noexec++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 'q': /* -q (Undoc'd) ... die on quit */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw quitit = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 's': /* -s Read from std input */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw nofile++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case 't': /* -t Read one line from input */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw onelflg = 2;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw prompt = 0;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright nofile++;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright break;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright#ifdef TRACE
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright case 'T': /* -T trace switch on */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright trace_init();
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright break;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright#endif
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright case 'v': /* -v Echo hist expanded input */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright nverbose = 1; /* ... later */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright break;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright case 'x': /* -x Echo just before execution */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright nexececho = 1; /* ... later */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright break;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright case 'V': /* -V Echo hist expanded input */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright setNS(S_verbose /* "verbose" */); /* NOW! */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright break;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright case 'X': /* -X Echo just before execution */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright setNS(S_echo /* "echo" */); /* NOW! */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright break;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright } while (*cp);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright v++, c--;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (quitit) /* With all due haste, for debugging */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) signal(SIGQUIT, SIG_DFL);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*
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 */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (!batch && (uid != geteuid() || getgid() != getegid())) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright errno = EACCES;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright child++; /* So this ... */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright Perror(S_csh /* "csh" */); /* ... doesn't return */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (nofile == 0 && c > 0) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright nofile = open_(v[0], 0);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (nofile < 0) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright child++; /* So this ... */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright Perror(v[0]); /* ... doesn't return */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright file = v[0];
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright SHIN = dmove(nofile, FSHIN); /* Replace FSHIN */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) fcntl(SHIN, F_SETFD, 1);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright prompt = 0;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright c--, v++;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Consider input a tty if it really is or we are interactive.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright intty = intact || isatty(SHIN);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*
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 */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (loginsh || intact || intty && isatty(SHOUT))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw setintr = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#ifdef TELL
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw settell();
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright#endif
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Save the remaining arguments in argv.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw setq(S_argv /* "argv" */, copyblk(v), &shvhed);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Set up the prompt.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (prompt) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw gethostname_(s_prompt, MAXHOSTNAMELEN);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw strcat_(s_prompt, uid == 0 ? S_SHARPSP /* "# " */ : S_PERSENTSP /* "% " */);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright set(S_prompt /* "prompt" */, s_prompt);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*
634e26ec75c89095090605284938356a3145f2b8Casper H.S. Dik * If we are an interactive shell, then start fiddling
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * with the signals; this is a tricky game.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright shpgrp = getpgid(0);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright opgrp = tpgrp = -1;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (setintr) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright **av = '-';
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (!quitit) /* Wary! */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) signal(SIGQUIT, SIG_IGN);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) signal(SIGINT, pintr);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) sigblock(sigmask(SIGINT));
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) signal(SIGTERM, SIG_IGN);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (quitit == 0 && arginp == 0) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) signal(SIGTSTP, SIG_IGN);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) signal(SIGTTIN, SIG_IGN);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) signal(SIGTTOU, SIG_IGN);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Wait till in foreground, in case someone
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * stupidly runs
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * csh &
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * dont want to try to grab away the tty.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb */
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb if (isatty(FSHDIAG))
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb f = FSHDIAG;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else if (isatty(FSHOUT))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw f = FSHOUT;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else if (isatty(OLDSTD))
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;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw shpgrp = getpid();
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright tpgrp = 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 }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb if (setintr == 0 && parintr == SIG_DFL)
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb setintr++;
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb /*
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb * Set SIGCHLD handler, making sure that reads restart after it runs.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb */
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 sa.sa_flags = SA_RESTART;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) sigaction(SIGCHLD, &sa, (struct sigaction *)NULL);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Set an exit here in case of an interrupt or error reading
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * the shell start-up scripts.
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas setexit();
8d7e41661dc4633488e93b13363137523ce59977jose borrego haderr = 0; /* In case second time through */
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright if (!fast && reenter == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw reenter++;
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as /*
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as * If this is a login csh, and /etc/.login exists,
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as * source /etc/.login first.
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as */
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas if (loginsh) {
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright tchar tmp_etc[4+1]; /* strlen("/etc")+1 */
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as tchar tmp_login[7+1]; /* strlen("/.login")+1 */
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as strtots(tmp_etc, "/etc");
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);
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* Will have value("home") here because set fast if don't */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh srccat(value(S_home /* "home" */), S_SLADOTcshrc /* "/.cshrc" */);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh /* Hash path */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (!fast && !arginp && !onelflg && !havhash)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States dohash(xhash);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
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.
8d7e41661dc4633488e93b13363137523ce59977jose borrego */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (!fast && !arginp && !onelflg && !havhash2)
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as dohash(xhash2);
3db3f65c6274eb042354801a308c8e9bc4994553amw }
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
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)
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas setNS(S_verbose /* "verbose" */);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (nexececho)
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 /*
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.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego process(setintr);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States
8d7e41661dc4633488e93b13363137523ce59977jose borrego /*
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Mop-up.
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (loginsh) {
8d7e41661dc4633488e93b13363137523ce59977jose borrego printf("logout\n");
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) close(SHIN); /* No need for unsetfd(). */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh child++;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh goodbye();
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh }
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh rechist();
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh exitstat();
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh}
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
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
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (tpgrp > 0) {
55bf511df53aad0fdb7eb3fa349f0308cc05234cas (void) setpgid(0, opgrp);
55bf511df53aad0fdb7eb3fa349f0308cc05234cas (void) ioctl(FSHTTY, TIOCSPGRP, (char *)&opgrp);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
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;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tchar *dp;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tchar **pv;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int c;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw static tchar dot[2] = {'.', 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
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States dp++;
3db3f65c6274eb042354801a308c8e9bc4994553amw }
8d7e41661dc4633488e93b13363137523ce59977jose borrego pv[i] = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright set1(S_path /* "path" */, pv, &shvhed);
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb}
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Source to the file which is the catenation of the argument names.
a0aa776e20803c84edd153d9cb584fd67163aef3Alan Wright */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
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
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb (void) fcntl(unit, F_SETFD, 1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw xfree(ep);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#ifdef INGRES
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw srcunit(unit, 0, 0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw srcunit(unit, 1, 0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#endif
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Source to the file which is the catenation of the argument names.
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas * This one does not check the ownership.
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas */
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2easvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsrccat_inlogin(tchar *cp, tchar *dp)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tchar *ep = strspl(cp, dp);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int unit = dmove(open_(ep, 0), -1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fcntl(unit, F_SETFD, 1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw xfree(ep);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw srcunit(unit, 0, 0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh/*
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.
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsrcunit(int unit, bool onlyown, bool hflg)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* We have to push down a lot of state here */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* All this could go into a structure */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int oSHIN = -1, oldintty = intty;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct whyle *oldwhyl = whyles;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tchar *ogointr = gointr, *oarginp = arginp;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tchar *oevalp = evalp, **oevalvec = evalvec;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int oonelflg = onelflg;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh bool oenterhist = enterhist;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh tchar OHIST = HIST;
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 struct Bin saveB;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* The (few) real local variables */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw jmp_buf oldexit;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int reenter, omask;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (unit < 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (didfds)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw donefds();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (onlyown) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct stat stb;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (fstat(unit, &stb) < 0 ||
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (stb.st_uid != uid && stb.st_gid != getgid())) {
3ad684d66b78e06edd37e2c4fd3b3949f095194bjb (void) close(unit);
8d7e41661dc4633488e93b13363137523ce59977jose borrego unsetfd(unit);
8d7e41661dc4633488e93b13363137523ce59977jose borrego return;
8d7e41661dc4633488e93b13363137523ce59977jose borrego }
8d7e41661dc4633488e93b13363137523ce59977jose borrego }
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego /*
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 *
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.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw getexit(oldexit);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw reenter = 0;
3db3f65c6274eb042354801a308c8e9bc4994553amw if (setintr)
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb omask = sigblock(sigmask(SIGINT));
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas setexit();
8d7e41661dc4633488e93b13363137523ce59977jose borrego reenter++;
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (reenter == 1) {
8d7e41661dc4633488e93b13363137523ce59977jose borrego /* Setup the new values of the state stuff saved above */
8d7e41661dc4633488e93b13363137523ce59977jose borrego copy((char *)&saveB, (char *)&B, sizeof saveB);
8d7e41661dc4633488e93b13363137523ce59977jose borrego fbuf = (tchar **) 0;
8d7e41661dc4633488e93b13363137523ce59977jose borrego fseekp = feobp = fblocks = 0;
8d7e41661dc4633488e93b13363137523ce59977jose borrego oSHIN = SHIN, SHIN = unit, arginp = 0, onelflg = 0;
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas intty = isatty(SHIN), whyles = 0, gointr = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright evalvec = 0; evalp = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright enterhist = hflg;
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas if (enterhist)
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas HIST = '\0';
8d7e41661dc4633488e93b13363137523ce59977jose borrego /*
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 */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (setintr)
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States (void) sigsetmask(omask);
8d7e41661dc4633488e93b13363137523ce59977jose borrego#ifdef TELL
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright settell();
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas#endif
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas process(0); /* 0 -> blow away on errors */
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas }
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (setintr)
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) sigsetmask(omask);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (oSHIN >= 0) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright int i;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
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++)
8d7e41661dc4633488e93b13363137523ce59977jose borrego xfree(fbuf[i]);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw xfree((char *)fbuf);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* Reset input arena */
8d7e41661dc4633488e93b13363137523ce59977jose borrego copy((char *)&B, (char *)&saveB, sizeof B);
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) close(SHIN), SHIN = oSHIN;
8d7e41661dc4633488e93b13363137523ce59977jose borrego unsetfd(SHIN);
8d7e41661dc4633488e93b13363137523ce59977jose borrego arginp = oarginp, onelflg = oonelflg;
8d7e41661dc4633488e93b13363137523ce59977jose borrego evalp = oevalp, evalvec = oevalvec;
8d7e41661dc4633488e93b13363137523ce59977jose borrego intty = oldintty, whyles = oldwhyl, gointr = ogointr;
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (enterhist)
8d7e41661dc4633488e93b13363137523ce59977jose borrego HIST = OHIST;
8d7e41661dc4633488e93b13363137523ce59977jose borrego enterhist = oenterhist;
8d7e41661dc4633488e93b13363137523ce59977jose borrego#ifdef TELL
8d7e41661dc4633488e93b13363137523ce59977jose borrego cantell = otell;
8d7e41661dc4633488e93b13363137523ce59977jose borrego#endif
8d7e41661dc4633488e93b13363137523ce59977jose borrego }
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego resexit(oldexit);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
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 tchar buf[BUFSIZ];
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh int fp, ftmp, oldidfds;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (!fast) {
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (value(S_savehist /* "savehist" */)[0] == '\0')
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh return;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) strcpy_(buf, value(S_home /* "home" */));
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) strcat_(buf, S_SLADOThistory /* "/.history" */);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh fp = creat_(buf, 0666);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (fp == -1)
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh return;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh oldidfds = didfds;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh didfds = 0;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh ftmp = SHOUT;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh SHOUT = fp;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) strcpy_(buf, value(S_savehist /* "savehist" */));
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh dumphist[2] = buf;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh dohist(dumphist);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh (void) close(fp);
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh unsetfd(fp);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw SHOUT = ftmp;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw didfds = oldidfds;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwgoodbye(void)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (loginsh) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) signal(SIGQUIT, SIG_IGN);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) signal(SIGINT, SIG_IGN);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) signal(SIGTERM, SIG_IGN);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States setintr = 0; /* No interrupts after "logout" */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (adrof(S_home /* "home" */))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw srccat(value(S_home /* "home" */), S_SLADOTlogout /* "/.logout" */);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw rechist();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw exitstat();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwexitstat(void)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#ifdef PROF
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw monitor(0);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#endif
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
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).
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas */
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb child++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw untty();
6537f381d2d9e7b4e2f7b29c3e7a3f13be036f2eas exit(getn(value(S_status /* "status" */)));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb/*
8d7e41661dc4633488e93b13363137523ce59977jose borrego * in the event of a HUP we want to save the history
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statesvoid
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightphup(void)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright rechist();
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright exit(1);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
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.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightvoid
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightpintr(void)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
8d7e41661dc4633488e93b13363137523ce59977jose borrego pintr1(1);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightvoid
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightpintr1(bool wantnl)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright tchar **v;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright int omask;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright omask = sigblock(0);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (setintr) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) sigsetmask(omask & ~sigmask(SIGINT));
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (pjobs) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright pjobs = 0;
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb printf("\n");
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego dojobs(jobargv);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright bferr("Interrupted");
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) sigsetmask(omask & ~sigmask(SIGCHLD));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw draino();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb /*
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.
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb */
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb if (gointr) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright search(ZGOTO, 0, gointr);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright timflg = 0;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (v = pargv)
94fff7907278e4540aa7abee2b1b0ea71d36f7faAlan Wright pargv = 0, blkfree(v);
94fff7907278e4540aa7abee2b1b0ea71d36f7faAlan Wright if (v = gargv)
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh gargv = 0, blkfree(v);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh reset();
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh } else if (intty && wantnl)
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh printf("\n"); /* Some like this, others don't */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh error(NULL);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh}
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh/*
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 *
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 *
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 */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintoshvoid
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintoshprocess(bool catch)
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh{
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh jmp_buf osetexit;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh struct command *t;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh getexit(osetexit);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh for (;;) {
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh pendjob();
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh freelex(&paraml);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh paraml.next = paraml.prev = &paraml;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh paraml.word = S_ /* "" */;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh t = 0;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh setexit();
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh justpr = enterhist; /* execute if not entering history */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh /*
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * Interruptible during interactive reads
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh */
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (setintr)
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh (void) sigsetmask(sigblock(0) & ~sigmask(SIGINT));
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh /*
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh * For the sake of reset()
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh freelex(&paraml), freesyn(t), t = 0;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh if (haderr) {
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh if (!catch) {
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh /* unwind */
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh doneinp = 0;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh resexit(osetexit);
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh reset();
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh }
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh haderr = 0;
cb174861876aea6950a7ab4ce944aff84b1914cdjoyce mcintosh /*
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 */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw closem();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (doneinp) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw doneinp = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (chkstop)
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh chkstop--;
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh if (neednote)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw pnote();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (intty && prompt && evalvec == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw mailchk();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
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 */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (fseekp == feobp)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw printprompt();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw err = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Echo not only on VERBOSE, but also with history expansion.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (lex(&paraml) && intty ||
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego adrof(S_verbose /* "verbose" */)) {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego haderr = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw prlex(&paraml);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright haderr = 0;
94fff7907278e4540aa7abee2b1b0ea71d36f7faAlan Wright }
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh
1fdeec650620e8498c06f832ea4bd2292f7e9632joyce mcintosh /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The parser may lose space if interrupted.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (setintr)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) sigblock(sigmask(SIGINT));
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*
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 */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (enterhist || catch && intty && !whyles)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw savehist(&paraml);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Print lexical error messages, except when sourcing
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * history lists.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (!enterhist && err)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw error("%s", gettext(err));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If had a history command :p modifier then
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * this is as far as we should go
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (justpr)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego reset();
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego alias(&paraml);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego /*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Parse the words of the input into a parse tree.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego t = syntax(paraml.next, &paraml, 0);
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego if (err)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego error("%s", gettext(err));
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego /*
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego * Execute the parse tree
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego {
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego /*
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 */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int omask;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw omask = sigblock(sigmask(SIGCHLD));
8d7e41661dc4633488e93b13363137523ce59977jose borrego execute(t, tpgrp);
8d7e41661dc4633488e93b13363137523ce59977jose borrego (void) sigsetmask(omask &~ sigmask(SIGCHLD));
8d7e41661dc4633488e93b13363137523ce59977jose borrego }
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego if (err)
8d7e41661dc4633488e93b13363137523ce59977jose borrego error("%s", gettext(err));
8d7e41661dc4633488e93b13363137523ce59977jose borrego /*
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Made it!
8d7e41661dc4633488e93b13363137523ce59977jose borrego */
8d7e41661dc4633488e93b13363137523ce59977jose borrego freelex(&paraml), freesyn(t);
8d7e41661dc4633488e93b13363137523ce59977jose borrego }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw resexit(osetexit);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwdosource(tchar **t)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tchar *f;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int u;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw bool hflg = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tchar buf[BUFSIZ];
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw t++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*t && eq(*t, S_h /* "-h" */)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (*++t == NOSTR)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw bferr("Too few arguments.");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw hflg++;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) strcpy_(buf, *t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw f = globone(buf);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw u = dmove(open_(f, 0), -1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw xfree(f);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw freelex(&paraml);
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as if (u < 0 && !hflg)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw Perror(f);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) fcntl(u, F_SETFD, 1);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw srcunit(u, 0, hflg);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
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 */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwmailchk(void)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct varent *v;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw tchar **vp;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw time_t t;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int intvl, cnt;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw struct stat stb;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw bool new;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw v = adrof(S_mail /* "mail" */);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (v == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) time(&t);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw vp = v->vec;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw cnt = blklen(vp);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw intvl = (cnt && number(*vp)) ? (--cnt, getn(*vp++)) : MAILINTVL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (intvl < 1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw intvl = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (chktim + intvl > t)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (; *vp; vp++) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (stat_(*vp, &stb) < 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw new = stb.st_mtime > time0.tv_sec;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (stb.st_size == 0 || stb.st_atime >= stb.st_mtime ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (stb.st_atime <= chktim && stb.st_mtime <= chktim) ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw loginsh && !new)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (cnt == 1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw printf("You have %smail.\n", new ? "new " : "");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw printf("%s in %t.\n", new ? "New mail" : "Mail", *vp);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw chktim = t;
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego}
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego/*
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 */
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borregoint
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borregogethdir(tchar *home)
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego{
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego /* getpwname will not be modified, so we need temp. buffer */
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego char home_str[BUFSIZ];
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego tchar home_ts[BUFSIZ];
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego struct passwd *pp /* = getpwnam(home) */;
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego pp = getpwnam(tstostr(home_str, home));
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego if (pp == 0)
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego return (1);
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego (void) strcpy_(home, strtots(home_ts, pp->pw_dir));
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego return (0);
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego}
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego#if 0
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borregovoid
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego#ifdef PROF
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borregodone(int i)
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego#else
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borregoexit(int i)
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego#endif
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego{
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego untty();
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;
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego if (!whyles) {
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego /*
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.
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego */
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United Statestchar **
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borregostrblktotsblk(char **v, int num)
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego{
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego tchar **newv =
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego (tchar **)xcalloc((unsigned)(num+ 1), sizeof (tchar **));
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego tchar **onewv = newv;
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States while (*v && num--)
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego *newv++ = strtots(NOSTR, *v++);
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego *newv = 0;
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego return (onewv);
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego}
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borrego
a4b239dfde5f1d873c730c047e87e5714ebddbb7jose borregovoid
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsigwaiting(void)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright _signal(SIGWAITING, sigwaiting);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightvoid
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightsiglwp(void)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright _signal(SIGLWP, siglwp);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Following functions and data are used for csh to do its
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * file descriptors book keeping.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
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
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Get the number of files this csh can use.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Move the initial descriptors to their eventual
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * resting places, closing all other units.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright *
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 *
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 *
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).
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightvoid
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightinitdesc(int argc, char *argv[])
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright initdesc_x(argc, argv, 0);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
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 initdesc_x(argc, argv, 1);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright/*
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright * Callback functions for closing all file descriptors.
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic int
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightclose_except(void *cd, int fd)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright int script_fd = *(int *)cd;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (fd >= 3 && fd < NoFile && fd != script_fd)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) close(fd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (0);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightstatic int
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightclose_inuse(void *cd, int fd)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright int script_fd = *(int *)cd;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright if (fd >= 3 && fd < NoFile && fd != script_fd &&
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright CSH_FD_ISSET(fd, fdinuse)) {
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright (void) close(fd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright unsetfd(fd);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright }
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright return (0);
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright}
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightvoid
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wrightinitdesc_x(int argc, char *argv[], int is_reinit)
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright{
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright int script_fd = -1;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright struct stat buf;
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright struct rlimit rlp;
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 */
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright my_pid = getpid();
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright
29bd28862cfb8abbd3a0f0a4b17e08bbc3652836Alan Wright /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Get the hard limit numbers of descriptors
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * this csh can use.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (getrlimit(RLIMIT_NOFILE, &rlp) == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw NoFile = rlp.rlim_cur;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
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.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (argc >= 3)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (sscanf(argv[2], "/dev/fd/%d", &script_fd) != 1)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw script_fd = -1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else
fcntl(script_fd, F_SETFD, 1); /* Make sure to close
* this file on exec.
*/
if (fdinuse == NULL) {
nbytesused = sizeof (int) * howmany(NoFile, sizeof (int) * NBBY);
fdinuse = (int *)xalloc(nbytesused);
}
/*
* Close all files except 0/1/2 to get a clean
* file descritor space.
*/
if (!is_reinit)
(void) fdwalk(close_except, &script_fd);
else
(void) fdwalk(close_inuse, &script_fd);
didfds = 0; /* 0, 1, 2 aren't set up */
if (fstat(0, &buf) < 0)
open("/dev/null", 0);
(void) fcntl(SHIN = dcopy(0, FSHIN), F_SETFD, 1);
(void) fcntl(SHOUT = dcopy(1, FSHOUT), F_SETFD, 1);
(void) fcntl(SHDIAG = dcopy(2, FSHDIAG), F_SETFD, 1);
(void) fcntl(OLDSTD = dcopy(SHIN, FOLDSTD), F_SETFD, 1);
/*
* Open 0/1/2 to avoid Nis+ functions to pick them up.
* Now, 0/1/2 are saved, close them and open them.
*/
close(0); close(1); close(2);
open("/dev/null", 0);
dup(0);
dup(0);
/*
* Clear fd_set mask
*/
if (!is_reinit)
CSH_FD_ZERO(fdinuse, nbytesused);
}
/*
* This routine is called after an error to close up
* any units which may have been left open accidentally.
*
* You only need to remove files in fdinuse list.
* After you have removed the files, you can clear the
* list and max_fd.
*/
void
closem(void)
{
int f;
for (f = 3; f <= max_fd; f++) {
if (CSH_FD_ISSET(f, fdinuse) &&
f != SHIN && f != SHOUT && f != SHDIAG &&
f != OLDSTD && f != FSHTTY)
close(f);
}
CSH_FD_ZERO(fdinuse, nbytesused);
max_fd = 0;
}
/*
* Reset my_pid when a new process is created. Only call this
* if you want the process to affect fdinuse (e.g., fork, but
* not vfork).
*/
void
new_process(void)
{
my_pid = getpid();
}
/*
* Whenever Csh open/create/dup/pipe a file or files,
* Csh keeps track of its open files. The open files
* are kept in "fdinuse, Fd In Use" list.
*
* When a file descriptor is newly allocated, setfd() is
* used to mark the fact in "fdinuse" list.
* For example,
* fd = open("newfile", 0);
* setfd(fd);
*
* When a file is freed by close() function, unsetfd() is
* used to remove the fd from "fdinuse" list.
* For example,
* close(fd);
* unsetfd(fd);
*/
void
setfd(int fd)
{
/*
* Because you want to avoid
* conflict due to vfork().
*/
if (my_pid != getpid())
return;
if (fd >= NoFile || fd < 0)
return;
if (fd > max_fd)
max_fd = fd;
CSH_FD_SET(fd, fdinuse);
}
void
unsetfd(int fd)
{
int i;
/*
* Because you want to avoid
* conflict due to vfork().
*/
if (my_pid != getpid())
return;
if (fd >= NoFile || fd < 0)
return;
CSH_FD_CLR(fd, fdinuse);
if (fd == max_fd) {
for (i = max_fd-1; i >= 3; i--)
if (CSH_FD_ISSET(i, fdinuse)) {
max_fd = i;
return;
}
max_fd = 0;
}
}
/*
* A generic call back routine to output error messages from the
* policy backing functions called by pfcsh.
*/
void
secpolicy_print(int level, const char *msg)
{
switch (level) {
case SECPOLICY_WARN:
default:
haderr = 1;
printf("%s: ", msg); /* printf() does gettext() */
break;
case SECPOLICY_ERROR:
bferr((char *)msg); /* bferr() does gettext() */
break;
}
}