1*35129Smarc /* @(#)builtin.c 1.1 */
2*35129Smarc
3*35129Smarc /*
4*35129Smarc * builtin routines for the shell
5*35129Smarc *
6*35129Smarc * David Korn
7*35129Smarc * AT&T Bell Laboratories
8*35129Smarc * Room 5D-112
9*35129Smarc * Murray Hill, N. J. 07974
10*35129Smarc * Tel. x7975
11*35129Smarc *
12*35129Smarc */
13*35129Smarc
14*35129Smarc #include "defs.h"
15*35129Smarc #include "sym.h"
16*35129Smarc #include "io.h"
17*35129Smarc #include "history.h"
18*35129Smarc #include "builtins.h"
19*35129Smarc #include "flags.h"
20*35129Smarc #include "name.h"
21*35129Smarc #include "mode.h"
22*35129Smarc #include "brkincr.h"
23*35129Smarc #include "shtype.h"
24*35129Smarc #include "stak.h"
25*35129Smarc #ifdef JOBS
26*35129Smarc #include "jobs.h"
27*35129Smarc #endif /* JOBS */
28*35129Smarc
29*35129Smarc #ifdef BSD_4_2
30*35129Smarc #include <sys/time.h> /* needed for ulimit */
31*35129Smarc #include <sys/resource.h>/* needed for ulimit */
32*35129Smarc #define LIM_FSIZE RLIMIT_FSIZE
33*35129Smarc #define LIM_DATA RLIMIT_DATA
34*35129Smarc #define LIM_STACK RLIMIT_STACK
35*35129Smarc #define LIM_CORE RLIMIT_CORE
36*35129Smarc #define LIM_CPU RLIMIT_CPU
37*35129Smarc #define LIM_MAXRSS RLIMIT_RSS
38*35129Smarc #define INFINITY RLIM_INFINITY
39*35129Smarc #endif /* BSD_4_2 */
40*35129Smarc
41*35129Smarc /* This module defines these routines */
42*35129Smarc void builtin();
43*35129Smarc int execexp();
44*35129Smarc
45*35129Smarc /* This module references these external routines */
46*35129Smarc extern long aeval();
47*35129Smarc extern void arg_set();
48*35129Smarc extern void await();
49*35129Smarc extern void cannon_path();
50*35129Smarc extern char *catpath();
51*35129Smarc extern NAMPTR checkfor();
52*35129Smarc extern FILE *chkopen();
53*35129Smarc extern void clrsig();
54*35129Smarc extern TREPTR cmd();
55*35129Smarc extern void do_whence();
56*35129Smarc extern void done();
57*35129Smarc #ifdef ECHO_N
58*35129Smarc extern char *echo_mode();
59*35129Smarc #endif /* ECHO_N */
60*35129Smarc extern int estabf();
61*35129Smarc extern void execa();
62*35129Smarc extern void exitsh();
63*35129Smarc extern void failed();
64*35129Smarc extern void fassign();
65*35129Smarc extern void free();
66*35129Smarc extern char *getpwd();
67*35129Smarc extern void getsig();
68*35129Smarc extern void gscan_all();
69*35129Smarc extern char *heap();
70*35129Smarc extern void hist_cancel();
71*35129Smarc extern void hist_close();
72*35129Smarc extern histloc hist_find();
73*35129Smarc extern void hist_flush();
74*35129Smarc extern long hist_list();
75*35129Smarc extern void hist_open();
76*35129Smarc extern void hist_subst();
77*35129Smarc extern long hist_position();
78*35129Smarc extern void initf();
79*35129Smarc extern char *movstr();
80*35129Smarc extern void oldsigs();
81*35129Smarc extern void p_flush();
82*35129Smarc extern void p_list();
83*35129Smarc extern void p_num();
84*35129Smarc extern void p_setout();
85*35129Smarc extern void p_str();
86*35129Smarc extern void p_time();
87*35129Smarc extern FILE *pathopen();
88*35129Smarc extern void pipe_close();
89*35129Smarc extern void printflg();
90*35129Smarc extern void prinscan();
91*35129Smarc extern int printnam();
92*35129Smarc extern char *realias();
93*35129Smarc extern char *strcat();
94*35129Smarc extern char *strchr();
95*35129Smarc extern char *strcpy();
96*35129Smarc extern char *substitute();
97*35129Smarc extern FILE *tmp_open();
98*35129Smarc extern void trace_command();
99*35129Smarc extern void unassign();
100*35129Smarc extern char *utos();
101*35129Smarc extern char *valup();
102*35129Smarc
103*35129Smarc static int flagset();
104*35129Smarc static char *cmd_name;
105*35129Smarc static int sig_number();
106*35129Smarc static char *mycom[2];
107*35129Smarc #ifdef JOBS
108*35129Smarc static void sig_list();
109*35129Smarc #endif /* JOBS */
110*35129Smarc
builtin(xbuiltin,argn,com,t)111*35129Smarc void builtin(xbuiltin, argn, com,t)
112*35129Smarc int argn;
113*35129Smarc register char *com[];
114*35129Smarc TREPTR t;
115*35129Smarc {
116*35129Smarc register char *a1 = com[1];
117*35129Smarc register int flag = 0;
118*35129Smarc struct Amemory *troot;
119*35129Smarc int scoped = 0;
120*35129Smarc int aflag;
121*35129Smarc cmd_name = com[0];
122*35129Smarc switch(xbuiltin)
123*35129Smarc {
124*35129Smarc case SYSEXEC:
125*35129Smarc com++;
126*35129Smarc ioset = 0;
127*35129Smarc if(a1==0)
128*35129Smarc break;
129*35129Smarc
130*35129Smarc case SYSLOGIN:
131*35129Smarc
132*35129Smarc if(is_option(RSHFLG))
133*35129Smarc failed(cmd_name,restricted);
134*35129Smarc else
135*35129Smarc {
136*35129Smarc #ifdef JOBS
137*35129Smarc if(close_jobs() < 0)
138*35129Smarc {
139*35129Smarc exitval=1;
140*35129Smarc break;
141*35129Smarc }
142*35129Smarc #endif /* JOBS */
143*35129Smarc /* force bad exec to terminate shell */
144*35129Smarc states &= ~(TTYFLG|BUILTIN);
145*35129Smarc oldsigs();
146*35129Smarc hist_close();
147*35129Smarc rmtemp(0);
148*35129Smarc execa(com,(ARGPTR)NULL);
149*35129Smarc done(0);
150*35129Smarc }
151*35129Smarc
152*35129Smarc case SYSTEST: /* test expression */
153*35129Smarc exitval = testfn(argn, com);
154*35129Smarc break;
155*35129Smarc
156*35129Smarc
157*35129Smarc case SYSPWD: /* pwd routine */
158*35129Smarc argn = 1;
159*35129Smarc if((*mycom = getpwd(1))==NULL)
160*35129Smarc failed(cmd_name,pwderr);
161*35129Smarc com = mycom-1;
162*35129Smarc
163*35129Smarc case SYSECHO: /* system V echo routine */
164*35129Smarc /* equivalent to print - */
165*35129Smarc com--;
166*35129Smarc argn++;
167*35129Smarc #ifdef ECHO_N
168*35129Smarc /* This mess is because /bin/echo on BSD is archaic */
169*35129Smarc a1 = echo_mode();
170*35129Smarc #else
171*35129Smarc a1 = minus;
172*35129Smarc #endif /* ECHO_N */
173*35129Smarc
174*35129Smarc case SYSPRINT: /* print routine */
175*35129Smarc {
176*35129Smarc register FILE *fd;
177*35129Smarc int raw = 0;
178*35129Smarc wdnum = 1;
179*35129Smarc while(a1 && *a1 == '-')
180*35129Smarc {
181*35129Smarc int c = *(a1+1);
182*35129Smarc /* handle the -R flag for BSD style echo */
183*35129Smarc if(flag&R_JUST)
184*35129Smarc {
185*35129Smarc if(strcmp(a1,"-n")==0)
186*35129Smarc c = 0;
187*35129Smarc else
188*35129Smarc break;
189*35129Smarc }
190*35129Smarc flag |= flagset(a1,~(N_FLAG|R_FLAG|P_FLAG|U_FLAG|S_FLAG|R_JUST));
191*35129Smarc com++;
192*35129Smarc argn--;
193*35129Smarc if(c==0)
194*35129Smarc break;
195*35129Smarc a1 = com[1];
196*35129Smarc }
197*35129Smarc wdnum %= 10;
198*35129Smarc if(flag&(R_FLAG|R_JUST))
199*35129Smarc raw = 1;
200*35129Smarc if(flag&S_FLAG)
201*35129Smarc {
202*35129Smarc /* print to history file */
203*35129Smarc hist_open();
204*35129Smarc if(fc_fix==NULL)
205*35129Smarc failed(cmd_name,nohistory);
206*35129Smarc fd = fc_fix->fixfd;
207*35129Smarc states |= FIXFLG;
208*35129Smarc goto skip;
209*35129Smarc }
210*35129Smarc else if(flag&P_FLAG)
211*35129Smarc {
212*35129Smarc if((fd=cpipe[OTPIPE])==NULL)
213*35129Smarc failed(cmd_name,noquery);
214*35129Smarc }
215*35129Smarc else if(flag&U_FLAG)
216*35129Smarc {
217*35129Smarc fd = file_fd(wdnum);
218*35129Smarc if(!fiswrite(fd))
219*35129Smarc failed(cmd_name,badfile);
220*35129Smarc }
221*35129Smarc else
222*35129Smarc fd = standout;
223*35129Smarc
224*35129Smarc clearerr(fd);
225*35129Smarc p_setout(fd);
226*35129Smarc skip:
227*35129Smarc if(echo_list(raw,com+1,fd) && (flag&N_FLAG)==0)
228*35129Smarc putc(NL,fd);
229*35129Smarc if(flag&S_FLAG)
230*35129Smarc hist_flush();
231*35129Smarc break;
232*35129Smarc }
233*35129Smarc
234*35129Smarc case SYSLET:
235*35129Smarc {
236*35129Smarc if(argn < 2)
237*35129Smarc failed(cmd_name,argcount);
238*35129Smarc while(--argn)
239*35129Smarc exitval = !aeval(*++com);
240*35129Smarc break;
241*35129Smarc }
242*35129Smarc
243*35129Smarc /*
244*35129Smarc * The following few builtins are provided to set,print,
245*35129Smarc * and test attributes and variables for shell variables,
246*35129Smarc * aliases, and functions.
247*35129Smarc * In addition, typeset -f can be used to test whether a
248*35129Smarc * function has been defined or to list all defined functions
249*35129Smarc * Note readonly is same as typeset -r.
250*35129Smarc * Note export is same as typeset -x.
251*35129Smarc */
252*35129Smarc case SYSRDONLY:
253*35129Smarc flag = R_FLAG;
254*35129Smarc aflag = '-';
255*35129Smarc goto typset;
256*35129Smarc
257*35129Smarc case SYSXPORT:
258*35129Smarc flag = X_FLAG;
259*35129Smarc aflag = '-';
260*35129Smarc goto typset;
261*35129Smarc
262*35129Smarc case SYSALIAS:
263*35129Smarc case SYSTYPESET:
264*35129Smarc {
265*35129Smarc FILE *fd;
266*35129Smarc int type; /* 0 for typeset, non-zero for alias */
267*35129Smarc flag = 0;
268*35129Smarc aflag = (a1?*a1:0);
269*35129Smarc wdnum = 0;
270*35129Smarc if(aflag == '-' || aflag == '+')
271*35129Smarc {
272*35129Smarc flag = flagset(a1,~(L_JUST|R_JUST|Z_FILL|INT_GER|L_TO_U
273*35129Smarc |U_TO_L|X_FLAG|R_FLAG|F_FLAG|P_FLAG|T_FLAG
274*35129Smarc |A_FLAG));
275*35129Smarc com++;
276*35129Smarc }
277*35129Smarc if((flag&INT_GER) && (flag&(L_JUST|R_JUST|Z_FILL)))
278*35129Smarc failed(cmd_name,badopt);
279*35129Smarc /* S_FLAG forces name to be in newest scope */
280*35129Smarc if(fn_depth)
281*35129Smarc scoped = S_FLAG;
282*35129Smarc
283*35129Smarc typset:
284*35129Smarc type = 0;
285*35129Smarc if(xbuiltin == SYSALIAS)
286*35129Smarc {
287*35129Smarc if(flag&~(N_EXPORT|T_FLAG))
288*35129Smarc failed(cmd_name,badopt);
289*35129Smarc troot = alias;
290*35129Smarc /* setname treats this value specially */
291*35129Smarc type = V_FLAG;
292*35129Smarc }
293*35129Smarc else if(flag&F_FLAG)
294*35129Smarc {
295*35129Smarc if(flag&~(N_EXPORT|F_FLAG|T_FLAG))
296*35129Smarc failed(cmd_name,badopt);
297*35129Smarc troot = prnames;
298*35129Smarc flag &= ~F_FLAG;
299*35129Smarc }
300*35129Smarc else
301*35129Smarc troot = namep;
302*35129Smarc if(flag&P_FLAG)
303*35129Smarc {
304*35129Smarc flag &= ~P_FLAG;
305*35129Smarc if((fd=cpipe[OTPIPE])==NULL)
306*35129Smarc failed(cmd_name,noquery);
307*35129Smarc }
308*35129Smarc else
309*35129Smarc fd = standout;
310*35129Smarc p_setout(fd);
311*35129Smarc if(aflag == 0)
312*35129Smarc {
313*35129Smarc if(type)
314*35129Smarc prinscan(fd,0,troot,0);
315*35129Smarc else
316*35129Smarc gscan_all(printflg,troot);
317*35129Smarc break;
318*35129Smarc }
319*35129Smarc if(com[1])
320*35129Smarc {
321*35129Smarc while(a1 = *++com)
322*35129Smarc {
323*35129Smarc register unsigned newflag;
324*35129Smarc register struct Namnod *np;
325*35129Smarc struct Namnod *setname();
326*35129Smarc unsigned curflag;
327*35129Smarc if(troot == prnames)
328*35129Smarc {
329*35129Smarc /*
330*35129Smarc *functions can be exported or
331*35129Smarc * traced but not set
332*35129Smarc */
333*35129Smarc if(np=checkfor(a1,prnames))
334*35129Smarc {
335*35129Smarc if((flag&(N_EXPORT|T_FLAG))==0)
336*35129Smarc {
337*35129Smarc printnam(np,0);
338*35129Smarc continue;
339*35129Smarc }
340*35129Smarc if(aflag=='-')
341*35129Smarc attrib(np,flag);
342*35129Smarc else if(aflag=='+')
343*35129Smarc pattrib(np,~flag);
344*35129Smarc }
345*35129Smarc else
346*35129Smarc exitval++;
347*35129Smarc continue;
348*35129Smarc }
349*35129Smarc np = setname (a1,(type|scoped));
350*35129Smarc /* tracked alias */
351*35129Smarc if(type && (flag&T_FLAG) && aflag=='-')
352*35129Smarc {
353*35129Smarc attrib(np,flag|N_EXPORT);
354*35129Smarc realias(np);
355*35129Smarc continue;
356*35129Smarc }
357*35129Smarc if(flag==0 && aflag!='-' && strchr(a1,'=') == NULL)
358*35129Smarc {
359*35129Smarc /* type==0 for TYPESET */
360*35129Smarc if(type==0)
361*35129Smarc {
362*35129Smarc if(valup(np))
363*35129Smarc printflg(np);
364*35129Smarc else
365*35129Smarc exitval++;
366*35129Smarc continue;
367*35129Smarc }
368*35129Smarc if(printnam(np,0) == 0)
369*35129Smarc {
370*35129Smarc fputs(a1,fd);
371*35129Smarc p_str(noalias,NL);
372*35129Smarc exitval++;
373*35129Smarc }
374*35129Smarc continue;
375*35129Smarc }
376*35129Smarc curflag = namflag(np);
377*35129Smarc if (aflag == '-')
378*35129Smarc {
379*35129Smarc newflag = curflag | flag;
380*35129Smarc if (flag & INT_GER)
381*35129Smarc newflag &= ~(R_JUST|L_JUST);
382*35129Smarc else if (flag & (L_JUST|R_JUST))
383*35129Smarc {
384*35129Smarc newflag &= ~INT_GER;
385*35129Smarc if (flag & L_JUST)
386*35129Smarc newflag &= ~R_JUST;
387*35129Smarc else
388*35129Smarc newflag &= ~L_JUST;
389*35129Smarc }
390*35129Smarc if (flag & U_TO_L)
391*35129Smarc newflag &= ~L_TO_U;
392*35129Smarc else if (flag & L_TO_U)
393*35129Smarc newflag &= ~U_TO_L;
394*35129Smarc }
395*35129Smarc else
396*35129Smarc newflag = curflag & ~flag;
397*35129Smarc if (aflag && (wdnum>0 || (curflag!=newflag)))
398*35129Smarc {
399*35129Smarc #ifdef apollo
400*35129Smarc /* keep aliases from going
401*35129Smarc into environment */
402*35129Smarc if(type)
403*35129Smarc namflag(np) = newflag;
404*35129Smarc else
405*35129Smarc chattrib (np, newflag,wdnum);
406*35129Smarc #endif /* apollo */
407*35129Smarc chattrib (np, newflag,wdnum);
408*35129Smarc }
409*35129Smarc }
410*35129Smarc }
411*35129Smarc else
412*35129Smarc prinscan(fd,flag,troot,aflag=='+');
413*35129Smarc break;
414*35129Smarc }
415*35129Smarc
416*35129Smarc
417*35129Smarc /*
418*35129Smarc * The removing of Shell variable names, aliases, and functions
419*35129Smarc * is performed here.
420*35129Smarc * Unset functions with unset -f
421*35129Smarc * Non-existent items being deleted give non-zero exit status
422*35129Smarc */
423*35129Smarc case SYSUNALIAS:
424*35129Smarc case SYSUNSET:
425*35129Smarc {
426*35129Smarc register NAMPTR np;
427*35129Smarc #ifdef apollo
428*35129Smarc short namlen;
429*35129Smarc #endif /* apollo */
430*35129Smarc if(xbuiltin == SYSUNALIAS)
431*35129Smarc {
432*35129Smarc troot = alias;
433*35129Smarc goto unall;
434*35129Smarc }
435*35129Smarc if(a1 && *a1 == '-')
436*35129Smarc {
437*35129Smarc flag = flagset(a1,~F_FLAG);
438*35129Smarc com++;
439*35129Smarc argn--;
440*35129Smarc troot = prnames;
441*35129Smarc }
442*35129Smarc else
443*35129Smarc troot = namep;
444*35129Smarc unall:
445*35129Smarc if(argn < 2)
446*35129Smarc failed(cmd_name,argcount);
447*35129Smarc while(--argn)
448*35129Smarc {
449*35129Smarc a1 = *++com;
450*35129Smarc np=checkfor(a1,troot);
451*35129Smarc if(np)
452*35129Smarc {
453*35129Smarc if(troot==namep)
454*35129Smarc {
455*35129Smarc if(attest(np,ARRAY) && (
456*35129Smarc (a1=strchr(a1,']'))==NIL
457*35129Smarc || astchar(a1[-1])))
458*35129Smarc arayp(np)->adot = NO_SUBSCRIPT;
459*35129Smarc if (attest (np, N_RDONLY))
460*35129Smarc failed(np->namid,wtfailed);
461*35129Smarc #ifdef apollo
462*35129Smarc namlen =strlen(np->namid);
463*35129Smarc ev_$delete_var(np->namid,&namlen);
464*35129Smarc #endif /* apollo */
465*35129Smarc }
466*35129Smarc unassign(np);
467*35129Smarc }
468*35129Smarc else
469*35129Smarc exitval = 1;
470*35129Smarc }
471*35129Smarc break;
472*35129Smarc }
473*35129Smarc
474*35129Smarc case SYSDOT:
475*35129Smarc if(a1)
476*35129Smarc {
477*35129Smarc register FILE *f;
478*35129Smarc if((f=pathopen(a1)) == NULL)
479*35129Smarc failed(a1,notfound);
480*35129Smarc else
481*35129Smarc {
482*35129Smarc if(argn > 2)
483*35129Smarc arg_set(com+1);
484*35129Smarc execexp((char*)0,f);
485*35129Smarc }
486*35129Smarc }
487*35129Smarc break;
488*35129Smarc
489*35129Smarc case SYSTIMES:
490*35129Smarc {
491*35129Smarc long int t[4];
492*35129Smarc times(t);
493*35129Smarc p_setout(standout);
494*35129Smarc p_time(t[0],' ');
495*35129Smarc p_time(t[1],NL);
496*35129Smarc p_time(t[2],' ');
497*35129Smarc p_time(t[3],NL);
498*35129Smarc break;
499*35129Smarc }
500*35129Smarc
501*35129Smarc case SYSRETURN: /* return from a subroutine */
502*35129Smarc if(freturn)
503*35129Smarc {
504*35129Smarc exitval = (a1?atoi(a1):oldexit);
505*35129Smarc longjmp(*freturn,1);
506*35129Smarc }
507*35129Smarc
508*35129Smarc case SYSEXIT:
509*35129Smarc #ifdef JOBS
510*35129Smarc if(close_jobs()<0)
511*35129Smarc break;
512*35129Smarc #endif
513*35129Smarc states &= ~(TTYFLG|BUILTIN); /* force exit */
514*35129Smarc exitsh(a1?atoi(a1):oldexit);
515*35129Smarc
516*35129Smarc case SYSNULL:
517*35129Smarc break;
518*35129Smarc
519*35129Smarc case SYSCONT:
520*35129Smarc if(loopcnt)
521*35129Smarc {
522*35129Smarc execbrk = breakcnt = 1;
523*35129Smarc if(a1)
524*35129Smarc breakcnt = atoi(a1);
525*35129Smarc if(breakcnt > loopcnt)
526*35129Smarc breakcnt = loopcnt;
527*35129Smarc else
528*35129Smarc breakcnt = -breakcnt;
529*35129Smarc }
530*35129Smarc break;
531*35129Smarc
532*35129Smarc case SYSBREAK:
533*35129Smarc if(loopcnt)
534*35129Smarc {
535*35129Smarc execbrk = breakcnt = 1;
536*35129Smarc if(a1)
537*35129Smarc breakcnt = atoi(a1);
538*35129Smarc if(breakcnt > loopcnt)
539*35129Smarc breakcnt = loopcnt;
540*35129Smarc }
541*35129Smarc break;
542*35129Smarc
543*35129Smarc case SYSTRAP:
544*35129Smarc if(a1)
545*35129Smarc {
546*35129Smarc register BOOL clear;
547*35129Smarc char *action = a1;
548*35129Smarc if((clear=isdigit(*a1))==0)
549*35129Smarc {
550*35129Smarc ++com;
551*35129Smarc if(*a1=='-')
552*35129Smarc clear++;
553*35129Smarc }
554*35129Smarc while(a1 = *++com)
555*35129Smarc {
556*35129Smarc flag = sig_number(a1);
557*35129Smarc if(flag>MAXTRAP || flag<MINTRAP)
558*35129Smarc failed(a1,badtrap);
559*35129Smarc else if(clear)
560*35129Smarc clrsig(flag);
561*35129Smarc else
562*35129Smarc {
563*35129Smarc free(trapcom[flag]);
564*35129Smarc trapcom[flag] = heap(action);
565*35129Smarc if(*action)
566*35129Smarc getsig(flag);
567*35129Smarc else
568*35129Smarc ignsig(flag);
569*35129Smarc }
570*35129Smarc }
571*35129Smarc }
572*35129Smarc else /* print out current traps */
573*35129Smarc {
574*35129Smarc p_setout(standout);
575*35129Smarc for(flag=0; flag<=MAXTRAP; flag++)
576*35129Smarc if(trapcom[flag])
577*35129Smarc {
578*35129Smarc p_num(flag,':');
579*35129Smarc p_str(trapcom[flag],NL);
580*35129Smarc }
581*35129Smarc }
582*35129Smarc break;
583*35129Smarc
584*35129Smarc case SYSCD:
585*35129Smarc {
586*35129Smarc register char *dp;
587*35129Smarc register char *cdpath = nullstr;
588*35129Smarc char newdir[256]; /* enough for any pathname */
589*35129Smarc char *oldpwd;
590*35129Smarc if(is_option(RSHFLG))
591*35129Smarc failed(cmd_name,restricted);
592*35129Smarc else if(argn >3)
593*35129Smarc failed(cmd_name, argcount);
594*35129Smarc if(argn==3)
595*35129Smarc a1 = substitute(getpwd(0),a1,com[2],newdir);
596*35129Smarc else if(a1==0 || *a1==0)
597*35129Smarc a1 = valup(HOME);
598*35129Smarc else if(*a1 == '-' && *(a1+1) == 0)
599*35129Smarc a1 = valup(OLDPWDNOD);
600*35129Smarc if(a1==0 || *a1==0)
601*35129Smarc failed(cmd_name,argn==3?badsub:baddir);
602*35129Smarc if(*a1 != '/')
603*35129Smarc cdpath = valup(CDPNOD);
604*35129Smarc if(cdpath==0)
605*35129Smarc cdpath = nullstr;
606*35129Smarc if(*a1=='.')
607*35129Smarc {
608*35129Smarc /* test for pathname . ./ .. or ../ */
609*35129Smarc if(*(dp=a1+1) == '.')
610*35129Smarc dp++;
611*35129Smarc if(*dp==0 || *dp=='/')
612*35129Smarc cdpath = nullstr;
613*35129Smarc }
614*35129Smarc do
615*35129Smarc {
616*35129Smarc dp = cdpath;
617*35129Smarc cdpath=catpath(dp,a1);
618*35129Smarc }
619*35129Smarc while((flag=chdir(curstak()))<0 && cdpath);
620*35129Smarc if(flag<0)
621*35129Smarc failed(a1,baddir);
622*35129Smarc if(a1 == valup(OLDPWDNOD) || argn==3)
623*35129Smarc dp = a1; /* print out directory for cd - */
624*35129Smarc a1 = (char*)fixstak();
625*35129Smarc if(*dp && *dp!= ':' && (states&PROMPT) && strchr(a1,'/'))
626*35129Smarc {
627*35129Smarc p_setout(standout);
628*35129Smarc p_str(a1,NL);
629*35129Smarc }
630*35129Smarc oldpwd = getpwd(0);
631*35129Smarc fassign(OLDPWDNOD,oldpwd);
632*35129Smarc if(*a1 == '/')
633*35129Smarc strcpy(newdir,a1);
634*35129Smarc else
635*35129Smarc {
636*35129Smarc dp = movstr(oldpwd,newdir);
637*35129Smarc *dp++ = '/';
638*35129Smarc movstr(a1,dp);
639*35129Smarc }
640*35129Smarc /* eliminate redundant / */
641*35129Smarc a1 = newdir;
642*35129Smarc cannon_path(a1);
643*35129Smarc fassign(PWDNOD,a1);
644*35129Smarc #ifndef INT16
645*35129Smarc /* Because of possible symbolic links, make sure we are where
646*35129Smarc * we think we are.
647*35129Smarc */
648*35129Smarc if(!eq_inode(dot,a1))
649*35129Smarc chdir(a1);
650*35129Smarc #endif /* INT16 */
651*35129Smarc break;
652*35129Smarc }
653*35129Smarc
654*35129Smarc case SYSSHFT:
655*35129Smarc {
656*35129Smarc flag = (a1?aeval(a1):1);
657*35129Smarc if(flag<0 || dolc<flag)
658*35129Smarc failed(cmd_name,badnum);
659*35129Smarc else
660*35129Smarc {
661*35129Smarc dolv += flag;
662*35129Smarc dolc -= flag;
663*35129Smarc }
664*35129Smarc break;
665*35129Smarc }
666*35129Smarc
667*35129Smarc case SYSWAIT:
668*35129Smarc await(a1?atoi(a1):-1,1);
669*35129Smarc break;
670*35129Smarc
671*35129Smarc case SYSREAD:
672*35129Smarc {
673*35129Smarc register FILE *fd;
674*35129Smarc wdnum = 0;
675*35129Smarc while(a1 && *a1 == '-')
676*35129Smarc {
677*35129Smarc flag |= flagset(a1,~(R_FLAG|P_FLAG|U_FLAG|S_FLAG));
678*35129Smarc com++;
679*35129Smarc argn--;
680*35129Smarc if(*(a1+1)==0)
681*35129Smarc break;
682*35129Smarc a1 = com[1];
683*35129Smarc }
684*35129Smarc if(flag&P_FLAG)
685*35129Smarc {
686*35129Smarc fd = cpipe[INPIPE];
687*35129Smarc states |= PROMPT;
688*35129Smarc }
689*35129Smarc else if(flag&U_FLAG)
690*35129Smarc fd = file_fd(wdnum);
691*35129Smarc else
692*35129Smarc fd = stdin;
693*35129Smarc if(!fisread(fd))
694*35129Smarc failed(cmd_name,badfile);
695*35129Smarc if(isatty(fileno(fd)))
696*35129Smarc {
697*35129Smarc FILE *fdo;
698*35129Smarc p_setout(output);
699*35129Smarc states |= PROMPT;
700*35129Smarc /* look for prompt */
701*35129Smarc if(a1=strchr(a1,'?'))
702*35129Smarc {
703*35129Smarc if(fiswrite(fd)==0 ||
704*35129Smarc (fdo=fdopen(dup(fileno(fd)),"w"))==NULL)
705*35129Smarc fdo = stderr;
706*35129Smarc p_setout(fdo);
707*35129Smarc fputs(a1+1,fdo);
708*35129Smarc if(fdo!=stderr)
709*35129Smarc fclose(fdo);
710*35129Smarc }
711*35129Smarc }
712*35129Smarc readvar(&com[1],fd,flag&(R_FLAG|S_FLAG));
713*35129Smarc if(feof(fd))
714*35129Smarc {
715*35129Smarc exitval=1;
716*35129Smarc if(flag&P_FLAG)
717*35129Smarc {
718*35129Smarc pipe_close(cpipe);
719*35129Smarc cpipe[INPIPE]=0;
720*35129Smarc cpid = 0;
721*35129Smarc }
722*35129Smarc }
723*35129Smarc clearerr(fd);
724*35129Smarc break;
725*35129Smarc }
726*35129Smarc
727*35129Smarc case SYSSET:
728*35129Smarc flag = is_option(EXECPR);
729*35129Smarc if(a1)
730*35129Smarc {
731*35129Smarc register int argc;
732*35129Smarc argc = arg_opts(argn,com);
733*35129Smarc /* RWAIT is set if -- flag is given */
734*35129Smarc if(argc>1 || (states&RWAIT))
735*35129Smarc arg_set(com+argn-argc);
736*35129Smarc states &= ~(RWAIT|READPR|MONITOR);
737*35129Smarc states |= is_option(READPR|MONITOR);
738*35129Smarc }
739*35129Smarc if(flag)
740*35129Smarc trace_command(com);
741*35129Smarc if(a1==0 && ((COMPTR) t)->comset==0)
742*35129Smarc /*scan name chain and print*/
743*35129Smarc prinscan(standout,0,namep,0);
744*35129Smarc break;
745*35129Smarc
746*35129Smarc case SYSEVAL:
747*35129Smarc if(a1)
748*35129Smarc execexp(a1,(FILE*)&com[2]);
749*35129Smarc break;
750*35129Smarc
751*35129Smarc case SYSFC:
752*35129Smarc {
753*35129Smarc register struct fixcmd *fp;
754*35129Smarc FILE *fdo;
755*35129Smarc char *argv[2];
756*35129Smarc char fname[TMPSIZ];
757*35129Smarc int index2;
758*35129Smarc int indx = -1; /* used as subscript for range */
759*35129Smarc char *edit = NULL; /* name of editor */
760*35129Smarc char *replace = NULL; /* replace old=new */
761*35129Smarc int incr;
762*35129Smarc int range[2]; /* upper and lower range of commands */
763*35129Smarc int lflag = 0;
764*35129Smarc int nflag = 0;
765*35129Smarc int rflag = 0;
766*35129Smarc histloc location;
767*35129Smarc wdnum = 0;
768*35129Smarc hist_open();
769*35129Smarc if((fp=fc_fix)==NULL)
770*35129Smarc failed(cmd_name,nohistory);
771*35129Smarc while((a1=com[1]) && *a1 == '-')
772*35129Smarc {
773*35129Smarc flag = flagset(a1,~(E_FLAG|L_FLAG|N_FLAG|R_FLAG));
774*35129Smarc if(flag==0)
775*35129Smarc {
776*35129Smarc range[++indx] = fp->fixind - wdnum-1;
777*35129Smarc wdnum = 0;
778*35129Smarc if(indx==1)
779*35129Smarc break;
780*35129Smarc }
781*35129Smarc else
782*35129Smarc {
783*35129Smarc if(flag&E_FLAG)
784*35129Smarc {
785*35129Smarc /* name of editor specified */
786*35129Smarc com++;
787*35129Smarc if((edit=com[1]) == NULL)
788*35129Smarc failed(cmd_name,argexp);
789*35129Smarc }
790*35129Smarc if(flag&N_FLAG)
791*35129Smarc nflag++;
792*35129Smarc if(flag&L_FLAG)
793*35129Smarc lflag++;
794*35129Smarc if(flag&R_FLAG)
795*35129Smarc rflag++;
796*35129Smarc }
797*35129Smarc com++;
798*35129Smarc }
799*35129Smarc flag = indx;
800*35129Smarc while(flag<1 && (a1=com[1]))
801*35129Smarc {
802*35129Smarc if(isdigit(*a1) || *a1 == '-')
803*35129Smarc {
804*35129Smarc /* see if completely numeric */
805*35129Smarc do a1++;
806*35129Smarc while(isdigit(*a1));
807*35129Smarc if(*a1==0)
808*35129Smarc {
809*35129Smarc a1 = com[1];
810*35129Smarc range[++flag] = atoi(a1);
811*35129Smarc if(*a1 == '-')
812*35129Smarc range[flag] += (fp->fixind-1);
813*35129Smarc com++;
814*35129Smarc continue;
815*35129Smarc }
816*35129Smarc }
817*35129Smarc /* look for old=new argument */
818*35129Smarc else if(replace==NULL && strchr(a1+1,'='))
819*35129Smarc {
820*35129Smarc replace = a1;
821*35129Smarc com++;
822*35129Smarc continue;
823*35129Smarc }
824*35129Smarc /* search for last line starting with string */
825*35129Smarc location = hist_find(com[1],fp->fixind-1,0,-1);
826*35129Smarc if((range[++flag] = location.his_command) < 0)
827*35129Smarc failed(com[1],notfound);
828*35129Smarc com++;
829*35129Smarc }
830*35129Smarc if(flag <0)
831*35129Smarc {
832*35129Smarc /* set default starting range */
833*35129Smarc if(lflag)
834*35129Smarc {
835*35129Smarc flag = fp->fixind-16;
836*35129Smarc if(flag<1)
837*35129Smarc flag = 1;
838*35129Smarc }
839*35129Smarc else
840*35129Smarc flag = fp->fixind-2;
841*35129Smarc range[0] = flag;
842*35129Smarc flag = 0;
843*35129Smarc }
844*35129Smarc if(flag==0)
845*35129Smarc /* set default termination range */
846*35129Smarc range[1] = (lflag?fp->fixind-1:range[0]);
847*35129Smarc if((index2 = fp->fixind - fp->fixmax) <=0)
848*35129Smarc index2 = 1;
849*35129Smarc /* check for valid ranges */
850*35129Smarc for(flag=0;flag<2;flag++)
851*35129Smarc if(range[flag]<index2 ||
852*35129Smarc range[flag]>=(fp->fixind-(lflag==0)))
853*35129Smarc failed(cmd_name,badnum);
854*35129Smarc if(edit && *edit=='-' && range[0]!=range[1])
855*35129Smarc failed(cmd_name,badnum);
856*35129Smarc /* now list commands from range[rflag] to range[1-rflag] */
857*35129Smarc incr = 1;
858*35129Smarc flag = rflag>0;
859*35129Smarc if(range[1-flag] < range[flag])
860*35129Smarc incr = -1;
861*35129Smarc if(lflag)
862*35129Smarc {
863*35129Smarc fdo = standout;
864*35129Smarc a1 = "\n\t";
865*35129Smarc }
866*35129Smarc else
867*35129Smarc {
868*35129Smarc fdo = tmp_open(fname);
869*35129Smarc a1 = "\n";
870*35129Smarc nflag++;
871*35129Smarc }
872*35129Smarc p_setout(fdo);
873*35129Smarc while(1)
874*35129Smarc {
875*35129Smarc if(nflag==0)
876*35129Smarc p_num(range[flag],'\t');
877*35129Smarc else if(lflag)
878*35129Smarc putc('\t',fdo);
879*35129Smarc hist_list(hist_position(range[flag]),EOF,a1);
880*35129Smarc if(lflag && (trapnote&SIGSET))
881*35129Smarc exitsh(SIGFAIL);
882*35129Smarc if(range[flag] == range[1-flag])
883*35129Smarc break;
884*35129Smarc range[flag] += incr;
885*35129Smarc }
886*35129Smarc fseek(fp->fixfd,0L,2);
887*35129Smarc if(lflag)
888*35129Smarc return;
889*35129Smarc p_setout(stderr);
890*35129Smarc a1 = edit;
891*35129Smarc if(a1==NULL && (a1=valup(FCEDNOD)) == NULL)
892*35129Smarc a1 = defedit;
893*35129Smarc if(*a1 != '-')
894*35129Smarc {
895*35129Smarc argv[0] = fname;
896*35129Smarc argv[1] = NULL;
897*35129Smarc execexp(a1,(FILE*)argv);
898*35129Smarc }
899*35129Smarc closefd(fdo);
900*35129Smarc fdo = chkopen(fname);
901*35129Smarc unlink(fname);
902*35129Smarc /* don't history fc itself */
903*35129Smarc hist_cancel();
904*35129Smarc states |= (READPR|FIXFLG); /* echo lines as read */
905*35129Smarc if(replace!=NULL)
906*35129Smarc hist_subst(cmd_name,fdo,replace);
907*35129Smarc else if(exitval == 0)
908*35129Smarc execexp((char*)0,fdo);
909*35129Smarc else
910*35129Smarc {
911*35129Smarc fclose(fdo);
912*35129Smarc if(is_option(READPR)==0)
913*35129Smarc states &= ~(READPR|FIXFLG);
914*35129Smarc }
915*35129Smarc break;
916*35129Smarc }
917*35129Smarc
918*35129Smarc case SYSWHENCE:
919*35129Smarc {
920*35129Smarc if(a1 && *a1 == '-')
921*35129Smarc {
922*35129Smarc flag = flagset(a1,~V_FLAG);
923*35129Smarc com++;
924*35129Smarc argn--;
925*35129Smarc }
926*35129Smarc if(argn < 2)
927*35129Smarc failed(cmd_name,argcount);
928*35129Smarc p_setout(standout);
929*35129Smarc do_whence(com,flag);
930*35129Smarc break;
931*35129Smarc }
932*35129Smarc
933*35129Smarc
934*35129Smarc case SYSUMASK:
935*35129Smarc {
936*35129Smarc if(a1)
937*35129Smarc {
938*35129Smarc register int c;
939*35129Smarc flag = 0;
940*35129Smarc while(c = *a1++)
941*35129Smarc {
942*35129Smarc if (c>='0' && c<='7')
943*35129Smarc flag = (flag<<3) + (c-'0');
944*35129Smarc else
945*35129Smarc failed(cmd_name,badnum);
946*35129Smarc }
947*35129Smarc umask(flag);
948*35129Smarc }
949*35129Smarc else
950*35129Smarc {
951*35129Smarc p_setout(standout);
952*35129Smarc #ifdef pdp11
953*35129Smarc a1 = utos((long)(argn=umask(0)),8);
954*35129Smarc #else
955*35129Smarc a1 = utos((unsigned long)(argn=umask(0)),8);
956*35129Smarc #endif /* pdp11 */
957*35129Smarc umask(argn);
958*35129Smarc *++a1 = '0';
959*35129Smarc p_str(a1,NL);
960*35129Smarc }
961*35129Smarc break;
962*35129Smarc }
963*35129Smarc
964*35129Smarc #ifndef apollo
965*35129Smarc
966*35129Smarc #ifdef BSD
967*35129Smarc #define BLK_SIZ 512
968*35129Smarc #define KBYTE 1024
969*35129Smarc #ifdef BSD_4_2
970*35129Smarc #else
971*35129Smarc #include <sys/vlimit.h>
972*35129Smarc #endif
973*35129Smarc case SYSULIMIT:
974*35129Smarc {
975*35129Smarc #ifdef BSD_4_2
976*35129Smarc struct rlimit rlp;
977*35129Smarc #endif
978*35129Smarc long i;
979*35129Smarc char *opts = 0;
980*35129Smarc char label=0;
981*35129Smarc int n;
982*35129Smarc int unit = BLK_SIZ;
983*35129Smarc flag = LIM_FSIZE;
984*35129Smarc if(a1 && *a1 == '-')
985*35129Smarc opts = ++a1;
986*35129Smarc do
987*35129Smarc {
988*35129Smarc if(opts)
989*35129Smarc {
990*35129Smarc switch(*opts)
991*35129Smarc {
992*35129Smarc case 'a':
993*35129Smarc label++;
994*35129Smarc opts = "tmdsfc";
995*35129Smarc case 't':
996*35129Smarc flag = LIM_CPU;
997*35129Smarc unit = 1;
998*35129Smarc n = 0;
999*35129Smarc break;
1000*35129Smarc case 'c':
1001*35129Smarc flag = LIM_CORE;
1002*35129Smarc n = 5;
1003*35129Smarc break;
1004*35129Smarc case 'f':
1005*35129Smarc flag = LIM_FSIZE;
1006*35129Smarc n = 4;
1007*35129Smarc break;
1008*35129Smarc case 'd':
1009*35129Smarc flag = LIM_DATA;
1010*35129Smarc unit = KBYTE;
1011*35129Smarc n = 2;
1012*35129Smarc break;
1013*35129Smarc case 's':
1014*35129Smarc flag = LIM_STACK;
1015*35129Smarc unit = KBYTE;
1016*35129Smarc n = 3;
1017*35129Smarc break;
1018*35129Smarc case 'm':
1019*35129Smarc flag = LIM_MAXRSS;
1020*35129Smarc unit = KBYTE;
1021*35129Smarc n = 1;
1022*35129Smarc break;
1023*35129Smarc default:
1024*35129Smarc failed(cmd_name,badopt);
1025*35129Smarc }
1026*35129Smarc if((a1 && *++a1)||(label&&com[2]))
1027*35129Smarc failed(cmd_name,badopt);
1028*35129Smarc a1 = com[2];
1029*35129Smarc }
1030*35129Smarc if(a1)
1031*35129Smarc {
1032*35129Smarc if((i=aeval(a1)) < 0)
1033*35129Smarc failed(cmd_name,badnum);
1034*35129Smarc i *= unit;
1035*35129Smarc #ifdef BSD_4_2
1036*35129Smarc if(getrlimit(flag,&rlp) <0)
1037*35129Smarc failed(cmd_name,badnum);
1038*35129Smarc rlp.rlim_cur = i;
1039*35129Smarc if(setrlimit(flag,&rlp) <0)
1040*35129Smarc failed(cmd_name,badnum);
1041*35129Smarc #endif
1042*35129Smarc }
1043*35129Smarc else
1044*35129Smarc {
1045*35129Smarc #ifdef BSD_4_2
1046*35129Smarc if(getrlimit(flag,&rlp) <0)
1047*35129Smarc failed(cmd_name,badnum);
1048*35129Smarc i = rlp.rlim_cur;
1049*35129Smarc #else
1050*35129Smarc i = -1;
1051*35129Smarc }
1052*35129Smarc if((i=vlimit(flag,i)) < 0)
1053*35129Smarc failed(cmd_name,badnum);
1054*35129Smarc if(a1==0)
1055*35129Smarc {
1056*35129Smarc #endif
1057*35129Smarc p_setout(standout);
1058*35129Smarc if(label)
1059*35129Smarc p_str(limit_names[n],SP);
1060*35129Smarc if(i!=INFINITY)
1061*35129Smarc {
1062*35129Smarc i = (i+unit-1)/unit;
1063*35129Smarc p_str(utos((unsigned long)i,10),NL);
1064*35129Smarc }
1065*35129Smarc else
1066*35129Smarc p_str(unlimited,NL);
1067*35129Smarc }
1068*35129Smarc }
1069*35129Smarc while(opts && *++opts);
1070*35129Smarc break;
1071*35129Smarc }
1072*35129Smarc #else
1073*35129Smarc case SYSULIMIT:
1074*35129Smarc {
1075*35129Smarc #ifndef VENIX
1076*35129Smarc long i;
1077*35129Smarc long ulimit();
1078*35129Smarc register int mode = 2;
1079*35129Smarc if(a1 && *a1 == '-')
1080*35129Smarc {
1081*35129Smarc #ifdef RT
1082*35129Smarc flag = flagset(a1,~(F_FLAG|P_FLAG));
1083*35129Smarc #else
1084*35129Smarc flag = flagset(a1,~F_FLAG);
1085*35129Smarc #endif /* RT */
1086*35129Smarc a1 = com[2];
1087*35129Smarc }
1088*35129Smarc if(flag&P_FLAG)
1089*35129Smarc mode = 5;
1090*35129Smarc if(a1)
1091*35129Smarc {
1092*35129Smarc if((i=aeval(a1)) < 0)
1093*35129Smarc failed(cmd_name,badnum);
1094*35129Smarc }
1095*35129Smarc else
1096*35129Smarc {
1097*35129Smarc mode--;
1098*35129Smarc i = -1;
1099*35129Smarc }
1100*35129Smarc if((i=ulimit(mode,i)) < 0)
1101*35129Smarc failed(cmd_name,badnum);
1102*35129Smarc if(a1==0)
1103*35129Smarc {
1104*35129Smarc p_setout(standout);
1105*35129Smarc # ifdef pdp11
1106*35129Smarc p_str(utos((long)i,10),NL);
1107*35129Smarc # else
1108*35129Smarc p_str(utos((unsigned long)i,10),NL);
1109*35129Smarc # endif /* pdp11 */
1110*35129Smarc }
1111*35129Smarc #endif /* VENIX */
1112*35129Smarc break;
1113*35129Smarc }
1114*35129Smarc #endif
1115*35129Smarc #endif /* apollo */
1116*35129Smarc
1117*35129Smarc #ifdef JOBS
1118*35129Smarc # if BSD || SXT
1119*35129Smarc case SYSBG:
1120*35129Smarc flag = 1;
1121*35129Smarc case SYSFG:
1122*35129Smarc if((states&MONITOR)==0)
1123*35129Smarc {
1124*35129Smarc exitval = 1;
1125*35129Smarc if(states&PROMPT)
1126*35129Smarc failed(cmd_name,j_no_jctl);
1127*35129Smarc break;
1128*35129Smarc }
1129*35129Smarc if(argn==1)
1130*35129Smarc a1 = nullstr;
1131*35129Smarc if(switch_jobs(a1,flag)==0)
1132*35129Smarc failed(cmd_name,j_no_job);
1133*35129Smarc break;
1134*35129Smarc # endif
1135*35129Smarc
1136*35129Smarc case SYSJOBS:
1137*35129Smarc if(a1 && *a1 == '-')
1138*35129Smarc flag = flagset(a1,~L_FLAG);
1139*35129Smarc list_jobs(flag);
1140*35129Smarc break;
1141*35129Smarc
1142*35129Smarc case SYSKILL:
1143*35129Smarc {
1144*35129Smarc if(argn < 2)
1145*35129Smarc failed(cmd_name,argcount);
1146*35129Smarc /* just in case we send a kill -9 $$ */
1147*35129Smarc p_flush();
1148*35129Smarc flag = 15;
1149*35129Smarc if(*a1 == '-')
1150*35129Smarc {
1151*35129Smarc a1++;
1152*35129Smarc if(*a1 == 'l')
1153*35129Smarc {
1154*35129Smarc sig_list();
1155*35129Smarc break;
1156*35129Smarc }
1157*35129Smarc flag = sig_number(a1);
1158*35129Smarc if(flag <0 || flag >= NSIG)
1159*35129Smarc failed(cmd_name,badopt);
1160*35129Smarc com++;
1161*35129Smarc argn--;
1162*35129Smarc }
1163*35129Smarc while(--argn)
1164*35129Smarc {
1165*35129Smarc a1 = *++com;
1166*35129Smarc exitval += job_kill(a1,flag);
1167*35129Smarc }
1168*35129Smarc break;
1169*35129Smarc }
1170*35129Smarc #endif
1171*35129Smarc
1172*35129Smarc #ifdef apollo
1173*35129Smarc /*
1174*35129Smarc * Apollo system support library loads into the virtual address space
1175*35129Smarc */
1176*35129Smarc case SYSINLIB:
1177*35129Smarc {
1178*35129Smarc int status,xfer;
1179*35129Smarc short len;
1180*35129Smarc std_$call void pm_$load();
1181*35129Smarc std_$call void pm_$call();
1182*35129Smarc if(a1)
1183*35129Smarc {
1184*35129Smarc len = strlen(a1);
1185*35129Smarc pm_$load(*a1, len, 2 , 0, xfer,status);
1186*35129Smarc if(status!=0)
1187*35129Smarc failed(a1,"cannot inlib");
1188*35129Smarc else if(xfer)
1189*35129Smarc pm_$call(xfer);
1190*35129Smarc }
1191*35129Smarc break;
1192*35129Smarc }
1193*35129Smarc
1194*35129Smarc case SYSINPROCESS:
1195*35129Smarc if(argn < 2)
1196*35129Smarc on_option(INPROC);
1197*35129Smarc else
1198*35129Smarc exitval = exec_here(com);
1199*35129Smarc break;
1200*35129Smarc #endif /* apollo */
1201*35129Smarc }
1202*35129Smarc }
1203*35129Smarc
1204*35129Smarc static const char flgchar[] = "efilmnprstuvwxzHLRZ";
1205*35129Smarc static const int flgval[] = {E_FLAG,F_FLAG,I_FLAG,L_FLAG,M_FLAG,
1206*35129Smarc N_FLAG,P_FLAG,R_FLAG,S_FLAG,T_FLAG,U_FLAG,V_FLAG,
1207*35129Smarc W_FLAG,X_FLAG,Z_FLAG,A_FLAG,L_JUST,R_JUST,R_JUST|Z_FILL};
1208*35129Smarc /*
1209*35129Smarc * process option flags for built-ins
1210*35129Smarc * flagmask are the invalid options
1211*35129Smarc */
1212*35129Smarc
flagset(flaglist,flagmask)1213*35129Smarc static int flagset(flaglist,flagmask)
1214*35129Smarc char *flaglist;
1215*35129Smarc {
1216*35129Smarc register int flag = 0;
1217*35129Smarc register int c;
1218*35129Smarc register char *cp,*sp;
1219*35129Smarc
1220*35129Smarc for(cp=flaglist+1;c = *cp;cp++)
1221*35129Smarc {
1222*35129Smarc if(isdigit(c))
1223*35129Smarc wdnum = 10*wdnum + (c - '0');
1224*35129Smarc else if(sp=strchr(flgchar,c))
1225*35129Smarc flag |= flgval[sp-flgchar];
1226*35129Smarc else
1227*35129Smarc goto badoption;
1228*35129Smarc }
1229*35129Smarc if((flag&flagmask)==0)
1230*35129Smarc return(flag);
1231*35129Smarc badoption:
1232*35129Smarc failed(cmd_name,badopt);
1233*35129Smarc /* NOTREACHED */
1234*35129Smarc }
1235*35129Smarc
1236*35129Smarc
execexp(s,f)1237*35129Smarc int execexp(s,f)
1238*35129Smarc register char *s;
1239*35129Smarc register FILE *f;
1240*35129Smarc {
1241*35129Smarc FILEBLK fb;
1242*35129Smarc FILE fd;
1243*35129Smarc TREPTR t;
1244*35129Smarc char inbuf[BUFSIZ];
1245*35129Smarc push(&fb);
1246*35129Smarc if(s)
1247*35129Smarc {
1248*35129Smarc estabf(s,&fd);
1249*35129Smarc fb.feval=(char **)(f);
1250*35129Smarc }
1251*35129Smarc else if(f!=NULL)
1252*35129Smarc {
1253*35129Smarc initf(f);
1254*35129Smarc setbuf(f,inbuf);
1255*35129Smarc }
1256*35129Smarc exec_flag++;
1257*35129Smarc t = cmd(NL,NLFLG|MTFLG);
1258*35129Smarc exec_flag--;
1259*35129Smarc if(is_option(READPR)==0)
1260*35129Smarc states &= ~READPR;
1261*35129Smarc if(s==NULL && fc_fix)
1262*35129Smarc hist_flush();
1263*35129Smarc pop(0);
1264*35129Smarc execute(t,states&ERRFLG);
1265*35129Smarc }
1266*35129Smarc
1267*35129Smarc
1268*35129Smarc /*
1269*35129Smarc * Given the name or number of a signal return the signal number
1270*35129Smarc */
1271*35129Smarc
sig_number(string)1272*35129Smarc static int sig_number(string)
1273*35129Smarc register char *string;
1274*35129Smarc {
1275*35129Smarc register int n;
1276*35129Smarc if(isdigit(*string))
1277*35129Smarc n = atoi(string);
1278*35129Smarc else
1279*35129Smarc {
1280*35129Smarc n = syslook(string,signal_names);
1281*35129Smarc n &= (1<<SIGBITS)-1;
1282*35129Smarc n--;
1283*35129Smarc }
1284*35129Smarc return(n);
1285*35129Smarc }
1286*35129Smarc
1287*35129Smarc #ifdef JOBS
1288*35129Smarc /*
1289*35129Smarc * list all the possible signals
1290*35129Smarc */
sig_list()1291*35129Smarc static void sig_list()
1292*35129Smarc {
1293*35129Smarc register SYSPTR syscan;
1294*35129Smarc register int n = MAXTRAP+1;
1295*35129Smarc char *names[MAXTRAP+1];
1296*35129Smarc syscan=signal_names;
1297*35129Smarc p_setout(standout);
1298*35129Smarc /* not all signals may be defined */
1299*35129Smarc while(--n >= 0)
1300*35129Smarc names[n] = badtrap;
1301*35129Smarc while(*syscan->sysnam)
1302*35129Smarc {
1303*35129Smarc n = syscan->sysval;
1304*35129Smarc n &= ((1<<SIGBITS)-1);
1305*35129Smarc names[n] = syscan->sysnam;
1306*35129Smarc syscan++;
1307*35129Smarc }
1308*35129Smarc n = MAXTRAP;
1309*35129Smarc while(names[--n]==badtrap);
1310*35129Smarc names[n+1] = NULL;
1311*35129Smarc p_list(n-1,names+2);
1312*35129Smarc }
1313*35129Smarc #endif /* JOBS */
1314