From f962154d1a96ab5d371b33caad539fac6911a6fd Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 14 May 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-05-14 --- gnot/devcons.c | 4 ++-- port/devscsi.c | 6 ++++++ port/pgrp.c | 39 ++++++++++++++++++++++++--------------- port/portdat.h | 9 +++++++++ port/portfns.h | 1 + port/sysproc.c | 22 +++++++++++++++++++--- 6 files changed, 61 insertions(+), 20 deletions(-) diff --git a/gnot/devcons.c b/gnot/devcons.c index cb2d9f235ece14b79b673b5c68ddc3a658987d63..6fceb9c12a7dfc633668c0ddc6b333ff06d58032 100644 --- a/gnot/devcons.c +++ b/gnot/devcons.c @@ -70,7 +70,7 @@ struct Rs232{ Queue *wq; Alarm *a; /* alarm for waking the rs232 kernel process */ int started; /* true if output interrupt pending */ - int delay; /* time between character input and waking kproc */ + int delay; /* between character input and waking kproc */ Rendez r; Rendez rempty; }; @@ -1007,7 +1007,7 @@ rs232ichar(int c) r = &rs232; if(putc(&r->in, c) < 0) - screenputc('^'); + /*screenputc('^')*/; /* * pass upstream within r->delay milliseconds diff --git a/port/devscsi.c b/port/devscsi.c index c10dfaac9153ea51c6ba12e108931a6880fb7034..1499e86bb4c8833ab4a5dce894ef6edba0fd1c63 100644 --- a/port/devscsi.c +++ b/port/devscsi.c @@ -31,6 +31,12 @@ static int debugs[8]; static int isscsi; static int ownid = 0x08|7; /* enable advanced features */ +void * +dmaalloc(ulong n) +{ + return ialloc(n, 0); +} + static int scsigen1(Chan *c, long qid, Dir *dp) { diff --git a/port/pgrp.c b/port/pgrp.c index a4deabd9517d950b4d8dcfaec625785511db9250..21edb77050767d30e8e390c227476cbed4eec9fe 100644 --- a/port/pgrp.c +++ b/port/pgrp.c @@ -182,26 +182,13 @@ closemount(Mount *m) } void -pgrpcpy(Pgrp *to, Pgrp *from) +envcpy(Pgrp *to, Pgrp *from) { - int i; - Mtab *m; Envp *ep; Env *e; + int i; lock(from); - memmove(to->user, from->user, NAMELEN); - memmove(to->mtab, from->mtab, from->nmtab*sizeof(Mtab)); - to->nmtab = from->nmtab; - m = to->mtab; - for(i=0; inmtab; i++,m++) - if(m->c){ - incref(m->c); - lock(m->mnt); - m->mnt->ref++; - unlock(m->mnt); - } - to->nenv = from->nenv; ep = to->etab; for(i=0; inenv; i++,ep++){ @@ -233,3 +220,25 @@ pgrpcpy(Pgrp *to, Pgrp *from) } unlock(from); } + +void +pgrpcpy(Pgrp *to, Pgrp *from) +{ + int i; + Mtab *m; + + lock(from); + memmove(to->user, from->user, NAMELEN); + memmove(to->mtab, from->mtab, from->nmtab*sizeof(Mtab)); + to->nmtab = from->nmtab; + m = to->mtab; + for(i=0; inmtab; i++,m++) + if(m->c){ + incref(m->c); + lock(m->mnt); + m->mnt->ref++; + unlock(m->mnt); + } + + unlock(from); +} diff --git a/port/portdat.h b/port/portdat.h index 17fd686c5b8f6b17402c1d469691ab9c7779a79f..98834a6a62e44586a360d9589dacdec40231999f 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -273,6 +273,15 @@ struct Pgrp Envp *etab; }; +enum /* Argument to forkpgrp call */ +{ + FPall = 0, /* Concession to back portablility */ + FPnote = 1, + FPnamespc = 2, + FPenv = 4, + FPclear = 8, +}; + /* * process memory segments */ diff --git a/port/portfns.h b/port/portfns.h index bda32d2845db61942f03fe0884d60a26929dc7fa..44d1d5eb131dfc793402c4af481ce2cfd21cc7f5 100644 --- a/port/portfns.h +++ b/port/portfns.h @@ -42,6 +42,7 @@ void dumpqueues(void); void dumpregs(Ureg*); void dumpstack(void); void envpgclose(Env *); +void envcpy(Pgrp*, Pgrp*); int eqchan(Chan*, Chan*, long); int eqqid(Qid, Qid); void error(int); diff --git a/port/sysproc.c b/port/sysproc.c index d9bf1f5c479231df4cb79afe71771918c0f70442..f1a281066dd4bf68743dfc681a77ae8315f08ceb 100644 --- a/port/sysproc.c +++ b/port/sysproc.c @@ -460,6 +460,7 @@ syserrstr(ulong *arg) long sysforkpgrp(ulong *arg) { + int mask; Pgrp *pg; pg = newpgrp(); @@ -467,10 +468,25 @@ sysforkpgrp(ulong *arg) closepgrp(pg); nexterror(); } - if(arg[0] == 0) + + mask = arg[0]; + if(mask == FPall) + mask = FPnote|FPenv|FPnamespc; + + memmove(pg->user, u->p->pgrp->user, NAMELEN); + + if(mask & FPnamespc) pgrpcpy(pg, u->p->pgrp); - else - memmove(pg->user, u->p->pgrp->user, NAMELEN); + + if(mask & FPenv) + envcpy(pg, u->p->pgrp); + + if((mask & FPnote) == 0) { + u->nnote = 0; + u->notified = 0; + memset(u->note, 0, sizeof(u->note)); + } + closepgrp(u->p->pgrp); u->p->pgrp = pg; return pg->pgrpid;