M gnot/devcons.c => gnot/devcons.c +2 -2
@@ 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
M port/devscsi.c => port/devscsi.c +6 -0
@@ 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)
{
M port/pgrp.c => port/pgrp.c +24 -15
@@ 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; i<from->nmtab; 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; i<from->nenv; 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; i<from->nmtab; i++,m++)
+ if(m->c){
+ incref(m->c);
+ lock(m->mnt);
+ m->mnt->ref++;
+ unlock(m->mnt);
+ }
+
+ unlock(from);
+}
M port/portdat.h => port/portdat.h +9 -0
@@ 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
*/
M port/portfns.h => port/portfns.h +1 -0
@@ 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);
M port/sysproc.c => port/sysproc.c +19 -3
@@ 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;