xref: /plan9/sys/src/cmd/rc/unix.c (revision dc5a79c1208f0704eeb474acc990728f8b4854f5)
13e12c5d1SDavid du Colombier /*
23e12c5d1SDavid du Colombier  * Unix versions of system-specific functions
33e12c5d1SDavid du Colombier  *	By convention, exported routines herein have names beginning with an
43e12c5d1SDavid du Colombier  *	upper case letter.
53e12c5d1SDavid du Colombier  */
63e12c5d1SDavid du Colombier #include "rc.h"
73e12c5d1SDavid du Colombier #include "exec.h"
83e12c5d1SDavid du Colombier #include <errno.h>
93e12c5d1SDavid du Colombier char Rcmain[]="/usr/lib/rcmain";
103e12c5d1SDavid du Colombier char Fdprefix[]="/dev/fd/";
113e12c5d1SDavid du Colombier int execumask(), execfinit();
123e12c5d1SDavid du Colombier struct builtin Builtin[] = {
133e12c5d1SDavid du Colombier 	"cd",		execcd,
143e12c5d1SDavid du Colombier 	"whatis",	execwhatis,
153e12c5d1SDavid du Colombier 	"eval",		execeval,
163e12c5d1SDavid du Colombier 	"exec",		execexec,	/* but with popword first */
173e12c5d1SDavid du Colombier 	"exit",		execexit,
183e12c5d1SDavid du Colombier 	"shift",	execshift,
193e12c5d1SDavid du Colombier 	"wait",		execwait,
203e12c5d1SDavid du Colombier 	"umask",	execumask,
213e12c5d1SDavid du Colombier 	".",		execdot,
223e12c5d1SDavid du Colombier 	"finit",	execfinit,
233e12c5d1SDavid du Colombier 	"flag",		execflag,
243e12c5d1SDavid du Colombier 	0
253e12c5d1SDavid du Colombier };
263e12c5d1SDavid du Colombier #define	SEP	'\1'
273e12c5d1SDavid du Colombier char **environp;
28*dc5a79c1SDavid du Colombier 
29*dc5a79c1SDavid du Colombier struct word*
30*dc5a79c1SDavid du Colombier enval(s)
313e12c5d1SDavid du Colombier register char *s;
323e12c5d1SDavid du Colombier {
33*dc5a79c1SDavid du Colombier 	char *t, c;
34*dc5a79c1SDavid du Colombier 	struct word *v;
353e12c5d1SDavid du Colombier 	for(t = s;*t && *t!=SEP;t++);
363e12c5d1SDavid du Colombier 	c=*t;
373e12c5d1SDavid du Colombier 	*t='\0';
383e12c5d1SDavid du Colombier 	v = newword(s, c=='\0'?(struct word *)0:enval(t+1));
393e12c5d1SDavid du Colombier 	*t = c;
403e12c5d1SDavid du Colombier 	return v;
413e12c5d1SDavid du Colombier }
423e12c5d1SDavid du Colombier Vinit(){
433e12c5d1SDavid du Colombier 	extern char **environ;
44*dc5a79c1SDavid du Colombier 	char *s;
45*dc5a79c1SDavid du Colombier 	char **env = environ;
463e12c5d1SDavid du Colombier 	environp = env;
473e12c5d1SDavid du Colombier 	for(;*env;env++){
483e12c5d1SDavid du Colombier 		for(s=*env;*s && *s!='(' && *s!='=';s++);
493e12c5d1SDavid du Colombier 		switch(*s){
503e12c5d1SDavid du Colombier 		case '\0':
513e12c5d1SDavid du Colombier 			pfmt(err, "environment %q?\n", *env);
523e12c5d1SDavid du Colombier 			break;
533e12c5d1SDavid du Colombier 		case '=':
543e12c5d1SDavid du Colombier 			*s='\0';
553e12c5d1SDavid du Colombier 			setvar(*env, enval(s+1));
563e12c5d1SDavid du Colombier 			*s='=';
573e12c5d1SDavid du Colombier 			break;
583e12c5d1SDavid du Colombier 		case '(':	/* ignore functions for now */
593e12c5d1SDavid du Colombier 			break;
603e12c5d1SDavid du Colombier 		}
613e12c5d1SDavid du Colombier 	}
623e12c5d1SDavid du Colombier }
633e12c5d1SDavid du Colombier char **envp;
643e12c5d1SDavid du Colombier Xrdfn(){
65*dc5a79c1SDavid du Colombier 	char *s;
66*dc5a79c1SDavid du Colombier 	int len;
673e12c5d1SDavid du Colombier 	for(;*envp;envp++){
683e12c5d1SDavid du Colombier 		for(s=*envp;*s && *s!='(' && *s!='=';s++);
693e12c5d1SDavid du Colombier 		switch(*s){
703e12c5d1SDavid du Colombier 		case '\0':
713e12c5d1SDavid du Colombier 			pfmt(err, "environment %q?\n", *envp);
723e12c5d1SDavid du Colombier 			break;
733e12c5d1SDavid du Colombier 		case '=':	/* ignore variables */
743e12c5d1SDavid du Colombier 			break;
753e12c5d1SDavid du Colombier 		case '(':		/* Bourne again */
763e12c5d1SDavid du Colombier 			s=*envp+3;
773e12c5d1SDavid du Colombier 			envp++;
783e12c5d1SDavid du Colombier 			len = strlen(s);
793e12c5d1SDavid du Colombier 			s[len]='\n';
803e12c5d1SDavid du Colombier 			execcmds(opencore(s, len+1));
813e12c5d1SDavid du Colombier 			s[len]='\0';
823e12c5d1SDavid du Colombier 			return;
833e12c5d1SDavid du Colombier 		}
843e12c5d1SDavid du Colombier 	}
853e12c5d1SDavid du Colombier 	Xreturn();
863e12c5d1SDavid du Colombier }
873e12c5d1SDavid du Colombier union code rdfns[4];
883e12c5d1SDavid du Colombier execfinit(){
893e12c5d1SDavid du Colombier 	static int first = 1;
903e12c5d1SDavid du Colombier 	if(first){
913e12c5d1SDavid du Colombier 		rdfns[0].i = 1;
923e12c5d1SDavid du Colombier 		rdfns[1].f = Xrdfn;
933e12c5d1SDavid du Colombier 		rdfns[2].f = Xjump;
943e12c5d1SDavid du Colombier 		rdfns[3].i = 1;
953e12c5d1SDavid du Colombier 		first = 0;
963e12c5d1SDavid du Colombier 	}
973e12c5d1SDavid du Colombier 	Xpopm();
983e12c5d1SDavid du Colombier 	envp = environp;
993e12c5d1SDavid du Colombier 	start(rdfns, 1, runq->local);
1003e12c5d1SDavid du Colombier }
1013e12c5d1SDavid du Colombier cmpenv(a, b)
1023e12c5d1SDavid du Colombier char **a, **b;
1033e12c5d1SDavid du Colombier {
1043e12c5d1SDavid du Colombier 	return strcmp(*a, *b);
1053e12c5d1SDavid du Colombier }
106*dc5a79c1SDavid du Colombier 
107*dc5a79c1SDavid du Colombier char*
108*dc5a79c1SDavid du Colombier *mkenv()
109*dc5a79c1SDavid du Colombier {
110*dc5a79c1SDavid du Colombier 	char **env, **ep, *p, *q;
111*dc5a79c1SDavid du Colombier 	struct var **h, *v;
112*dc5a79c1SDavid du Colombier 	struct word *a;
113*dc5a79c1SDavid du Colombier 	int nvar = 0, nchr = 0, sep;
1143e12c5d1SDavid du Colombier 	/*
1153e12c5d1SDavid du Colombier 	 * Slightly kludgy loops look at locals then globals
1163e12c5d1SDavid du Colombier 	 */
1173e12c5d1SDavid du Colombier 	for(h = var-1;h!=&var[NVAR];h++) for(v = h>=var?*h:runq->local;v;v = v->next){
1183e12c5d1SDavid du Colombier 		if((v==vlook(v->name)) && v->val){
1193e12c5d1SDavid du Colombier 			nvar++;
1203e12c5d1SDavid du Colombier 			nchr+=strlen(v->name)+1;
1213e12c5d1SDavid du Colombier 			for(a = v->val;a;a = a->next)
1223e12c5d1SDavid du Colombier 				nchr+=strlen(a->word)+1;
1233e12c5d1SDavid du Colombier 		}
1243e12c5d1SDavid du Colombier 		if(v->fn){
1253e12c5d1SDavid du Colombier 			nvar++;
1263e12c5d1SDavid du Colombier 			nchr+=strlen(v->name)+strlen(v->fn[v->pc-1].s)+8;
1273e12c5d1SDavid du Colombier 		}
1283e12c5d1SDavid du Colombier 	}
1293e12c5d1SDavid du Colombier 	env = (char **)emalloc((nvar+1)*sizeof(char *)+nchr);
1303e12c5d1SDavid du Colombier 	ep = env;
1313e12c5d1SDavid du Colombier 	p = (char *)&env[nvar+1];
1323e12c5d1SDavid du Colombier 	for(h = var-1;h!=&var[NVAR];h++) for(v = h>=var?*h:runq->local;v;v = v->next){
1333e12c5d1SDavid du Colombier 		if((v==vlook(v->name)) && v->val){
1343e12c5d1SDavid du Colombier 			*ep++=p;
1353e12c5d1SDavid du Colombier 			q = v->name;
1363e12c5d1SDavid du Colombier 			while(*q) *p++=*q++;
1373e12c5d1SDavid du Colombier 			sep='=';
1383e12c5d1SDavid du Colombier 			for(a = v->val;a;a = a->next){
1393e12c5d1SDavid du Colombier 				*p++=sep;
1403e12c5d1SDavid du Colombier 				sep = SEP;
1413e12c5d1SDavid du Colombier 				q = a->word;
1423e12c5d1SDavid du Colombier 				while(*q) *p++=*q++;
1433e12c5d1SDavid du Colombier 			}
1443e12c5d1SDavid du Colombier 			*p++='\0';
1453e12c5d1SDavid du Colombier 		}
1463e12c5d1SDavid du Colombier 		if(v->fn){
1473e12c5d1SDavid du Colombier 			*ep++=p;
1483e12c5d1SDavid du Colombier 			*p++='#'; *p++='('; *p++=')';	/* to fool Bourne */
1493e12c5d1SDavid du Colombier 			*p++='f'; *p++='n'; *p++=' ';
1503e12c5d1SDavid du Colombier 			q = v->name;
1513e12c5d1SDavid du Colombier 			while(*q) *p++=*q++;
1523e12c5d1SDavid du Colombier 			*p++=' ';
1533e12c5d1SDavid du Colombier 			q = v->fn[v->pc-1].s;
1543e12c5d1SDavid du Colombier 			while(*q) *p++=*q++;
1553e12c5d1SDavid du Colombier 			*p++='\0';
1563e12c5d1SDavid du Colombier 		}
1573e12c5d1SDavid du Colombier 	}
1583e12c5d1SDavid du Colombier 	*ep = 0;
1593e12c5d1SDavid du Colombier 	qsort((char *)env, nvar, sizeof ep[0], cmpenv);
1603e12c5d1SDavid du Colombier 	return env;
1613e12c5d1SDavid du Colombier }
1623e12c5d1SDavid du Colombier char *sigmsg[] = {
1633e12c5d1SDavid du Colombier /*  0 normal  */ 0,
1643e12c5d1SDavid du Colombier /*  1 SIGHUP  */ "Hangup",
1653e12c5d1SDavid du Colombier /*  2 SIGINT  */ 0,
1663e12c5d1SDavid du Colombier /*  3 SIGQUIT */ "Quit",
1673e12c5d1SDavid du Colombier /*  4 SIGILL  */ "Illegal instruction",
1683e12c5d1SDavid du Colombier /*  5 SIGTRAP */ "Trace/BPT trap",
1693e12c5d1SDavid du Colombier /*  6 SIGIOT  */ "abort",
1703e12c5d1SDavid du Colombier /*  7 SIGEMT  */ "EMT trap",
1713e12c5d1SDavid du Colombier /*  8 SIGFPE  */ "Floating exception",
1723e12c5d1SDavid du Colombier /*  9 SIGKILL */ "Killed",
1733e12c5d1SDavid du Colombier /* 10 SIGBUS  */ "Bus error",
1743e12c5d1SDavid du Colombier /* 11 SIGSEGV */ "Memory fault",
1753e12c5d1SDavid du Colombier /* 12 SIGSYS  */ "Bad system call",
1763e12c5d1SDavid du Colombier /* 13 SIGPIPE */ 0,
1773e12c5d1SDavid du Colombier /* 14 SIGALRM */ "Alarm call",
1783e12c5d1SDavid du Colombier /* 15 SIGTERM */ "Terminated",
1793e12c5d1SDavid du Colombier /* 16 unused  */ "signal 16",
1803e12c5d1SDavid du Colombier /* 17 SIGSTOP */ "Process stopped",
1813e12c5d1SDavid du Colombier /* 18 unused  */ "signal 18",
1823e12c5d1SDavid du Colombier /* 19 SIGCONT */ "Process continued",
1833e12c5d1SDavid du Colombier /* 20 SIGCHLD */ "Child death",
1843e12c5d1SDavid du Colombier };
1853e12c5d1SDavid du Colombier Waitfor(pid, persist){
186*dc5a79c1SDavid du Colombier 	int wpid, sig;
187*dc5a79c1SDavid du Colombier 	struct thread *p;
1883e12c5d1SDavid du Colombier 	int wstat;
1893e12c5d1SDavid du Colombier 	char wstatstr[12];
1903e12c5d1SDavid du Colombier 	for(;;){
1913e12c5d1SDavid du Colombier 		errno = 0;
1923e12c5d1SDavid du Colombier 		wpid = wait(&wstat);
193*dc5a79c1SDavid du Colombier 		if(errno==EINTR && persist)
194*dc5a79c1SDavid du Colombier 			continue;
195*dc5a79c1SDavid du Colombier 		if(wpid==-1)
196*dc5a79c1SDavid du Colombier 			break;
1973e12c5d1SDavid du Colombier 		sig = wstat&0177;
1983e12c5d1SDavid du Colombier 		if(sig==0177){
1993e12c5d1SDavid du Colombier 			pfmt(err, "trace: ");
2003e12c5d1SDavid du Colombier 			sig = (wstat>>8)&0177;
2013e12c5d1SDavid du Colombier 		}
2023e12c5d1SDavid du Colombier 		if(sig>(sizeof sigmsg/sizeof sigmsg[0]) || sigmsg[sig]){
203*dc5a79c1SDavid du Colombier 			if(pid!=wpid)
204*dc5a79c1SDavid du Colombier 				pfmt(err, "%d: ", wpid);
2053e12c5d1SDavid du Colombier 			if(sig<=(sizeof sigmsg/sizeof sigmsg[0]))
2063e12c5d1SDavid du Colombier 				pfmt(err, "%s", sigmsg[sig]);
2073e12c5d1SDavid du Colombier 			else if(sig==0177) pfmt(err, "stopped by ptrace");
2083e12c5d1SDavid du Colombier 			else pfmt(err, "signal %d", sig);
2093e12c5d1SDavid du Colombier 			if(wstat&0200)pfmt(err, " -- core dumped");
2103e12c5d1SDavid du Colombier 			pfmt(err, "\n");
2113e12c5d1SDavid du Colombier 		}
2123e12c5d1SDavid du Colombier 		wstat = sig?sig+1000:(wstat>>8)&0xFF;
2133e12c5d1SDavid du Colombier 		if(wpid==pid){
214*dc5a79c1SDavid du Colombier 			inttoascii(wstatstr, wstat);
2153e12c5d1SDavid du Colombier 			setstatus(wstatstr);
2163e12c5d1SDavid du Colombier 			break;
2173e12c5d1SDavid du Colombier 		}
2183e12c5d1SDavid du Colombier 		else{
2193e12c5d1SDavid du Colombier 			for(p = runq->ret;p;p = p->ret)
2203e12c5d1SDavid du Colombier 				if(p->pid==wpid){
2213e12c5d1SDavid du Colombier 					p->pid=-1;
222*dc5a79c1SDavid du Colombier 					inttoascii(p->status, wstat);
2233e12c5d1SDavid du Colombier 					break;
2243e12c5d1SDavid du Colombier 				}
2253e12c5d1SDavid du Colombier 		}
2263e12c5d1SDavid du Colombier 	}
2273e12c5d1SDavid du Colombier }
228*dc5a79c1SDavid du Colombier 
229*dc5a79c1SDavid du Colombier char*
230*dc5a79c1SDavid du Colombier *mkargv(a)
2313e12c5d1SDavid du Colombier register struct word *a;
2323e12c5d1SDavid du Colombier {
2333e12c5d1SDavid du Colombier 	char **argv = (char **)emalloc((count(a)+2)*sizeof(char *));
234*dc5a79c1SDavid du Colombier 	char **argp = argv+1;	/* leave one at front for runcoms */
2353e12c5d1SDavid du Colombier 	for(;a;a = a->next) *argp++=a->word;
2363e12c5d1SDavid du Colombier 	*argp = 0;
2373e12c5d1SDavid du Colombier 	return argv;
2383e12c5d1SDavid du Colombier }
2393e12c5d1SDavid du Colombier Updenv(){}
2403e12c5d1SDavid du Colombier Execute(args, path)
2413e12c5d1SDavid du Colombier register struct word *args, *path;
2423e12c5d1SDavid du Colombier {
243*dc5a79c1SDavid du Colombier 	char *msg="not found";
244*dc5a79c1SDavid du Colombier 	int txtbusy = 0;
2453e12c5d1SDavid du Colombier 	char **env = mkenv();
2463e12c5d1SDavid du Colombier 	char **argv = mkargv(args);
2473e12c5d1SDavid du Colombier 	char file[512];
2483e12c5d1SDavid du Colombier 	for(;path;path = path->next){
2493e12c5d1SDavid du Colombier 		strcpy(file, path->word);
250*dc5a79c1SDavid du Colombier 		if(file[0])
251*dc5a79c1SDavid du Colombier 			strcat(file, "/");
2523e12c5d1SDavid du Colombier 		strcat(file, argv[1]);
2533e12c5d1SDavid du Colombier 	ReExec:
2543e12c5d1SDavid du Colombier 		execve(file, argv+1, env);
2553e12c5d1SDavid du Colombier 		switch(errno){
2563e12c5d1SDavid du Colombier 		case ENOEXEC:
2573e12c5d1SDavid du Colombier 			pfmt(err, "%s: Bourne again\n", argv[1]);
2583e12c5d1SDavid du Colombier 			argv[0]="sh";
2593e12c5d1SDavid du Colombier 			argv[1] = strdup(file);
2603e12c5d1SDavid du Colombier 			execve("/bin/sh", argv, env);
2613e12c5d1SDavid du Colombier 			goto Bad;
2623e12c5d1SDavid du Colombier 		case ETXTBSY:
2633e12c5d1SDavid du Colombier 			if(++txtbusy!=5){
2643e12c5d1SDavid du Colombier 				sleep(txtbusy);
2653e12c5d1SDavid du Colombier 				goto ReExec;
2663e12c5d1SDavid du Colombier 			}
2673e12c5d1SDavid du Colombier 			msg="text busy"; goto Bad;
268*dc5a79c1SDavid du Colombier 		case EACCES:
269*dc5a79c1SDavid du Colombier 			msg="no access";
270*dc5a79c1SDavid du Colombier 			break;
271*dc5a79c1SDavid du Colombier 		case ENOMEM:
272*dc5a79c1SDavid du Colombier 			msg="not enough memory"; goto Bad;
273*dc5a79c1SDavid du Colombier 		case E2BIG:
274*dc5a79c1SDavid du Colombier 			msg="too big"; goto Bad;
2753e12c5d1SDavid du Colombier 		}
2763e12c5d1SDavid du Colombier 	}
2773e12c5d1SDavid du Colombier Bad:
2783e12c5d1SDavid du Colombier 	pfmt(err, "%s: %s\n", argv[1], msg);
2793e12c5d1SDavid du Colombier 	efree((char *)env);
2803e12c5d1SDavid du Colombier 	efree((char *)argv);
2813e12c5d1SDavid du Colombier }
2823e12c5d1SDavid du Colombier #define	NDIR	14		/* should get this from param.h */
2833e12c5d1SDavid du Colombier Globsize(p)
2843e12c5d1SDavid du Colombier register char *p;
2853e12c5d1SDavid du Colombier {
2863e12c5d1SDavid du Colombier 	int isglob = 0, globlen = NDIR+1;
2873e12c5d1SDavid du Colombier 	for(;*p;p++){
2883e12c5d1SDavid du Colombier 		if(*p==GLOB){
2893e12c5d1SDavid du Colombier 			p++;
290*dc5a79c1SDavid du Colombier 			if(*p!=GLOB)
291*dc5a79c1SDavid du Colombier 				isglob++;
2923e12c5d1SDavid du Colombier 			globlen+=*p=='*'?NDIR:1;
2933e12c5d1SDavid du Colombier 		}
2943e12c5d1SDavid du Colombier 		else
2953e12c5d1SDavid du Colombier 			globlen++;
2963e12c5d1SDavid du Colombier 	}
2973e12c5d1SDavid du Colombier 	return isglob?globlen:0;
2983e12c5d1SDavid du Colombier }
2993e12c5d1SDavid du Colombier #include <sys/types.h>
3003e12c5d1SDavid du Colombier #include <ndir.h>
3013e12c5d1SDavid du Colombier #define	NDIRLIST	50
3023e12c5d1SDavid du Colombier DIR *dirlist[NDIRLIST];
3033e12c5d1SDavid du Colombier Opendir(name)
3043e12c5d1SDavid du Colombier char *name;
3053e12c5d1SDavid du Colombier {
306*dc5a79c1SDavid du Colombier 	DIR **dp;
3073e12c5d1SDavid du Colombier 	for(dp = dirlist;dp!=&dirlist[NDIRLIST];dp++)
3083e12c5d1SDavid du Colombier 		if(*dp==0){
3093e12c5d1SDavid du Colombier 			*dp = opendir(name);
3103e12c5d1SDavid du Colombier 			return *dp?dp-dirlist:-1;
3113e12c5d1SDavid du Colombier 		}
3123e12c5d1SDavid du Colombier 	return -1;
3133e12c5d1SDavid du Colombier }
3146b6b9ac8SDavid du Colombier Readdir(f, p, onlydirs)
3153e12c5d1SDavid du Colombier register int f;
3163e12c5d1SDavid du Colombier register char *p;
3176b6b9ac8SDavid du Colombier register int onlydirs;	/* ignored, just advisory */
3183e12c5d1SDavid du Colombier {
3193e12c5d1SDavid du Colombier 	struct direct *dp = readdir(dirlist[f]);
320*dc5a79c1SDavid du Colombier 	if(dp==0)
321*dc5a79c1SDavid du Colombier 		return 0;
3223e12c5d1SDavid du Colombier 	strcpy(p, dp->d_name);
3233e12c5d1SDavid du Colombier 	return 1;
3243e12c5d1SDavid du Colombier }
3253e12c5d1SDavid du Colombier Closedir(f){
3263e12c5d1SDavid du Colombier 	closedir(dirlist[f]);
3273e12c5d1SDavid du Colombier 	dirlist[f] = 0;
3283e12c5d1SDavid du Colombier }
3293e12c5d1SDavid du Colombier char *Signame[] = {
3303e12c5d1SDavid du Colombier 	"sigexit",	"sighup",	"sigint",	"sigquit",
3313e12c5d1SDavid du Colombier 	"sigill",	"sigtrap",	"sigiot",	"sigemt",
3323e12c5d1SDavid du Colombier 	"sigfpe",	"sigkill",	"sigbus",	"sigsegv",
3333e12c5d1SDavid du Colombier 	"sigsys",	"sigpipe",	"sigalrm",	"sigterm",
3343e12c5d1SDavid du Colombier 	"sig16",	"sigstop",	"sigtstp",	"sigcont",
3353e12c5d1SDavid du Colombier 	"sigchld",	"sigttin",	"sigttou",	"sigtint",
3363e12c5d1SDavid du Colombier 	"sigxcpu",	"sigxfsz",	"sig26",	"sig27",
3373e12c5d1SDavid du Colombier 	"sig28",	"sig29",	"sig30",	"sig31",
3383e12c5d1SDavid du Colombier 	0,
3393e12c5d1SDavid du Colombier };
340*dc5a79c1SDavid du Colombier 
341*dc5a79c1SDavid du Colombier int
342*dc5a79c1SDavid du Colombier gettrap(sig)
343*dc5a79c1SDavid du Colombier {
3443e12c5d1SDavid du Colombier 	signal(sig, gettrap);
3453e12c5d1SDavid du Colombier 	trap[sig]++;
3463e12c5d1SDavid du Colombier 	ntrap++;
3473e12c5d1SDavid du Colombier 	if(ntrap>=NSIG){
3483e12c5d1SDavid du Colombier 		pfmt(err, "rc: Too many traps (trap %d), dumping core\n", sig);
3493e12c5d1SDavid du Colombier 		signal(SIGIOT, (int (*)())0);
3503e12c5d1SDavid du Colombier 		kill(getpid(), SIGIOT);
3513e12c5d1SDavid du Colombier 	}
3523e12c5d1SDavid du Colombier }
3533e12c5d1SDavid du Colombier Trapinit(){
354*dc5a79c1SDavid du Colombier 	int i;
355*dc5a79c1SDavid du Colombier 	int (*sig)();
3563e12c5d1SDavid du Colombier 	if(1 || flag['d']){	/* wrong!!! */
3573e12c5d1SDavid du Colombier 		sig = signal(SIGINT, gettrap);
358*dc5a79c1SDavid du Colombier 		if(sig==SIG_IGN)
359*dc5a79c1SDavid du Colombier 			signal(SIGINT, SIG_IGN);
3603e12c5d1SDavid du Colombier 	}
3613e12c5d1SDavid du Colombier 	else{
3623e12c5d1SDavid du Colombier 		for(i = 1;i<=NSIG;i++) if(i!=SIGCHLD){
3633e12c5d1SDavid du Colombier 			sig = signal(i, gettrap);
364*dc5a79c1SDavid du Colombier 			if(sig==SIG_IGN)
365*dc5a79c1SDavid du Colombier 				signal(i, SIG_IGN);
3663e12c5d1SDavid du Colombier 		}
3673e12c5d1SDavid du Colombier 	}
3683e12c5d1SDavid du Colombier }
3693e12c5d1SDavid du Colombier Unlink(name)
3703e12c5d1SDavid du Colombier char *name;
3713e12c5d1SDavid du Colombier {
3723e12c5d1SDavid du Colombier 	return unlink(name);
3733e12c5d1SDavid du Colombier }
3743e12c5d1SDavid du Colombier Write(fd, buf, cnt)
3753e12c5d1SDavid du Colombier char *buf;
3763e12c5d1SDavid du Colombier {
3773e12c5d1SDavid du Colombier 	return write(fd, buf, cnt);
3783e12c5d1SDavid du Colombier }
3793e12c5d1SDavid du Colombier Read(fd, buf, cnt)
3803e12c5d1SDavid du Colombier char *buf;
3813e12c5d1SDavid du Colombier {
3823e12c5d1SDavid du Colombier 	return read(fd, buf, cnt);
3833e12c5d1SDavid du Colombier }
3843e12c5d1SDavid du Colombier Seek(fd, cnt, whence)
3853e12c5d1SDavid du Colombier long cnt;
3863e12c5d1SDavid du Colombier {
3873e12c5d1SDavid du Colombier 	return lseek(fd, cnt, whence);
3883e12c5d1SDavid du Colombier }
3893e12c5d1SDavid du Colombier Executable(file)
3903e12c5d1SDavid du Colombier char *file;
3913e12c5d1SDavid du Colombier {
3923e12c5d1SDavid du Colombier 	return(access(file, 01)==0);
3933e12c5d1SDavid du Colombier }
3943e12c5d1SDavid du Colombier Creat(file)
3953e12c5d1SDavid du Colombier char *file;
3963e12c5d1SDavid du Colombier {
3973e12c5d1SDavid du Colombier 	return creat(file, 0666);
3983e12c5d1SDavid du Colombier }
3993e12c5d1SDavid du Colombier Dup(a, b){
4003e12c5d1SDavid du Colombier 	return dup2(a, b);
4013e12c5d1SDavid du Colombier }
4023e12c5d1SDavid du Colombier Dup1(a){
4033e12c5d1SDavid du Colombier 	return dup(a);
4043e12c5d1SDavid du Colombier }
4053e12c5d1SDavid du Colombier /*
4063e12c5d1SDavid du Colombier  * Wrong:  should go through components of a|b|c and return the maximum.
4073e12c5d1SDavid du Colombier  */
4083e12c5d1SDavid du Colombier Exit(stat)
4093e12c5d1SDavid du Colombier register char *stat;
4103e12c5d1SDavid du Colombier {
411*dc5a79c1SDavid du Colombier 	int n = 0;
4123e12c5d1SDavid du Colombier 	while(*stat){
4133e12c5d1SDavid du Colombier 		if(*stat!='|'){
414*dc5a79c1SDavid du Colombier 			if(*stat<'0' || '9'<*stat)
415*dc5a79c1SDavid du Colombier 				exit(1);
4163e12c5d1SDavid du Colombier 			else n = n*10+*stat-'0';
4173e12c5d1SDavid du Colombier 		}
4183e12c5d1SDavid du Colombier 		stat++;
4193e12c5d1SDavid du Colombier 	}
4203e12c5d1SDavid du Colombier 	exit(n);
4213e12c5d1SDavid du Colombier }
4223e12c5d1SDavid du Colombier Eintr(){
4233e12c5d1SDavid du Colombier 	return errno==EINTR;
4243e12c5d1SDavid du Colombier }
4253e12c5d1SDavid du Colombier Noerror(){
4263e12c5d1SDavid du Colombier 	errno = 0;
4273e12c5d1SDavid du Colombier }
4283e12c5d1SDavid du Colombier Isatty(fd){
4293e12c5d1SDavid du Colombier 	return isatty(fd);
4303e12c5d1SDavid du Colombier }
4313e12c5d1SDavid du Colombier Abort(){
4323e12c5d1SDavid du Colombier 	abort();
4333e12c5d1SDavid du Colombier }
4343e12c5d1SDavid du Colombier execumask(){		/* wrong -- should fork before writing */
435*dc5a79c1SDavid du Colombier 	int m;
4363e12c5d1SDavid du Colombier 	struct io out[1];
4373e12c5d1SDavid du Colombier 	switch(count(runq->argv->words)){
4383e12c5d1SDavid du Colombier 	default:
4393e12c5d1SDavid du Colombier 		pfmt(err, "Usage: umask [umask]\n");
4403e12c5d1SDavid du Colombier 		setstatus("umask usage");
4413e12c5d1SDavid du Colombier 		poplist();
4423e12c5d1SDavid du Colombier 		return;
443*dc5a79c1SDavid du Colombier 	case 2:
444*dc5a79c1SDavid du Colombier 		umask(octal(runq->argv->words->next->word));
445*dc5a79c1SDavid du Colombier 		break;
4463e12c5d1SDavid du Colombier 	case 1:
4473e12c5d1SDavid du Colombier 		umask(m = umask(0));
4483e12c5d1SDavid du Colombier 		out->fd = mapfd(1);
4493e12c5d1SDavid du Colombier 		out->bufp = out->buf;
4503e12c5d1SDavid du Colombier 		out->ebuf=&out->buf[NBUF];
4513e12c5d1SDavid du Colombier 		out->strp = 0;
4523e12c5d1SDavid du Colombier 		pfmt(out, "%o\n", m);
4533e12c5d1SDavid du Colombier 		break;
4543e12c5d1SDavid du Colombier 	}
4553e12c5d1SDavid du Colombier 	setstatus("");
4563e12c5d1SDavid du Colombier 	poplist();
4573e12c5d1SDavid du Colombier }
4583e12c5d1SDavid du Colombier Memcpy(a, b, n)
4593e12c5d1SDavid du Colombier char *a, *b;
4603e12c5d1SDavid du Colombier {
4613e12c5d1SDavid du Colombier 	memmove(a, b, n);
4623e12c5d1SDavid du Colombier }
463*dc5a79c1SDavid du Colombier 
464*dc5a79c1SDavid du Colombier void*
465*dc5a79c1SDavid du Colombier Malloc(n)
466*dc5a79c1SDavid du Colombier {
4673e12c5d1SDavid du Colombier 	return (void *)malloc(n);
4683e12c5d1SDavid du Colombier }
469