From 735aed2cbbc5e84640319928996e54b62ed7e542 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 6 Jun 1997 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1997-06-06 --- carrera/main.c | 5 +---- pc/main.c | 5 +---- port/devdup.c | 2 +- port/pgrp.c | 15 +++++++++++++-- port/sysfile.c | 5 ++++- port/sysproc.c | 9 +++------ 6 files changed, 23 insertions(+), 18 deletions(-) diff --git a/carrera/main.c b/carrera/main.c index 54fa4803f9e2a742a218d719e7cd4ec8e46ce59a..a264f64beeca73ec29c38d844c2027c855d72e85 100644 --- a/carrera/main.c +++ b/carrera/main.c @@ -357,10 +357,7 @@ userinit(void) p->pgrp = newpgrp(); p->egrp = smalloc(sizeof(Egrp)); p->egrp->ref = 1; - p->fgrp = smalloc(sizeof(Fgrp)); - p->fgrp->ref = 1; - p->fgrp->fd = smalloc(DELTAFD*sizeof(Chan*)); - p->fgrp->nfd = DELTAFD; + p->fgrp = dupfgrp(nil); p->rgrp = newrgrp(); p->procmode = 0640; diff --git a/pc/main.c b/pc/main.c index 6835f92c0766d5cc8a037cb981bb5699b09d9bda..07aceeb9cac93ed2bbfc3500c6531465fed12d6e 100644 --- a/pc/main.c +++ b/pc/main.c @@ -232,10 +232,7 @@ userinit(void) p->pgrp = newpgrp(); p->egrp = smalloc(sizeof(Egrp)); p->egrp->ref = 1; - p->fgrp = smalloc(sizeof(Fgrp)); - p->fgrp->ref = 1; - p->fgrp->fd = smalloc(DELTAFD*sizeof(Chan*)); - p->fgrp->nfd = DELTAFD; + p->fgrp = dupfgrp(nil); p->rgrp = newrgrp(); p->procmode = 0640; diff --git a/port/devdup.c b/port/devdup.c index 1ba68778cae7fe87f32182a7c435944f94a73f4e..658e4753761a6b60f0da18cd902102c5e73d7c80 100644 --- a/port/devdup.c +++ b/port/devdup.c @@ -13,7 +13,7 @@ dupgen(Chan *c, Dirtab*, int, int s, Dir *dp) Chan *f; static int perm[] = { 0400, 0200, 0600, 0 }; - if(s >= fgrp->maxfd) + if(s > fgrp->maxfd) return -1; if((f=fgrp->fd[s]) == 0) return 0; diff --git a/port/pgrp.c b/port/pgrp.c index e2b6ae63b47be620aa5a6ca62beadf8daaed08b7..31b977774ac0c37a24b3073dbdda6ca5eea747ce 100644 --- a/port/pgrp.c +++ b/port/pgrp.c @@ -167,15 +167,26 @@ dupfgrp(Fgrp *f) int i; new = smalloc(sizeof(Fgrp)); + if(f == nil){ + new->fd = smalloc(DELTAFD*sizeof(Chan*)); + new->nfd = DELTAFD; + new->ref = 1; + return new; + } + + lock(f); /* Make new fd list shorter if possible, preserving quantization */ new->nfd = f->maxfd+1; i = new->nfd%DELTAFD; if(i != 0) new->nfd += DELTAFD - i; - new->fd = smalloc(new->nfd*sizeof(Chan*)); + new->fd = malloc(new->nfd*sizeof(Chan*)); + if(new->fd == 0){ + unlock(f); + error("no memory for fgrp"); + } new->ref = 1; - lock(f); new->maxfd = f->maxfd; for(i = 0; i <= f->maxfd; i++) { if(c = f->fd[i]){ diff --git a/port/sysfile.c b/port/sysfile.c index 74cb2de3c055e4ccb3078c279419838ab722df69..13edeffdbdda09a36092f10d4b12e53040e3fdb3 100644 --- a/port/sysfile.c +++ b/port/sysfile.c @@ -30,11 +30,14 @@ newfd(Chan *c) * of fid in 9P */ if(f->nfd >= 5000){ + Exhausted: unlock(f); exhausted("file descriptors"); return -1; } - newfd = smalloc((f->nfd+DELTAFD)*sizeof(Chan*)); + newfd = malloc((f->nfd+DELTAFD)*sizeof(Chan*)); + if(newfd == 0) + goto Exhausted; oldfd = f->fd; memmove(newfd, oldfd, f->nfd*sizeof(Chan*)); f->fd = newfd; diff --git a/port/sysproc.c b/port/sysproc.c index 88bccbe55565f2cc32b285a62cf9dfb00d944859..ed2a653b92f66de2c05244005dd0c6839b21de70 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -55,8 +55,7 @@ sysrfork(ulong *arg) else if(flag & RFCFDG) { ofg = up->fgrp; - up->fgrp = smalloc(sizeof(Fgrp)); - up->fgrp->ref = 1; + up->fgrp = dupfgrp(nil); closefgrp(ofg); } if(flag & RFNOTEG) @@ -105,10 +104,8 @@ sysrfork(ulong *arg) if(flag & (RFFDG|RFCFDG)) { if(flag & RFFDG) p->fgrp = dupfgrp(up->fgrp); - else { - p->fgrp = smalloc(sizeof(Fgrp)); - p->fgrp->ref = 1; - } + else + p->fgrp = dupfgrp(nil); } else { p->fgrp = up->fgrp;