int main(int argc, char *argv[], void *extra) { register int n; register char *cp; char *delim = "#"; int width = 80; NoP(argc); NoP(extra); error_info.id = "banner"; while (n = optget(argv, usage)) switch (n) { case 'd': delim = opt_info.arg; break; case 'w': width = opt_info.num; break; case ':': error(2, "%s", opt_info.arg); break; case '?': error(ERROR_usage(2), "%s", opt_info.arg); break; } argv += opt_info.index; if(error_info.errors || !*argv) error(ERROR_usage(2), "%s", optusage((char*)0)); sfset(sfstdout,SF_LINE,0); while(cp = *argv++) banner(cp,delim,width); exit(0); }
// // Builtin `wait`. // int b_wait(int n, char *argv[], Shbltin_t *context) { Shell_t *shp = context->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); __builtin_unreachable(); } default: { break; } } } if (error_info.errors) { errormsg(SH_DICT, ERROR_usage(2), "%s", optusage(NULL)); __builtin_unreachable(); } argv += opt_info.index; job_bwait(argv); return shp->exitval; }
int b_logname(int argc, char** argv, void* context) { register char* logname; cmdinit(argc, argv, context, ERROR_CATALOG, 0); for (;;) { switch (optget(argv, usage)) { case ':': error(2, "%s", opt_info.arg); continue; case '?': error(ERROR_usage(2), "%s", opt_info.arg); continue; } break; } if (error_info.errors) error(ERROR_usage(2), "%s", optusage(NiL)); if (!(logname = getlogin())) logname = fmtuid(getuid()); sfputr(sfstdout, logname, '\n'); return 0; }
int b_eval(int argc, char *argv[], Shbltin_t *context) { int r; Shell_t *shp = context->shp; UNUSED(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; } default: { break; } } } if (error_info.errors) { errormsg(SH_DICT, ERROR_usage(2), "%s", optusage(NULL)); __builtin_unreachable(); } argv += opt_info.index; if (*argv && **argv) { sh_offstate(shp, SH_MONITOR); sh_eval(shp, sh_sfeval((const char **)argv), 0); } return shp->exitval; }
// // Builtin `shift`. // int b_shift(int n, char *argv[], Shbltin_t *context) { char *arg; Shell_t *shp = context->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; } default: { break; } } } if (error_info.errors) { errormsg(SH_DICT, ERROR_usage(2), "%s", optusage(NULL)); __builtin_unreachable(); } argv += opt_info.index; n = ((arg = *argv) ? (int)sh_arith(shp, arg) : 1); if (n < 0 || shp->st.dolc < n) { errormsg(SH_DICT, ERROR_exit(1), e_number, arg); __builtin_unreachable(); } else { shp->st.dolv += n; shp->st.dolc -= n; } return 0; }
int b_exec(int argc,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); }
int b_let(int argc, char *argv[], Shbltin_t *context) { int r; char *arg; Shell_t *shp = context->shp; UNUSED(argc); 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); __builtin_unreachable(); } default: { break; } } } argv += opt_info.index; if (error_info.errors || !*argv) { errormsg(SH_DICT, ERROR_usage(2), "%s", optusage(NULL)); __builtin_unreachable(); } while ((arg = *argv++)) r = !sh_arith(shp, arg); return r; }
int b_break(register int n, register char *argv[],Shbltin_t *context) { char *arg; register int cont= **argv=='c'; register Shell_t *shp = context->shp; while((n = optget(argv,cont?sh_optcont:sh_optbreak))) 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=1; if(arg= *argv) { n = (int)strtol(arg,&arg,10); if(n<=0 || *arg) errormsg(SH_DICT,ERROR_exit(1),e_nolabels,*argv); } if(shp->st.loopcnt) { shp->st.execbrk = shp->st.breakcnt = n; if(shp->st.breakcnt > shp->st.loopcnt) shp->st.breakcnt = shp->st.loopcnt; if(cont) shp->st.breakcnt = -shp->st.breakcnt; } return(0); }
int b_return(register int n, register char *argv[],Shbltin_t *context) { register char *arg; register Shell_t *shp = context->shp; struct checkpt *pp = (struct checkpt*)shp->jmplist; const char *options = (**argv=='r'?sh_optreturn:sh_optexit); while((n = optget(argv,options))) switch(n) { case ':': if(!strmatch(argv[opt_info.index],"[+-]+([0-9])")) errormsg(SH_DICT,2, "%s", opt_info.arg); goto done; case '?': errormsg(SH_DICT,ERROR_usage(0), "%s", opt_info.arg); return(2); } done: if(error_info.errors) errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0)); pp->mode = (**argv=='e'?SH_JMPEXIT:SH_JMPFUN); argv += opt_info.index; n = (((arg= *argv)?(int)strtol(arg, (char**)0, 10):shp->oldexit)); if(n<0 || n==256 || n > SH_EXITMASK+shp->gd->sigmax) n &= ((unsigned int)n)&SH_EXITMASK; /* return outside of function, dotscript and profile is exit */ if(shp->fn_depth==0 && shp->dot_depth==0 && !sh_isstate(shp,SH_PROFILE)) pp->mode = SH_JMPEXIT; sh_exit(shp,shp->savexit=n); return(1); }
int main(int argc, char *argv[]) { register int n; NoP(argc); error_info.id = "mesg"; for (;;) { switch (optget(argv, usage)) { case ':': error(2, "%s", opt_info.arg); break; case '?': error(ERROR_usage(2), "%s", opt_info.arg); break; } break; } argv += opt_info.index; n = 0; if(error_info.errors || (*argv && (n= **argv) !='y' && n!='n')) error(ERROR_usage(2), "%s", optusage(NiL)); return mesg(n); }
int b_ldd(int argc, char** argv) { int n; char* cp; SetErrorMode(SEM_NOGPFAULTERRORBOX); cmdinit(argc, argv, 0, 0, 0); for (;;) { switch (optget(argv, usage)) { case '?': error(ERROR_usage(2), "%s", opt_info.arg); continue; case ':': error(2, "%s", opt_info.arg); continue; } break; } argv += opt_info.index; argc -= opt_info.index; if (error_info.errors || !*argv) error(ERROR_usage(2), "%s", optusage((char*)0)); n = 0; while (cp = *argv++) { if (argc > 1) sfprintf(sfstdout, "%s:\n", cp); if (doldd(cp) < 0) n = 1; } return n; }
int b_sync(int argc, char** argv, Shbltin_t* context) { cmdinit(argc, argv, context, ERROR_CATALOG, 0); for (;;) { switch (optget(argv, usage)) { case ':': error(2, "%s", opt_info.arg); break; case '?': error(ERROR_usage(2), "%s", opt_info.arg); break; } break; } argv += opt_info.index; if (error_info.errors || *argv) error(ERROR_usage(2), "%s", optusage(NiL)); #if _lib_sync sync(); #else error(ERROR_usage(2), "failed -- the native system does not provide a sync(2) call"); #endif return 0; }
int b_comm(int argc, char *argv[], Shbltin_t* context) { register int mode = C_FILE1|C_FILE2|C_COMMON; register char *cp; Sfio_t *f1, *f2; cmdinit(argc, argv, context, ERROR_CATALOG, 0); for (;;) { switch (optget(argv, usage)) { case '1': mode &= ~C_FILE1; continue; case '2': mode &= ~C_FILE2; continue; case '3': mode &= ~C_COMMON; continue; case ':': error(2, "%s",opt_info.arg); break; case '?': error(ERROR_usage(2), "%s",opt_info.arg); break; } break; } argv += opt_info.index; argc -= opt_info.index; if(error_info.errors || argc!=2) error(ERROR_usage(2),"%s",optusage(NiL)); cp = *argv++; if(streq(cp,"-")) f1 = sfstdin; else if(!(f1 = sfopen(NiL, cp,"r"))) error(ERROR_system(1),"%s: cannot open",cp); cp = *argv; if(streq(cp,"-")) f2 = sfstdin; else if(!(f2 = sfopen(NiL, cp,"r"))) error(ERROR_system(1),"%s: cannot open",cp); if(mode) { if(comm(f1,f2,sfstdout,mode) < 0) error(ERROR_system(1)," write error"); } else if(f1==sfstdin || f2==sfstdin) sfseek(sfstdin,(Sfoff_t)0,SEEK_END); if(f1!=sfstdin) sfclose(f1); if(f2!=sfstdin) sfclose(f2); return error_info.errors; }
int b_unixpath(int argc, char *argv[], void *context) { int flags = UWIN_W2U; int quote = 0; int n; char* cp; const char* dp; char buff[PATH_MAX+1]; NoP(argc); #if _AST_VERSION >= 20060701L cmdinit(argc, argv, context, NULL, 0); #else cmdinit(argv, context, NULL, 0); #endif while (n = optget(argv, usage)) switch (n) { case 'a': flags |= UWIN_U2W; break; case 'q': quote = 1; break; case ':': error(2, "%s", opt_info.arg); break; case '?': error(ERROR_usage(2), "%s", opt_info.arg); break; } argv += opt_info.index; if(!*argv || error_info.errors) error(ERROR_usage(2),"%s",optusage(NiL)); while(cp = *argv++) { uwin_pathmap(cp, buff, sizeof(buff), flags); if(quote) { for(dp=special;*dp;dp++) { if(strchr(buff, *dp)) break; } if(*dp) { sfprintf(sfstdout,"'%s'\n",buff); continue; } } sfprintf(sfstdout,"%s\n",buff); } return(0); }
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); } }
int b_mkfifo(int argc, char *argv[], void* context) { register char* arg; register mode_t mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH; register mode_t mask = 0; register int mflag = 0; cmdinit(argc, argv, context, ERROR_CATALOG, 0); for (;;) { switch (optget(argv, usage)) { case 'm': mflag = 1; mode = strperm(arg = opt_info.arg, &opt_info.arg, mode); if (*opt_info.arg) error(ERROR_exit(0), "%s: invalid mode", arg); continue; case ':': error(2, "%s", opt_info.arg); break; case '?': error(ERROR_usage(2), "%s", opt_info.arg); break; } break; } argv += opt_info.index; if (error_info.errors || !*argv) error(ERROR_usage(2), "%s", optusage(NiL)); mask = umask(0); if (!mflag) { mode &= ~mask; umask(mask); mask = 0; } while (arg = *argv++) if (mkfifo(arg, mode) < 0) error(ERROR_system(0), "%s:", arg); if (mask) umask(mask); return error_info.errors != 0; }
int b_expr(int argc, char** argv, Shbltin_t* context) { State_t state; Node_t node; int n; cmdinit(argc, argv, context, ERROR_CATALOG, 0); state.standard = !!conformance(0, 0); #if 0 if (state.standard) state.arglist = argv+1; else #endif { while (n=optget(argv, usage)) { /* * NOTE: this loop ignores all but literal -- and -? * out of kindness for obsolescent usage * (and is ok with the standard) but strict * getopt conformance would give usage for all * unknown - options */ if(n=='?') error(ERROR_usage(2), "%s", opt_info.arg); if (opt_info.option[1] != '?') break; error(ERROR_usage(2), "%s", opt_info.arg); } if (error_info.errors) error(ERROR_usage(2),"%s",optusage((char*)0)); state.arglist = argv+opt_info.index; } if (expr_or(&state, &node)) error(ERROR_exit(2),"syntax error"); if (node.type&T_STR) { if (*node.str) sfprintf(sfstdout,"%s\n",node.str); } else sfprintf(sfstdout,"%d\n",node.num); return numeric(&node)?node.num==0:*node.str==0; }
// // Builtin `bg`. // int b_bg(int n, char *argv[], Shbltin_t *context) { int flag = **argv; Shell_t *shp = context->shp; 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); __builtin_unreachable(); } default: { break; } } } if (error_info.errors) { errormsg(SH_DICT, ERROR_usage(2), "%s", optusage(NULL)); __builtin_unreachable(); } argv += opt_info.index; if (!sh_isoption(shp, SH_MONITOR) || !job.jobcontrol) { if (sh_isstate(shp, SH_INTERACTIVE)) { errormsg(SH_DICT, ERROR_exit(1), e_no_jctl); __builtin_unreachable(); } return 1; } if (flag == 'd' && *argv == 0) argv = NULL; if (job_walk(shp, sfstdout, job_switch, flag, argv)) { errormsg(SH_DICT, ERROR_exit(1), e_no_job); __builtin_unreachable(); } return shp->exitval; }
// // Builtin `jobs`. // int b_jobs(int n, char *argv[], Shbltin_t *context) { int flag = 0; Shell_t *shp = context->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); __builtin_unreachable(); } default: { break; } } } argv += opt_info.index; if (error_info.errors) { errormsg(SH_DICT, ERROR_usage(2), "%s", optusage(NULL)); __builtin_unreachable(); } if (*argv == 0) argv = NULL; if (job_walk(shp, sfstdout, job_list, flag, argv)) { errormsg(SH_DICT, ERROR_exit(1), e_no_job); __builtin_unreachable(); } job_wait((pid_t)0); return shp->exitval; }
int b_dirname(int argc, char** argv, Shbltin_t* context) { int mode = 0; char buf[PATH_MAX]; cmdinit(argc, argv, context, ERROR_CATALOG, 0); for (;;) { switch (optget(argv, usage)) { case 'f': mode |= PATH_REGULAR; continue; case 'r': mode &= ~PATH_REGULAR; mode |= PATH_READ; continue; case 'x': mode |= PATH_EXECUTE; continue; case ':': error(2, "%s", opt_info.arg); break; case '?': error(ERROR_usage(2), "%s", opt_info.arg); break; } break; } argv += opt_info.index; argc -= opt_info.index; if(error_info.errors || argc != 1) error(ERROR_usage(2),"%s", optusage(NiL)); if(!mode) l_dirname(sfstdout,argv[0]); else if(pathpath(argv[0], "", mode, buf, sizeof(buf))) sfputr(sfstdout, buf, '\n'); else error(1|ERROR_WARNING, "%s: relative path not found", argv[0]); return 0; }
int b_basename(int argc, register char** argv, Shbltin_t* context) { char* string; char* suffix = 0; int all = 0; cmdinit(argc, argv, context, ERROR_CATALOG, 0); for (;;) { switch (optget(argv, usage)) { case 'a': all = 1; continue; case 's': all = 1; suffix = opt_info.arg; continue; case ':': error(2, "%s", opt_info.arg); break; case '?': error(ERROR_usage(2), "%s", opt_info.arg); break; } break; } argv += opt_info.index; argc -= opt_info.index; if (error_info.errors || argc < 1 || !all && argc > 2) error(ERROR_usage(2), "%s", optusage(NiL)); if (!all) namebase(sfstdout, argv[0], argv[1]); else while (string = *argv++) namebase(sfstdout, string, suffix); return 0; }
/* * command is called with argc==0 when checking for -V or -v option * In this case return 0 when -v or -V or unknown option, otherwise * the shift count to the command is returned */ int b_command(register int argc,char *argv[],Shbltin_t *context) { register int n, flags=0; register Shell_t *shp = context->shp; opt_info.index = opt_info.offset = 0; while((n = optget(argv,sh_optcommand))) switch(n) { case 'p': if(sh_isoption(SH_RESTRICTED)) errormsg(SH_DICT,ERROR_exit(1),e_restricted,"-p"); sh_onstate(SH_DEFPATH); break; case 'v': flags |= X_FLAG; break; case 'V': flags |= V_FLAG; break; case 'x': shp->xargexit = 1; break; case ':': if(argc==0) return(0); errormsg(SH_DICT,2, "%s", opt_info.arg); break; case '?': if(argc==0) return(0); errormsg(SH_DICT,ERROR_usage(2), "%s", opt_info.arg); break; } if(argc==0) return(flags?0:opt_info.index); argv += opt_info.index; if(error_info.errors || !*argv) errormsg(SH_DICT,ERROR_usage(2),"%s", optusage((char*)0)); return(whence(shp,argv, flags)); }
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_basename(int argc,register char *argv[], void* context) { register int n; cmdinit(argc, argv, context, ERROR_CATALOG, 0); while (n = optget(argv, usage)) switch (n) { case ':': error(2, "%s", opt_info.arg); break; case '?': error(ERROR_usage(2), "%s", opt_info.arg); break; } argv += opt_info.index; argc -= opt_info.index; if(error_info.errors || argc < 1 || argc > 2) error(ERROR_usage(2), "%s", optusage(NiL)); namebase(sfstdout,argv[0],argv[1]); return(0); }
// // Builtin `exec`. // int b_exec(int argc, char *argv[], Shbltin_t *context) { UNUSED(argc); struct login logdata; int n; logdata.clear = 0; logdata.arg0 = NULL; logdata.sh = context->shp; logdata.sh->st.ioset = 0; while ((n = optget(argv, sh_optexec))) { switch (n) { case 'a': { logdata.arg0 = opt_info.arg; 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; } default: { break; } } } argv += opt_info.index; if (error_info.errors) { errormsg(SH_DICT, ERROR_usage(2), "%s", optusage(NULL)); __builtin_unreachable(); } if (*argv) B_login(0, argv, (Shbltin_t *)&logdata); return 0; }
/* * for the whence command */ int b_whence(int argc,char *argv[],Shbltin_t *context) { register int flags=0, n; register Shell_t *shp = context->shp; NOT_USED(argc); if(*argv[0]=='t') flags = V_FLAG; while((n = optget(argv,sh_optwhence))) switch(n) { case 'a': flags |= A_FLAG; /* FALL THRU */ case 'v': flags |= V_FLAG; break; case 'f': flags |= F_FLAG; break; case 'p': flags |= P_FLAG; flags &= ~V_FLAG; break; case 'q': flags |= Q_FLAG; 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 || !*argv) errormsg(SH_DICT,ERROR_usage(2),optusage((char*)0)); return(whence(shp, argv, flags)); }
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_trap(int argc,char *argv[],void *extra) { register char *arg = argv[1]; register int sig, clear = 0, dflag = 0, pflag = 0; register Shell_t *shp = ((Shbltin_t*)extra)->shp; NOT_USED(argc); while (sig = optget(argv, sh_opttrap)) switch (sig) { case 'p': pflag=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); break; } argv += opt_info.index; if(error_info.errors) errormsg(SH_DICT,ERROR_usage(2),"%s", optusage((char*)0)); if(arg = *argv) { char *action = arg; if(!dflag && !pflag) { /* first argument all digits or - means clear */ while(isdigit(*arg)) arg++; clear = (arg!=action && *arg==0); if(!clear) { ++argv; if(*action=='-' && action[1]==0) clear++; /* * NOTE: 2007-11-26: workaround for tests/signal.sh * if function semantics can be worked out then it * may merit a -d,--default option */ else if(*action=='+' && action[1]==0 && shp->st.self == &shp->global) { clear++; dflag++; } } if(!argv[0]) errormsg(SH_DICT,ERROR_exit(1),e_condition); } while(arg = *argv++) { sig = sig_number(shp,arg); if(sig<0) { errormsg(SH_DICT,2,e_trap,arg); return(1); } /* internal traps */ if(sig&SH_TRAP) { sig &= ~SH_TRAP; if(sig>SH_DEBUGTRAP) { errormsg(SH_DICT,2,e_trap,arg); return(1); } if(pflag) { if(arg=shp->st.trap[sig]) sfputr(sfstdout,sh_fmtq(arg),'\n'); continue; } if(shp->st.trap[sig]) free(shp->st.trap[sig]); shp->st.trap[sig] = 0; if(!clear && *action) shp->st.trap[sig] = strdup(action); if(sig == SH_DEBUGTRAP) { if(shp->st.trap[sig]) shp->trapnote |= SH_SIGTRAP; else shp->trapnote = 0; } continue; } if(sig>shp->gd->sigmax) { errormsg(SH_DICT,2,e_trap,arg); return(1); } else if(pflag) { char **trapcom = (shp->st.otrapcom?shp->st.otrapcom:shp->st.trapcom); if(arg=trapcom[sig]) sfputr(sfstdout,arg,'\n'); } else if(clear) { sh_sigclear(sig); if(dflag) signal(sig,SIG_DFL); } else { if(sig >= shp->st.trapmax) shp->st.trapmax = sig+1; arg = shp->st.trapcom[sig]; sh_sigtrap(sig); shp->st.trapcom[sig] = (shp->sigflag[sig]&SH_SIGOFF) ? Empty : strdup(action); if(arg && arg != Empty) free(arg); } } } else /* print out current traps */ sig_list(shp,-1); return(0); }
int b_kill(int argc,char *argv[],void *extra) { register char *signame; register int sig=SIGTERM, flag=0, n; register Shell_t *shp = ((Shbltin_t*)extra)->shp; NOT_USED(argc); while((n = optget(argv,sh_optkill))) switch(n) { case ':': if((signame=argv[opt_info.index++]) && (sig=sig_number(shp,signame+1))>=0) goto endopts; opt_info.index--; errormsg(SH_DICT,2, "%s", opt_info.arg); break; case 'n': sig = (int)opt_info.num; goto endopts; case 's': flag |= S_FLAG; signame = opt_info.arg; goto endopts; case 'l': flag |= L_FLAG; break; case '?': errormsg(SH_DICT,ERROR_usage(2), "%s", opt_info.arg); break; } endopts: argv += opt_info.index; if(*argv && strcmp(*argv,"--")==0 && strcmp(*(argv-1),"--")!=0) argv++; if(error_info.errors || flag==(L_FLAG|S_FLAG) || (!(*argv) && !(flag&L_FLAG))) errormsg(SH_DICT,ERROR_usage(2),"%s", optusage((char*)0)); /* just in case we send a kill -9 $$ */ sfsync(sfstderr); if(flag&L_FLAG) { if(!(*argv)) sig_list(shp,0); else while(signame = *argv++) { if(isdigit(*signame)) sig_list(shp,((int)strtol(signame, (char**)0, 10)&0177)+1); else { if((sig=sig_number(shp,signame))<0) { shp->exitval = 2; errormsg(SH_DICT,ERROR_exit(1),e_nosignal,signame); } sfprintf(sfstdout,"%d\n",sig); } } return(shp->exitval); } if(flag&S_FLAG) { if((sig=sig_number(shp,signame)) < 0 || sig > shp->gd->sigmax) errormsg(SH_DICT,ERROR_exit(1),e_nosignal,signame); } if(job_walk(sfstdout,job_kill,sig,argv)) shp->exitval = 1; return(shp->exitval); }
int b_ulimit(int argc,char *argv[],void *extra) { register char *limit; register int mode=0, n; register unsigned long hit = 0; Shell_t *shp = ((Shbltin_t*)extra)->shp; #ifdef _lib_getrlimit struct rlimit rlp; #endif /* _lib_getrlimit */ const Limit_t* tp; char* conf; int label, unit, nosupport; rlim_t i; char tmp[32]; Optdisc_t disc; memset(&disc, 0, sizeof(disc)); disc.version = OPT_VERSION; disc.infof = infof; opt_info.disc = &disc; while((n = optget(argv,sh_optulimit))) switch(n) { case 'H': mode |= HARD; continue; case 'S': mode |= SOFT; continue; case 'a': hit = ~0; break; default: if(n < 0) hit |= (1L<<(-(n+1))); else errormsg(SH_DICT,2, e_notimp, opt_info.name); break; case ':': errormsg(SH_DICT,2, "%s", opt_info.arg); break; case '?': errormsg(SH_DICT,ERROR_usage(2), "%s", opt_info.arg); break; } opt_info.disc = 0; /* default to -f */ limit = argv[opt_info.index]; if(hit==0) for(n=0; shtab_limits[n].option; n++) if(shtab_limits[n].index == RLIMIT_FSIZE) { hit |= (1L<<n); break; } /* only one option at a time for setting */ label = (hit&(hit-1)); if(error_info.errors || (limit && label) || argc>opt_info.index+1) errormsg(SH_DICT,ERROR_usage(2),optusage((char*)0)); if(mode==0) mode = (HARD|SOFT); for(tp = shtab_limits; tp->option && hit; tp++,hit>>=1) { if(!(hit&1)) continue; nosupport = (n = tp->index) == RLIMIT_UNKNOWN; unit = shtab_units[tp->type]; if(limit) { if(shp->subshell && !shp->subshare) sh_subfork(); if(strcmp(limit,e_unlimited)==0) i = INFINITY; else { char *last; if((i=sh_strnum(limit,&last,2))==INFINITY || *last) errormsg(SH_DICT,ERROR_system(1),e_number,limit); i *= unit; } if(nosupport) errormsg(SH_DICT,ERROR_system(1),e_readonly,tp->name); else { #ifdef _lib_getrlimit if(getrlimit(n,&rlp) <0) errormsg(SH_DICT,ERROR_system(1),e_number,limit); if(mode&HARD) rlp.rlim_max = i; if(mode&SOFT) rlp.rlim_cur = i; if(setrlimit(n,&rlp) <0) errormsg(SH_DICT,ERROR_system(1),e_overlimit,limit); #else if((i=vlimit(n,i)) < 0) errormsg(SH_DICT,ERROR_system(1),e_number,limit); #endif /* _lib_getrlimit */ } } else { if(!nosupport) { #ifdef _lib_getrlimit if(getrlimit(n,&rlp) <0) errormsg(SH_DICT,ERROR_system(1),e_number,limit); if(mode&HARD) i = rlp.rlim_max; if(mode&SOFT) i = rlp.rlim_cur; #else # ifdef _lib_ulimit n--; # endif /* _lib_ulimit */ i = -1; if((i=vlimit(n,i)) < 0) errormsg(SH_DICT,ERROR_system(1),e_number,limit); #endif /* _lib_getrlimit */ } if(label) { if(tp->type != LIM_COUNT) sfsprintf(tmp,sizeof(tmp),"%s (%ss)", tp->description, e_units[tp->type]); else sfsprintf(tmp,sizeof(tmp),"%s", tp->name); sfprintf(sfstdout,"%-30s (-%c) ",tmp,tp->option); } if(nosupport) { if(!tp->conf || !*(conf = astconf(tp->conf, NiL, NiL))) conf = (char*)e_nosupport; sfputr(sfstdout,conf,'\n'); } else if(i!=INFINITY) { i += (unit-1); sfprintf(sfstdout,"%I*d\n",sizeof(i),i/unit); } else sfputr(sfstdout,e_unlimited,'\n'); } } return(0); }