|
|
1.1 root 1: static char *sccsid = "@(#)dosys.c 4.7 (Berkeley) 83/06/22";
2: #include "defs"
3: #include <signal.h>
4:
5: dosys(comstring,nohalt)
6: register char *comstring;
7: int nohalt;
8: {
9: register int status;
10:
11: if(metas(comstring))
12: status = doshell(comstring,nohalt);
13: else status = doexec(comstring);
14:
15: return(status);
16: }
17:
18:
19:
20: metas(s) /* Are there are any Shell meta-characters? */
21: register char *s;
22: {
23: register char c;
24:
25: while( (funny[c = *s++] & META) == 0 )
26: ;
27: return( c );
28: }
29:
30: doshell(comstring,nohalt)
31: char *comstring;
32: int nohalt;
33: {
34: #ifdef SHELLENV
35: char *getenv(), *rindex();
36: char *shellcom = getenv("SHELL");
37: char *shellstr;
38: #endif
39: if((waitpid = vfork()) == 0)
40: {
41: enbint(SIG_DFL);
42: doclose();
43:
44: #ifdef SHELLENV
45: if (shellcom == 0) shellcom = SHELLCOM;
46: shellstr = rindex(shellcom, '/') + 1;
47: execl(shellcom, shellstr, (nohalt ? "-c" : "-ce"), comstring, 0);
48: #else
49: execl(SHELLCOM, "sh", (nohalt ? "-c" : "-ce"), comstring, 0);
50: #endif
51: fatal("Couldn't load Shell");
52: }
53:
54: return( await() );
55: }
56:
57:
58:
59:
60: int intrupt();
61:
62: await()
63: {
64: int status;
65: register int pid;
66:
67: enbint(SIG_IGN);
68: while( (pid = wait(&status)) != waitpid)
69: if(pid == -1)
70: fatal("bad wait code");
71: waitpid = 0;
72: enbint(intrupt);
73: return(status);
74: }
75:
76:
77:
78:
79:
80:
81: doclose() /* Close open directory files before exec'ing */
82: {
83: register struct dirhdr *od;
84:
85: for (od = firstod; od; od = od->nxtopendir)
86: if (od->dirfc != NULL) {
87: closedir(od->dirfc);
88: od->dirfc = NULL;
89: }
90: }
91:
92:
93:
94: #define MAXARGV 400
95:
96: doexec(str)
97: register char *str;
98: {
99: register char *t;
100: char *argv[MAXARGV];
101: register char **p;
102:
103: while( *str==' ' || *str=='\t' )
104: ++str;
105: if( *str == '\0' )
106: return(-1); /* no command */
107:
108: p = argv;
109: for(t = str ; *t ; )
110: {
111: if (p >= argv + MAXARGV)
112: fatal1("%s: Too many arguments.", str);
113: *p++ = t;
114: while(*t!=' ' && *t!='\t' && *t!='\0')
115: ++t;
116: if(*t)
117: for( *t++ = '\0' ; *t==' ' || *t=='\t' ; ++t)
118: ;
119: }
120:
121: *p = NULL;
122:
123: if((waitpid = fork()) == 0)
124: {
125: enbint(SIG_DFL);
126: doclose();
127: enbint(intrupt);
128: execvp(str, argv);
129: fatal1("Cannot load %s",str);
130: }
131:
132: return( await() );
133: }
134:
135: #include <errno.h>
136:
137: #include <sys/stat.h>
138:
139:
140:
141: touch(force, name)
142: int force;
143: char *name;
144: {
145: struct stat stbuff;
146: char junk[1];
147: int fd;
148:
149: if( stat(name,&stbuff) < 0)
150: if(force)
151: goto create;
152: else
153: {
154: fprintf(stderr, "touch: file %s does not exist.\n", name);
155: return;
156: }
157:
158: if(stbuff.st_size == 0)
159: goto create;
160:
161: if( (fd = open(name, 2)) < 0)
162: goto bad;
163:
164: if( read(fd, junk, 1) < 1)
165: {
166: close(fd);
167: goto bad;
168: }
169: lseek(fd, 0L, 0);
170: if( write(fd, junk, 1) < 1 )
171: {
172: close(fd);
173: goto bad;
174: }
175: close(fd);
176: return;
177:
178: bad:
179: fprintf(stderr, "Cannot touch %s\n", name);
180: return;
181:
182: create:
183: if( (fd = creat(name, 0666)) < 0)
184: goto bad;
185: close(fd);
186: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.