summaryrefslogtreecommitdiff
path: root/usr/src/lib/libshell/common/bltins/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/lib/libshell/common/bltins/misc.c')
-rw-r--r--usr/src/lib/libshell/common/bltins/misc.c593
1 files changed, 0 insertions, 593 deletions
diff --git a/usr/src/lib/libshell/common/bltins/misc.c b/usr/src/lib/libshell/common/bltins/misc.c
deleted file mode 100644
index 04066e1a29..0000000000
--- a/usr/src/lib/libshell/common/bltins/misc.c
+++ /dev/null
@@ -1,593 +0,0 @@
-/***********************************************************************
-* *
-* This software is part of the ast package *
-* Copyright (c) 1982-2010 AT&T Intellectual Property *
-* and is licensed under the *
-* Common Public License, Version 1.0 *
-* by AT&T Intellectual Property *
-* *
-* A copy of the License is available at *
-* http://www.opensource.org/licenses/cpl1.0.txt *
-* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
-* *
-* Information and Software Systems Research *
-* AT&T Research *
-* Florham Park NJ *
-* *
-* David Korn <dgk@research.att.com> *
-* *
-***********************************************************************/
-#pragma prototyped
-/*
- * exec [arg...]
- * eval [arg...]
- * jobs [-lnp] [job...]
- * login [arg...]
- * let expr...
- * . file [arg...]
- * :, true, false
- * vpath [top] [base]
- * vmap [top] [base]
- * wait [job...]
- * shift [n]
- *
- * David Korn
- * AT&T Labs
- *
- */
-
-#include "defs.h"
-#include "variables.h"
-#include "shnodes.h"
-#include "path.h"
-#include "io.h"
-#include "name.h"
-#include "history.h"
-#include "builtins.h"
-#include "jobs.h"
-
-#define DOTMAX MAXDEPTH /* maximum level of . nesting */
-
-static void noexport(Namval_t*,void*);
-
-struct login
-{
- Shell_t *sh;
- int clear;
- char *arg0;
-};
-
-int
-b_exec(int argc __unused, char *argv[], void *extra)
-{
- struct login logdata;
- register int n;
- logdata.clear = 0;
- logdata.arg0 = 0;
- logdata.sh = ((Shbltin_t*)extra)->shp;
- logdata.sh->st.ioset = 0;
- while (n = optget(argv, sh_optexec)) switch (n)
- {
- case 'a':
- logdata.arg0 = opt_info.arg;
- argc = 0;
- break;
- case 'c':
- logdata.clear=1;
- break;
- case ':':
- errormsg(SH_DICT,2, "%s", opt_info.arg);
- break;
- case '?':
- errormsg(SH_DICT,ERROR_usage(0), "%s", opt_info.arg);
- return(2);
- }
- argv += opt_info.index;
- if(error_info.errors)
- errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
- if(*argv)
- B_login(0,argv,(void*)&logdata);
- return(0);
-}
-
-static void noexport(register Namval_t* np, void *data)
-{
- NOT_USED(data);
- nv_offattr(np,NV_EXPORT);
-}
-
-int B_login(int argc,char *argv[],void *extra)
-{
- struct checkpt *pp;
- register struct login *logp=0;
- register Shell_t *shp;
- const char *pname;
- if(argc)
- shp = ((Shbltin_t*)extra)->shp;
- else
- {
- logp = (struct login*)extra;
- shp = logp->sh;
- }
- pp = (struct checkpt*)shp->jmplist;
- if(sh_isoption(SH_RESTRICTED))
- errormsg(SH_DICT,ERROR_exit(1),e_restricted,argv[0]);
- else
- {
- register struct argnod *arg=shp->envlist;
- register Namval_t* np;
- register char *cp;
- if(shp->subshell && !shp->subshare)
- sh_subfork();
- if(logp && logp->clear)
- {
-#ifdef _ENV_H
- env_close(shp->env);
- shp->env = env_open((char**)0,3);
-#else
- nv_scan(shp->var_tree,noexport,0,NV_EXPORT,NV_EXPORT);
-#endif
- }
- while(arg)
- {
- if((cp=strchr(arg->argval,'=')) &&
- (*cp=0,np=nv_search(arg->argval,shp->var_tree,0)))
- {
- nv_onattr(np,NV_EXPORT);
- sh_envput(shp->env,np);
- }
- if(cp)
- *cp = '=';
- arg=arg->argnxt.ap;
- }
- pname = argv[0];
- if(logp && logp->arg0)
- argv[0] = logp->arg0;
-#ifdef JOBS
- if(job_close(shp) < 0)
- return(1);
-#endif /* JOBS */
- /* force bad exec to terminate shell */
- pp->mode = SH_JMPEXIT;
- sh_sigreset(2);
- sh_freeup(shp);
- path_exec(pname,argv,NIL(struct argnod*));
- sh_done(shp,0);
- }
- return(1);
-}
-
-int b_let(int argc,char *argv[],void *extra)
-{
- register int r;
- register char *arg;
- NOT_USED(argc);
- NOT_USED(extra);
- while (r = optget(argv,sh_optlet)) switch (r)
- {
- case ':':
- errormsg(SH_DICT,2, "%s", opt_info.arg);
- break;
- case '?':
- errormsg(SH_DICT,ERROR_usage(2), "%s", opt_info.arg);
- break;
- }
- argv += opt_info.index;
- if(error_info.errors || !*argv)
- errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
- while(arg= *argv++)
- r = !sh_arith(arg);
- return(r);
-}
-
-int b_eval(int argc,char *argv[], void *extra)
-{
- register int r;
- register Shell_t *shp = ((Shbltin_t*)extra)->shp;
- NOT_USED(argc);
- while (r = optget(argv,sh_opteval)) switch (r)
- {
- case ':':
- errormsg(SH_DICT,2, "%s", opt_info.arg);
- break;
- case '?':
- errormsg(SH_DICT,ERROR_usage(0), "%s",opt_info.arg);
- return(2);
- }
- if(error_info.errors)
- errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
- argv += opt_info.index;
- if(*argv && **argv)
- {
- sh_offstate(SH_MONITOR);
- sh_eval(sh_sfeval(argv),0);
- }
- return(shp->exitval);
-}
-
-int b_dot_cmd(register int n,char *argv[],void* extra)
-{
- register char *script;
- register Namval_t *np;
- register int jmpval;
- register Shell_t *shp = ((Shbltin_t*)extra)->shp;
- struct sh_scoped savst, *prevscope = shp->st.self;
- char *filename=0;
- int fd;
- struct dolnod *argsave=0, *saveargfor;
- struct checkpt buff;
- Sfio_t *iop=0;
- short level;
- while (n = optget(argv,sh_optdot)) switch (n)
- {
- case ':':
- errormsg(SH_DICT,2, "%s", opt_info.arg);
- break;
- case '?':
- errormsg(SH_DICT,ERROR_usage(0), "%s",opt_info.arg);
- return(2);
- }
- argv += opt_info.index;
- script = *argv;
- if(error_info.errors || !script)
- errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
- if(shp->dot_depth+1 > DOTMAX)
- errormsg(SH_DICT,ERROR_exit(1),e_toodeep,script);
- if(!(np=shp->posix_fun))
- {
- /* check for KornShell style function first */
- np = nv_search(script,shp->fun_tree,0);
- if(np && is_afunction(np) && !nv_isattr(np,NV_FPOSIX))
- {
- if(!np->nvalue.ip)
- {
- path_search(script,NIL(Pathcomp_t**),0);
- if(np->nvalue.ip)
- {
- if(nv_isattr(np,NV_FPOSIX))
- np = 0;
- }
- else
- errormsg(SH_DICT,ERROR_exit(1),e_found,script);
- }
- }
- else
- np = 0;
- if(!np)
- {
- if((fd=path_open(script,path_get(script))) < 0)
- errormsg(SH_DICT,ERROR_system(1),e_open,script);
- filename = path_fullname(stkptr(shp->stk,PATH_OFFSET));
- }
- }
- *prevscope = shp->st;
- shp->st.lineno = np?((struct functnod*)nv_funtree(np))->functline:1;
- shp->st.var_local = shp->st.save_tree = shp->var_tree;
- if(filename)
- {
- shp->st.filename = filename;
- shp->st.lineno = 1;
- }
- level = shp->fn_depth+shp->dot_depth+1;
- nv_putval(SH_LEVELNOD,(char*)&level,NV_INT16);
- shp->st.prevst = prevscope;
- shp->st.self = &savst;
- shp->topscope = (Shscope_t*)shp->st.self;
- prevscope->save_tree = shp->var_tree;
- shp->st.cmdname = argv[0];
- if(np)
- shp->st.filename = np->nvalue.rp->fname;
- nv_putval(SH_PATHNAMENOD, shp->st.filename ,NV_NOFREE);
- shp->posix_fun = 0;
- if(np || argv[1])
- argsave = sh_argnew(shp,argv,&saveargfor);
- sh_pushcontext(&buff,SH_JMPDOT);
- jmpval = sigsetjmp(buff.buff,0);
- if(jmpval == 0)
- {
- shp->dot_depth++;
- if(np)
- sh_exec((Shnode_t*)(nv_funtree(np)),sh_isstate(SH_ERREXIT));
- else
- {
- char buff[IOBSIZE+1];
- iop = sfnew(NIL(Sfio_t*),buff,IOBSIZE,fd,SF_READ);
- sh_eval(iop,0);
- }
- }
- sh_popcontext(&buff);
- if(!np)
- free((void*)shp->st.filename);
- shp->dot_depth--;
- if((np || argv[1]) && jmpval!=SH_JMPSCRIPT)
- sh_argreset(shp,argsave,saveargfor);
- else
- {
- prevscope->dolc = shp->st.dolc;
- prevscope->dolv = shp->st.dolv;
- }
- if (shp->st.self != &savst)
- *shp->st.self = shp->st;
- /* only restore the top Shscope_t portion for posix functions */
- memcpy((void*)&shp->st, (void*)prevscope, sizeof(Shscope_t));
- shp->topscope = (Shscope_t*)prevscope;
- nv_putval(SH_PATHNAMENOD, shp->st.filename ,NV_NOFREE);
- if(shp->exitval > SH_EXITSIG)
- sh_fault(shp->exitval&SH_EXITMASK);
- if(jmpval && jmpval!=SH_JMPFUN)
- siglongjmp(*shp->jmplist,jmpval);
- return(shp->exitval);
-}
-
-/*
- * null, true command
- */
-int b_true(int argc,register char *argv[],void *extra)
-{
- NOT_USED(argc);
- NOT_USED(argv[0]);
- NOT_USED(extra);
- return(0);
-}
-
-/*
- * false command
- */
-int b_false(int argc,register char *argv[], void *extra)
-{
- NOT_USED(argc);
- NOT_USED(argv[0]);
- NOT_USED(extra);
- return(1);
-}
-
-int b_shift(register int n, register char *argv[], void *extra)
-{
- register char *arg;
- register Shell_t *shp = ((Shbltin_t*)extra)->shp;
- while((n = optget(argv,sh_optshift))) switch(n)
- {
- case ':':
- errormsg(SH_DICT,2, "%s", opt_info.arg);
- break;
- case '?':
- errormsg(SH_DICT,ERROR_usage(0), "%s",opt_info.arg);
- return(2);
- }
- if(error_info.errors)
- errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
- argv += opt_info.index;
- n = ((arg= *argv)?(int)sh_arith(arg):1);
- if(n<0 || shp->st.dolc<n)
- errormsg(SH_DICT,ERROR_exit(1),e_number,arg);
- else
- {
- shp->st.dolv += n;
- shp->st.dolc -= n;
- }
- return(0);
-}
-
-int b_wait(int n,register char *argv[],void *extra)
-{
- register Shell_t *shp = ((Shbltin_t*)extra)->shp;
- while((n = optget(argv,sh_optwait))) switch(n)
- {
- case ':':
- errormsg(SH_DICT,2, "%s", opt_info.arg);
- break;
- case '?':
- errormsg(SH_DICT,ERROR_usage(2), "%s",opt_info.arg);
- break;
- }
- if(error_info.errors)
- errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
- argv += opt_info.index;
- job_bwait(argv);
- return(shp->exitval);
-}
-
-#ifdef JOBS
-# if 0
- /* for the dictionary generator */
- int b_fg(int n,char *argv[],void *extra){}
- int b_disown(int n,char *argv[],void *extra){}
-# endif
-int b_bg(register int n,register char *argv[],void *extra)
-{
- register int flag = **argv;
- register Shell_t *shp = ((Shbltin_t*)extra)->shp;
- register const char *optstr = sh_optbg;
- if(*argv[0]=='f')
- optstr = sh_optfg;
- else if(*argv[0]=='d')
- optstr = sh_optdisown;
- while((n = optget(argv,optstr))) switch(n)
- {
- case ':':
- errormsg(SH_DICT,2, "%s", opt_info.arg);
- break;
- case '?':
- errormsg(SH_DICT,ERROR_usage(2), "%s",opt_info.arg);
- break;
- }
- if(error_info.errors)
- errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
- argv += opt_info.index;
- if(!sh_isoption(SH_MONITOR) || !job.jobcontrol)
- {
- if(sh_isstate(SH_INTERACTIVE))
- errormsg(SH_DICT,ERROR_exit(1),e_no_jctl);
- return(1);
- }
- if(flag=='d' && *argv==0)
- argv = (char**)0;
- if(job_walk(sfstdout,job_switch,flag,argv))
- errormsg(SH_DICT,ERROR_exit(1),e_no_job);
- return(shp->exitval);
-}
-
-int b_jobs(register int n,char *argv[],void *extra)
-{
- register int flag = 0;
- register Shell_t *shp = ((Shbltin_t*)extra)->shp;
- while((n = optget(argv,sh_optjobs))) switch(n)
- {
- case 'l':
- flag = JOB_LFLAG;
- break;
- case 'n':
- flag = JOB_NFLAG;
- break;
- case 'p':
- flag = JOB_PFLAG;
- break;
- case ':':
- errormsg(SH_DICT,2, "%s", opt_info.arg);
- break;
- case '?':
- errormsg(SH_DICT,ERROR_usage(2), "%s",opt_info.arg);
- break;
- }
- argv += opt_info.index;
- if(error_info.errors)
- errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
- if(*argv==0)
- argv = (char**)0;
- if(job_walk(sfstdout,job_list,flag,argv))
- errormsg(SH_DICT,ERROR_exit(1),e_no_job);
- job_wait((pid_t)0);
- return(shp->exitval);
-}
-#endif
-
-#ifdef _cmd_universe
-/*
- * There are several universe styles that are masked by the getuniv(),
- * setuniv() calls.
- */
-int b_universe(int argc, char *argv[],void *extra)
-{
- register char *arg;
- register int n;
- NOT_USED(extra);
- while((n = optget(argv,sh_optuniverse))) switch(n)
- {
- case ':':
- errormsg(SH_DICT,2, "%s", opt_info.arg);
- break;
- case '?':
- errormsg(SH_DICT,ERROR_usage(2), "%s",opt_info.arg);
- break;
- }
- argv += opt_info.index;
- argc -= opt_info.index;
- if(error_info.errors || argc>1)
- errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
- if(arg = argv[0])
- {
- if(!astconf("UNIVERSE",0,arg))
- errormsg(SH_DICT,ERROR_exit(1), e_badname,arg);
- }
- else
- {
- if(!(arg=astconf("UNIVERSE",0,0)))
- errormsg(SH_DICT,ERROR_exit(1),e_nouniverse);
- else
- sfputr(sfstdout,arg,'\n');
- }
- return(0);
-}
-#endif /* cmd_universe */
-
-#if SHOPT_FS_3D
-# if 0
- /* for the dictionary generator */
- int b_vmap(int argc,char *argv[], void *extra){}
-# endif
- int b_vpath(register int argc,char *argv[], void *extra)
- {
- register int flag, n;
- register const char *optstr;
- register char *vend;
- register Shell_t *shp = ((Shbltin_t*)extra)->shp;
- if(argv[0][1]=='p')
- {
- optstr = sh_optvpath;
- flag = FS3D_VIEW;
- }
- else
- {
- optstr = sh_optvmap;
- flag = FS3D_VERSION;
- }
- while(n = optget(argv, optstr)) switch(n)
- {
- case ':':
- errormsg(SH_DICT,2, "%s", opt_info.arg);
- break;
- case '?':
- errormsg(SH_DICT,ERROR_usage(2), "%s",opt_info.arg);
- break;
- }
- if(error_info.errors)
- errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
- if(!shp->lim.fs3d)
- goto failed;
- argv += opt_info.index;
- argc -= opt_info.index;
- switch(argc)
- {
- case 0:
- case 1:
- flag |= FS3D_GET;
- if((n = mount(*argv,(char*)0,flag,0)) >= 0)
- {
- vend = stkalloc(shp->stk,++n);
- n = mount(*argv,vend,flag|FS3D_SIZE(n),0);
- }
- if(n < 0)
- goto failed;
- if(argc==1)
- {
- sfprintf(sfstdout,"%s\n",vend);
- break;
- }
- n = 0;
- while(flag = *vend++)
- {
- if(flag==' ')
- {
- flag = e_sptbnl[n+1];
- n = !n;
- }
- sfputc(sfstdout,flag);
- }
- if(n)
- sfputc(sfstdout,'\n');
- break;
- default:
- if((argc&1))
- errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0));
- /*FALLTHROUGH*/
- case 2:
- if(!shp->lim.fs3d)
- goto failed;
- if(shp->subshell && !shp->subshare)
- sh_subfork();
- for(n=0;n<argc;n+=2)
- {
- if(mount(argv[n+1],argv[n],flag,0)<0)
- goto failed;
- }
- }
- return(0);
-failed:
- if(argc>1)
- errormsg(SH_DICT,ERROR_exit(1),e_cantset,flag==2?e_mapping:e_versions);
- else
- errormsg(SH_DICT,ERROR_exit(1),e_cantget,flag==2?e_mapping:e_versions);
- return(1);
- }
-#endif /* SHOPT_FS_3D */
-