17 P = emallocz(sizeof(Process));
43 p->prev->next = p->next;
44 p->next->prev = p->prev;
54 for(p = plist.next; p != &plist; p = p->next)
68 p = strrchr(file, '/');
73 strncpy(P->name, p, NAMEMAX);
75 if(P->path != nil && decref(P->path) == 0)
77 P->path = emallocz(5 + strlen(file));
79 strcpy((char*)(P->path + 1), file);
83 initstack(int argc, char **argv)
85 ulong tos, sp, ap, size, i, len;
87 tos = mach->utop - sizeof(Tos) * 2;
91 for(i = 0; i < argc; i++)
92 size += strlen(argv[i]) + 5;
97 P->R[1] = mach->utop - 4;
100 *(ulong *) vaddrnol(sp, 4) = argc;
102 ap = sp + (argc + 1) * 4;
103 for(i = 0; i < argc; i++) {
104 *(ulong *) vaddrnol(sp, 4) = ap;
106 len = strlen(argv[i]) + 1;
107 memcpy(vaddrnol(ap, len), argv[i], len);
110 *(ulong *) vaddrnol(sp, 4) = 0;
119 tos = mach->utop - sizeof(Tos) * 2;
120 ((Tos *) vaddrnol(tos, sizeof(Tos)))->pid = P->pid;
124 loadscript(int fd, char *file, int argc, char **argv)
126 char buf[513], *p, **q, **nargv;
130 rc = readn(fd, buf, 512);
135 p = strchr(buf, '\n');
144 while(*p && isspace(*p))
147 while(*p && !isspace(*p))
152 nargv = emallocz(sizeof(char *) * (nargc + argc));
156 while(*p && isspace(*p))
160 while(*p && !isspace(*p))
164 for(i = 1; i < argc; i++)
166 rc = loadtext(*nargv, argc + nargc, nargv);
171 werrstr("exec header invalid");
176 loadtext(char *file, int argc, char **argv)
180 Segment *text, *data, *bss;
183 fd = open(file, OREAD);
184 if(fd < 0) return -1;
185 if(pread(fd, buf, 2, 0) == 2 && buf[0] == '#' && buf[1] == '!')
186 return loadscript(fd, file, argc, argv);
188 if(crackhdr(fd, &fp) == 0 || fp.magic != E_MAGIC) {
189 werrstr("exec header invalid");
193 P->notehandler = P->innote = P->notein = P->noteout = 0;
195 memset(P->R, 0, sizeof(P->R));
197 text = newseg(fp.txtaddr - fp.hdrsz, fp.txtsz + fp.hdrsz, SEGTEXT);
198 data = newseg(fp.dataddr, fp.datsz, SEGDATA);
199 bss = newseg(fp.dataddr + fp.datsz, fp.bsssz, SEGBSS);
200 newseg(mach->utop - STACKSIZE, STACKSIZE, SEGSTACK);
201 seek(fd, fp.txtoff - fp.hdrsz, 0);
202 if(readn(fd, text->data, fp.txtsz + fp.hdrsz) < fp.txtsz + fp.hdrsz)
204 seek(fd, fp.datoff, 0);
205 if(readn(fd, data->data, fp.datsz) < fp.datsz)
207 memset(bss->data, 0, bss->size);
209 if(havesymbols && syminit(fd, &fp) < 0)
210 fprint(2, "initializing symbol table: %r\n");
213 initstack(argc, argv);
219 cherrstr(char *str, ...)
224 vsnprint(P->errbuf, ERRMAX, str, va);
229 noteerr(u32int x, u32int y)
231 if(((int)x) >= ((int)y))
233 rerrstr(P->errbuf, ERRMAX);
242 fd = emallocz(sizeof(*fd));
255 new->nfds = old->nfds;
256 new->fds = emalloc(old->nfds);
257 memcpy(new->fds, old->fds, old->nfds);
266 if(decref(fd) == 0) {
273 iscexec(Fd *fd, int n)
280 r = (fd->fds[n / 8] & (1 << (n % 8))) != 0;
286 setcexec(Fd *fd, int n, int status)
291 if(n / 8 >= fd->nfds) {
297 fd->nfds = (n / 8) + 1;
298 fd->fds = erealloc(fd->fds, fd->nfds);
299 memset(fd->fds + old, 0, fd->nfds - old);
302 fd->fds[n / 8] &= ~(1 << (n % 8));
304 fd->fds[n / 8] |= (1 << (n % 8));
318 for(i = 0; i < fd->nfds; i++) {
320 for(k = 0; k < 8; k++)
330 /* call this from a notehandler if you don't want the front to fall off */
337 if((new - P->noteout) % NNOTE == 0)
340 strncpy(P->notes[P->notein % NNOTE], msg, ERRMAX - 1);
344 /* the following code is not for the weak of heart */
346 donote(char *msg, ulong type)
349 u32int *ureg, *sp, uregp, msgp;
352 if(P->notehandler == 0)
355 uregp = P->R[13] - 18 * 4;
356 ureg = vaddrnol(uregp, 18 * 4);
357 memcpy(ureg, P->R, 15 * 4);
362 msgp = P->R[13] -= strlen(msg) + 1;
363 msgb = vaddrnol(msgp, strlen(msg) + 1);
366 sp = vaddrnol(P->R[13], 3 * 4);
370 P->R[15] = P->notehandler;
372 switch(rc = setjmp(P->notejmp) - 1) {
384 sysfatal("unhandled noted argument %d", rc);
387 ureg = vaddrnol(uregp, 18 * 4); /* just to be sure */
388 memcpy(P->R, ureg, 15 * 4);