diff options
author | aiju <aiju@phicode.de> | 2011-06-24 15:10:22 +0200 |
---|---|---|
committer | aiju <aiju@phicode.de> | 2011-06-24 15:10:22 +0200 |
commit | 81d393942d8834b6e071ab0957b655a99e737486 (patch) | |
tree | a4b6c1cc206c87d46f390139502e03dafddd9c2a /sys/src/cmd/5e/sys.c | |
parent | a3e9415aa8cdba6059c972c582e3645c4c112139 (diff) |
updated 5e
Diffstat (limited to 'sys/src/cmd/5e/sys.c')
-rw-r--r-- | sys/src/cmd/5e/sys.c | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/sys/src/cmd/5e/sys.c b/sys/src/cmd/5e/sys.c index e88f8f1e0..daa02e0c7 100644 --- a/sys/src/cmd/5e/sys.c +++ b/sys/src/cmd/5e/sys.c @@ -9,7 +9,7 @@ static u32int arg(int n) { /* no locking necessary, since we're on the stack */ - return *(u32int*) vaddrnol(P->R[13] + 4 + 4 * n); + return *(u32int*) vaddrnol(P->R[13] + 4 + 4 * n, 4); } static u64int @@ -127,7 +127,7 @@ sysseek(void) vlong n, *ret; Segment *seg; - ret = vaddr(arg(0), &seg); + ret = vaddr(arg(0), 8, &seg); fd = arg(1); n = argv(2); type = arg(4); @@ -202,7 +202,7 @@ sysexits(void) if(arg(0) == 0) exits(nil); else - exits(vaddrnol(arg(0))); + exits(vaddrnol(arg(0), 0)); } static void @@ -218,10 +218,10 @@ sysbrk(void) sysfatal("bss length < 0, wtf?"); s = P->S[SEGBSS]; wlock(&s->rw); - s->ref = realloc(s->ref, v - s->start + 4); - if(s->ref == nil) + s->dref = realloc(s->dref, v - s->start + 4); + if(s->dref == nil) sysfatal("error reallocating"); - s->data = s->ref + 1; + s->data = s->dref + 1; if(s->size < v - s->start) memset((char*)s->data + s->size, 0, v - s->start - s->size); s->size = v - s->start; @@ -276,16 +276,17 @@ sysrfork(void) Process *p; Segment *s, *t; Fd *old; - enum { - RFORKPASS = RFENVG | RFCENVG | RFNOTEG | RFNOMNT | RFNAMEG | RFCNAMEG | RFNOWAIT | RFREND | RFFDG | RFCFDG, - RFORKHANDLED = RFPROC | RFMEM, - }; flags = arg(0); if(systrace) fprint(2, "rfork(%#o)\n", flags); - if(flags & ~(RFORKPASS | RFORKHANDLED)) - sysfatal("rfork with unhandled flags %#o", flags & ~(RFORKPASS | RFORKHANDLED)); + if((flags & (RFFDG | RFCFDG)) == (RFFDG | RFCFDG) || + (flags & (RFNAMEG | RFCNAMEG)) == (RFNAMEG | RFCNAMEG) || + (flags & (RFENVG | RFCENVG)) == (RFENVG | RFCENVG)) { + P->R[0] = -1; + cherrstr("bad arg in syscall"); + return; + } if((flags & RFPROC) == 0) { if(flags & RFFDG) { old = P->fd; @@ -297,9 +298,10 @@ sysrfork(void) P->fd = newfd(); fddecref(old); } - P->R[0] = noteerr(rfork(flags & RFORKPASS), 0); + P->R[0] = noteerr(rfork(flags), 0); return; } + incref(&nproc); p = emallocz(sizeof(Process)); memcpy(p, P, sizeof(Process)); for(i = 0; i < SEGNUM; i++) { @@ -311,15 +313,15 @@ sysrfork(void) incref(t); t->size = s->size; t->start = s->start; - t->ref = emalloc(sizeof(Ref) + s->size); - memset(t->ref, 0, sizeof(Ref)); - incref(t->ref); - t->data = t->ref + 1; + t->dref = emalloc(sizeof(Ref) + s->size); + memset(t->dref, 0, sizeof(Ref)); + incref(t->dref); + t->data = t->dref + 1; memcpy(t->data, s->data, s->size); p->S[i] = t; } else { + incref(s->dref); incref(s); - incref(s->ref); } } @@ -328,15 +330,17 @@ sysrfork(void) else if(flags & RFCFDG) p->fd = newfd(); else - incref(&P->fd->ref); + incref(P->fd); - rc = rfork(RFPROC | RFMEM | (flags & RFORKPASS)); - if(rc < 0) - sysfatal("rfork: %r"); + incref(P->path); + rc = rfork(RFMEM | flags); + if(rc < 0) /* this should NEVER happen */ + sysfatal("rfork failed wtf: %r"); if(rc == 0) { P = p; atexit(cleanup); P->pid = getpid(); + addproc(P); } P->R[0] = rc; } @@ -351,16 +355,16 @@ sysexec(void) name = arg(0); argv = arg(1); - namet = strdup(vaddr(name, &seg1)); + namet = strdup(vaddr(name, 0, &seg1)); segunlock(seg1); - argvt = vaddr(argv, &seg1); + argvt = vaddr(argv, 0, &seg1); if(systrace) fprint(2, "exec(%#ux=\"%s\", %#ux)\n", name, namet, argv); for(argc = 0; argvt[argc]; argc++) ; argvv = emalloc(sizeof(char *) * argc); for(i = 0; i < argc; i++) { - argvv[i] = strdup(vaddr(argvt[i], &seg2)); + argvv[i] = strdup(vaddr(argvt[i], 0, &seg2)); segunlock(seg2); } segunlock(seg1); |