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* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * UNIX shell
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * S. R. Bourne
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Rewritten By David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# include <nc.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _hdr_nc */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* These routines are referenced by this module */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static void fixargs(char**,int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern char **environ;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sigvec(sig,NIL(struct sigvec*),&vec)>=0 && vec.sv_mask)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_sigvec */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* check for interrupts during tree walks */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int fts_sigcheck(FTS* fp, FTSENT* ep, void* context)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(-1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_fts_notify */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * search for file and exfile() it if it exists
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * 1 returned if file found, 0 otherwise
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint sh_source(Shell_t *shp, Sfio_t *iop, const char *file)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!file || !*file || (fd = path_open(file, PATHCOMP)) < 0)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz REGRESS(source, "sh_source", ("%s:ENOENT", file));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin shp->st.filename = path_fullname(stakptr(PATH_OFFSET));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinint sh_main(int ac, char *av[], Shinit_f userinit)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin /* This is to clear mask that may be left on by rlogin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_sigvec */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _hdr_nc */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_fts_notify */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* begin script execution here */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* set pidname '$$' */
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 if(!sh_isoption(SH_RC) && (sh_isoption(SH_BASH) && !sh_isoption(SH_POSIX)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SIGXCPU */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SIGXFSZ */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* system profile */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!sh_isoption(SH_NOUSRPROFILE) && !sh_isoption(SH_PRIVILEGED))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while ((name = *files++) && !sh_source(shp, iop, sh_mactry(shp,name)));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* make sure PWD is set up correctly */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!sh_isoption(SH_NOUSRPROFILE) && !sh_isoption(SH_PRIVILEGED) && sh_isoption(SH_RC))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sh_source(shp, iop, shp->rcfile ? shp->rcfile : sh_mactry(shp,(char*)e_bash_rc));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(sh_isoption(SH_INTERACTIVE) && sh_isoption(SH_PRIVILEGED))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* open input file if specified */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin iop = sfnew(NIL(Sfio_t*),shp->comdiv,strlen(shp->comdiv),0,SF_STRING|SF_READ);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* open stream should have been passed into shell */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * try to undo effect of solaris 2.5+
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * change for argv for setuid scripts
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 av[0] = (type & SH_TYPE_LOGIN) ? cp : path_basename(cp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* exec to change $0 for ps */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* exec fails */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((fdin=sh_open(name,O_RDONLY,0))>=0 &&(fstat(fdin,&statb)<0 || S_ISDIR(statb.st_mode)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_system(ERROR_NOEXEC),e_open,name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* try sh -c 'name "$@"' */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_ACCT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* NOTREACHED */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * iop is not null when the input is a string
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fdin is the input file descriptor
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void exfile(register Shell_t *shp, register Sfio_t *iop,register int fno)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* open input stream */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(SH_PATHNAMENOD, shp->st.filename ,NV_NOFREE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin nv_putval(PS1NOD,(shp->euserid?e_stdprompt:e_supprompt),NV_RDONLY);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* check for return from profile or env file */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(sh_isstate(SH_PROFILE) && (jmpval==SH_JMPFUN || jmpval==SH_JMPEXIT))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if(!sh_isoption(SH_INTERACTIVE) || sh_isstate(SH_FORKED) || (jmpval > SH_JMPERREXIT && job_close(shp) >=0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* skip over remaining input */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while(fcget()>0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* make sure that we own the terminal */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SIGTSTP */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* error return here */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* command loop */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* -eim flags don't apply to profiles */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* JOBS */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((mail=nv_getval(MAILPNOD)) || (mail=nv_getval(MAILNOD)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* sets timeout for command entry */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_TIMEOUT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin errormsg(SH_DICT,ERROR_warn(0),"%d: mode changed to JMP_EXIT",getpid());
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!sh_isstate(SH_INTERACTIVE) && !sh_isstate(SH_CFLAG))
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 /* This is for sh -t */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* prints out messages if files in list have been modified since last call */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* skip to : or end of string saving first '?' */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* change '?' to end-of-string */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* see if time has been modified since last checked
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * and the access time <= the modification time
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* check for directory */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* generate list of directory entries */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * If the file has shrunk,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * or if the size is zero
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * then don't print anything
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* save and restore $_ */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin errormsg(SH_DICT,0,sh_mactry(shp,qp?qp+1:(char*)e_mailmsg));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fix up command line for ps command
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * mode is 0 for initialization
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static char *buff;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char *cp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(pstat(PSTAT_STATIC, un, sizeof(struct pst_static), 1, 0)<0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* PSTAT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# endif /* PSTAT */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* EXECARGS */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* _lib_fork */