da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * UNIX shell
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * S. R. Bourne
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Rewritten By David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ast.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sfio.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <stak.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ls.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <fcin.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "defs.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "variables.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "path.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "io.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "jobs.h"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#include "shlex.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "shnodes.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "history.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "timeout.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/time"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/pstat"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/execargs"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "FEATURE/externs"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _hdr_nc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# include <nc.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _hdr_nc */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define CMD_LENGTH 64
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* These routines are referenced by this module */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void exfile(Shell_t*, Sfio_t*,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void chkmail(Shell_t *shp, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(_lib_fork) && !defined(_NEXT_SOURCE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static void fixargs(char**,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define fixargs(a,b)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifndef environ
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern char **environ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic struct stat lastmail;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic time_t mailtime;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic char beenhere = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _lib_sigvec
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void clearsigmask(register int sig)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct sigvec vec;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sigvec(sig,NIL(struct sigvec*),&vec)>=0 && vec.sv_mask)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin vec.sv_mask = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sigvec(sig,&vec,NIL(struct sigvec*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_sigvec */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _lib_fts_notify
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# include <fts.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* check for interrupts during tree walks */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int fts_sigcheck(FTS* fp, FTSENT* ep, void* context)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Shell_t *shp = (Shell_t*)context;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(fp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NOT_USED(ep);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->trapnote&SH_SIGSET)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errno = EINTR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_fts_notify */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef PATH_BFPATH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PATHCOMP NIL(Pathcomp_t*)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PATHCOMP ""
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * search for file and exfile() it if it exists
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 1 returned if file found, 0 otherwise
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint sh_source(Shell_t *shp, Sfio_t *iop, const char *file)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* oid;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* nid;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int fd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!file || !*file || (fd = path_open(file, PATHCOMP)) < 0)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz REGRESS(source, "sh_source", ("%s:ENOENT", file));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin oid = error_info.id;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nid = error_info.id = strdup(file);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.filename = path_fullname(stakptr(PATH_OFFSET));
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz REGRESS(source, "sh_source", ("%s", file));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exfile(shp, iop, fd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.id = oid;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(nid);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef S_ISSOCK
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define REMOTE(m) (S_ISSOCK(m)||!(m))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define REMOTE(m) !(m)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinint sh_main(int ac, char *av[], Shinit_f userinit)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int fdin;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Sfio_t *iop;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register Shell_t *shp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct stat statb;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int i, rshflag; /* set for restricted shell */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *command;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _lib_sigvec
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /* This is to clear mask that may be left on by rlogin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin clearsigmask(SIGALRM);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin clearsigmask(SIGHUP);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin clearsigmask(SIGCHLD);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_sigvec */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _hdr_nc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin _NutConf(_NC_SET_SUFFIXED_SEARCHING, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _hdr_nc */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fixargs(av,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp = sh_init(ac,av,userinit);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time(&mailtime);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(rshflag=sh_isoption(SH_RESTRICTED))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offoption(SH_RESTRICTED);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef _lib_fts_notify
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fts_notify(fts_sigcheck,(void*)shp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_fts_notify */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sigsetjmp(*((sigjmp_buf*)shp->jmpbuffer),0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* begin script execution here */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_reinit((char**)0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->fn_depth = shp->dot_depth = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin command = error_info.id;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* set pidname '$$' */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->pid = getpid();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin srand(shp->pid&0x7fff);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->ppid = getppid();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(nv_isnull(PS4NOD))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(PS4NOD,e_traceprompt,NV_RDONLY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin path_pwd(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin iop = (Sfio_t*)0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_BRACEPAT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_BRACEEXPAND);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((beenhere++)==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onstate(SH_PROFILE);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ((Lex_t*)shp->lex_context)->nonstandard = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->ppid==1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->login_sh++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->login_sh >= 2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_LOGIN_SHELL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* decide whether shell is interactive */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!sh_isoption(SH_INTERACTIVE) && !sh_isoption(SH_TFLAG) && !sh_isoption(SH_CFLAG) &&
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_isoption(SH_SFLAG) && tty_check(0) && tty_check(ERRIO))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_INTERACTIVE);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(sh_isoption(SH_INTERACTIVE))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_BGNICE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_RC);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!sh_isoption(SH_RC) && (sh_isoption(SH_BASH) && !sh_isoption(SH_POSIX)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_REMOTE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin || !fstat(0, &statb) && REMOTE(statb.st_mode)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_RC);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin for(i=0; i<elementsof(shp->offoptions.v); i++)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin shp->options.v[i] &= ~shp->offoptions.v[i];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_INTERACTIVE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef SIGXCPU
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin signal(SIGXCPU,SIG_DFL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SIGXCPU */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef SIGXFSZ
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin signal(SIGXFSZ,SIG_DFL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SIGXFSZ */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_MONITOR);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin job_init(shp,sh_isoption(SH_LOGIN_SHELL));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(sh_isoption(SH_LOGIN_SHELL))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* system profile */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_source(shp, iop, e_sysprofile);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!sh_isoption(SH_NOUSRPROFILE) && !sh_isoption(SH_PRIVILEGED))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char **files = shp->login_files;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while ((name = *files++) && !sh_source(shp, iop, sh_mactry(shp,name)));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* make sure PWD is set up correctly */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin path_pwd(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!sh_isoption(SH_NOEXEC))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!sh_isoption(SH_NOUSRPROFILE) && !sh_isoption(SH_PRIVILEGED) && sh_isoption(SH_RC))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_BASH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_BASH) && !sh_isoption(SH_POSIX))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_SYSRC
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_source(shp, iop, e_bash_sysrc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_source(shp, iop, shp->rcfile ? shp->rcfile : sh_mactry(shp,(char*)e_bash_rc));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(name = sh_mactry(shp,nv_getval(ENVNOD)))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin name = *name ? strdup(name) : (char*)0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_SYSRC
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!strmatch(name, "?(.)/./*"))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_source(shp, iop, e_sysrc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_source(shp, iop, name);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin free(name);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(sh_isoption(SH_INTERACTIVE) && sh_isoption(SH_PRIVILEGED))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_source(shp, iop, e_suidprofile);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.cmdname = error_info.id = command;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_PROFILE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(rshflag)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_RESTRICTED);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* open input file if specified */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->comdiv)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shell_c:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin iop = sfnew(NIL(Sfio_t*),shp->comdiv,strlen(shp->comdiv),0,SF_STRING|SF_READ);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name = error_info.id;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.id = shp->shname;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_SFLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fdin = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *sp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* open stream should have been passed into shell */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(strmatch(name,e_devfdNN))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#if !_WINIX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int type;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fdin = (int)strtol(name+8, (char**)0, 10);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fstat(fdin,&statb)<0)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin errormsg(SH_DICT,ERROR_system(1),e_open,name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !_WINIX
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * try to undo effect of solaris 2.5+
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * change for argv for setuid scripts
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(((type = sh_type(cp = av[0])) & SH_TYPE_SH) && (!(name = nv_getval(L_ARGNOD)) || !((type = sh_type(cp = name)) & SH_TYPE_SH)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin av[0] = (type & SH_TYPE_LOGIN) ? cp : path_basename(cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* exec to change $0 for ps */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin execv(pathshell(),av);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* exec fails */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.dolv[0] = av[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fixargs(shp->st.dolv,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name = av[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offoption(SH_VERBOSE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offoption(SH_XTRACE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int isdir = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((fdin=sh_open(name,O_RDONLY,0))>=0 &&(fstat(fdin,&statb)<0 || S_ISDIR(statb.st_mode)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin close(fdin);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin isdir = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fdin = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.filename = path_fullname(name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fdin < 0 && !strchr(name,'/'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef PATH_BFPATH
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(path_absolute(name,NIL(Pathcomp_t*)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp = stakptr(PATH_OFFSET);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp = path_absolute(name,NIL(char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((fdin=sh_open(sp,O_RDONLY,0))>=0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.filename = path_fullname(sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fdin<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(isdir)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errno = EISDIR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.id = av[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sp || errno!=ENOENT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(ERROR_NOEXEC),e_open,name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* try sh -c 'name "$@"' */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_CFLAG);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->comdiv = (char*)malloc(strlen(name)+7);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin name = strcopy(shp->comdiv,name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->st.dolc)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcopy(name," \"$@\"");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto shell_c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fdin==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fdin = sh_iomovefd(fdin);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->readscript = shp->shname;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.id = name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->comdiv--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_ACCT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_accinit();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fdin != 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_accbegin(error_info.id);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_ACCT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fdin = shp->infd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fixargs(shp->st.dolv,1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_INTERACTIVE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onstate(SH_INTERACTIVE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(IFSNOD,(char*)e_sptbnl,NV_RDONLY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exfile(shp,iop,fdin);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_done(shp,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* NOTREACHED */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * iop is not null when the input is a string
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fdin is the input file descriptor
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void exfile(register Shell_t *shp, register Sfio_t *iop,register int fno)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time_t curtime;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Shnode_t *t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int maxtry=IOMAXTRY, tdone=0, execflags;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int states,jmpval;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct checkpt buff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_pushcontext(&buff,SH_JMPERREXIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* open input stream */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(SH_PATHNAMENOD, shp->st.filename ,NV_NOFREE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!iop)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fno > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int r;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fno < 10 && ((r=sh_fcntl(fno,F_DUPFD,10))>=10))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->fdstatus[r] = shp->fdstatus[fno];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_close(fno);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fno = r;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fcntl(fno,F_SETFD,FD_CLOEXEC);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->fdstatus[fno] |= IOCLEX;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin iop = sh_iostream((void*)shp,fno);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin iop = sfstdin;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fno = -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->infd = fno;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isstate(SH_INTERACTIVE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(nv_isnull(PS1NOD))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(PS1NOD,(shp->euserid?e_stdprompt:e_supprompt),NV_RDONLY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_sigdone();
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(sh_histinit((void*)shp))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_HISTORY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!sh_isstate(SH_PROFILE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buff.mode = SH_JMPEXIT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onoption(SH_TRACKALL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offoption(SH_MONITOR);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_INTERACTIVE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_MONITOR);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_HISTORY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offoption(SH_HISTORY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin states = sh_getstate();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin jmpval = sigsetjmp(buff.buff,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(jmpval)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfio_t *top;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_iorestore((void*)shp,0,jmpval);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hist_flush(shp->hist_ptr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsync(shp->outpool);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.execbrk = shp->st.breakcnt = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* check for return from profile or env file */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isstate(SH_PROFILE) && (jmpval==SH_JMPFUN || jmpval==SH_JMPEXIT))
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner {
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner sh_setstate(states);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!sh_isoption(SH_INTERACTIVE) || sh_isstate(SH_FORKED) || (jmpval > SH_JMPERREXIT && job_close(shp) >=0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_INTERACTIVE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_MONITOR);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* skip over remaining input */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(top = fcfile())
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(fcget()>0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fcclose();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(top=sfstack(iop,SF_POPSTACK))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfclose(top);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* make sure that we own the terminal */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef SIGTSTP
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tcsetpgrp(job.fd,shp->pid);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SIGTSTP */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* error return here */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfclrerr(iop);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_setstate(states);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.optindex = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin opt_info.offset = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.loopcnt = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->trapnote = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->intrap = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.line = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->inlineno = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->binscript = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sfeof(iop))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto eof_or_error;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* command loop */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->nextprompt = 1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_freeup(shp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakset(NIL(char*),0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin exitset();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_STOPOK);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_ERREXIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_VERBOSE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_TIMING);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_GRACE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_TTYWAIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_VERBOSE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onstate(SH_VERBOSE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onstate(SH_ERREXIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* -eim flags don't apply to profiles */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isstate(SH_PROFILE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_INTERACTIVE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_ERREXIT);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_MONITOR);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isstate(SH_INTERACTIVE) && !tdone)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *mail;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef JOBS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_MONITOR);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_MONITOR))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onstate(SH_MONITOR);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(job.pwlist)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin job_walk(sfstderr,job_list,JOB_NFLAG,(char**)0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin job_wait((pid_t)0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* JOBS */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((mail=nv_getval(MAILPNOD)) || (mail=nv_getval(MAILNOD)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin time(&curtime);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((curtime - mailtime) >= sh_mailchk)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin chkmail(shp,mail);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mailtime = curtime;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->hist_ptr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hist_eof(shp->hist_ptr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* sets timeout for command entry */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->timeout = shp->st.tmout;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if SHOPT_TIMEOUT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->timeout <= 0 || shp->timeout > SHOPT_TIMEOUT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->timeout = SHOPT_TIMEOUT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_TIMEOUT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->inlineno = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.line = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->exitval = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->trapnote = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(buff.mode == SH_JMPEXIT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buff.mode = SH_JMPERREXIT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#ifdef DEBUG
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_warn(0),"%d: mode changed to JMP_EXIT",getpid());
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errno = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(tdone || !sfreserve(iop,0,0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eof_or_error:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isstate(SH_INTERACTIVE) && !sferror(iop))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(--maxtry>0 && sh_isoption(SH_IGNOREEOF) &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin !sferror(sfstderr) && (shp->fdstatus[fno]&IOTTY))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfclrerr(iop);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,0,e_logout);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin else if(job_close(shp)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(errno==0 && sferror(iop) && --maxtry>0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfclrlock(iop);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfclrerr(iop);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin maxtry = IOMAXTRY;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isstate(SH_INTERACTIVE) && shp->hist_ptr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin job_wait((pid_t)0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hist_eof(shp->hist_ptr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsync(sfstderr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_HISTORY))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_onstate(SH_HISTORY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin job.waitall = job.curpgid = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.flags |= ERROR_INTERACTIVE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = (Shnode_t*)sh_parse(shp,iop,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!sh_isstate(SH_INTERACTIVE) && !sh_isstate(SH_CFLAG))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.flags &= ~ERROR_INTERACTIVE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->readscript = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isstate(SH_INTERACTIVE) && shp->hist_ptr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hist_flush(shp->hist_ptr);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_HISTORY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin execflags = sh_state(SH_ERREXIT)|sh_state(SH_INTERACTIVE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* The last command may not have to fork */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!sh_isstate(SH_PROFILE) && !sh_isstate(SH_INTERACTIVE) &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (fno<0 || !(shp->fdstatus[fno]&(IOTTY|IONOSEEK)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin && !sfreserve(iop,0,0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin execflags |= sh_state(SH_NOFORK);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.execbrk = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_exec(t,execflags);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->forked)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_offstate(SH_INTERACTIVE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto done;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* This is for sh -t */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isoption(SH_TFLAG) && !sh_isstate(SH_PROFILE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tdone++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_popcontext(&buff);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isstate(SH_INTERACTIVE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputc(sfstderr,'\n');
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin job_close(shp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(jmpval == SH_JMPSCRIPT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin siglongjmp(*shp->jmplist,jmpval);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(jmpval == SH_JMPEXIT)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_done(shp,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(fno>0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sh_close(fno);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(shp->st.filename)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free((void*)shp->st.filename);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.filename = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* prints out messages if files in list have been modified since last call */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void chkmail(Shell_t *shp, char *files)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *cp,*sp,*qp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char save;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct argnod *arglist=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int offset = staktell();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *savstak=stakptr(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct stat statb;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(*(cp=files) == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sp = cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* skip to : or end of string saving first '?' */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(qp=0;*sp && *sp != ':';sp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((*sp == '?' || *sp=='%') && qp == 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin qp = sp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin save = *sp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *sp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* change '?' to end-of-string */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(qp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *qp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* see if time has been modified since last checked
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * and the access time <= the modification time
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(stat(cp,&statb) >= 0 && statb.st_mtime >= mailtime
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin && statb.st_atime <= statb.st_mtime)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* check for directory */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!arglist && S_ISDIR(statb.st_mode))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* generate list of directory entries */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin path_complete(cp,"/*",&arglist);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * If the file has shrunk,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * or if the size is zero
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * then don't print anything
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(statb.st_size &&
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ( statb.st_ino != lastmail.st_ino
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin || statb.st_dev != lastmail.st_dev
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin || statb.st_size > lastmail.st_size))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* save and restore $_ */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char *save = shp->lastarg;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->lastarg = cp;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin errormsg(SH_DICT,0,sh_mactry(shp,qp?qp+1:(char*)e_mailmsg));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->lastarg = save;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin lastmail = statb;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(arglist)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp = arglist->argval;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin arglist = arglist->argchn.ap;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(qp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *qp = '?';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *sp++ = save;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin cp = sp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(save);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakset(savstak,offset);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef EXECARGS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#undef PSTAT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(_hdr_execargs) && defined(pdp11)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# include <execargs.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define EXECARGS 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(_lib_pstat) && defined(_sys_pstat)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# include <sys/pstat.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# define PSTAT 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(_lib_fork) && !defined(_NEXT_SOURCE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fix up command line for ps command
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * mode is 0 for initialization
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void fixargs(char **argv, int mode)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if EXECARGS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *execargs=(char *)argv;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static char *buff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int command_len;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int offset=0,size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef PSTAT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin union pstun un;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mode==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct pst_static st;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin un.pst_static = &st;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(pstat(PSTAT_STATIC, un, sizeof(struct pst_static), 1, 0)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin command_len = st.command_length;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin stakseek(command_len+2);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buff = stakseek(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(mode==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buff = argv[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(cp = *argv++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin command_len += strlen(cp)+1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(environ && *environ==buff+command_len)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(argv=environ; cp = *argv; cp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(command_len > CMD_LENGTH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin command_len = CMD_LENGTH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *argv++ = strdup(cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin command_len += strlen(cp)+1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin command_len -= 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* PSTAT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(command_len==0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while((cp = *argv++) && offset < command_len)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(offset + (size=strlen(cp)) >= command_len)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin size = command_len - offset;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memcpy(buff+offset,cp,size);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin offset += size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buff[offset++] = ' ';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin buff[offset-1] = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# ifdef PSTAT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin un.pst_command = stakptr(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pstat(PSTAT_SETCMD,un,0,0,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* PSTAT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* EXECARGS */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_fork */