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