ref: c2cdd4ac83e493d3be1705a890863e72210179e7
parent: b0a436ba688da0ecc7c224ecfdf94287a01b1107
author: halfwit <michaelmisch1985@gmail.com>
date: Tue Jan 6 14:18:04 EST 2026
Pull in upstream changes to sysproc
--- a/kern/sysfile.c
+++ b/kern/sysfile.c
@@ -437,6 +437,7 @@
}
dir = c->qid.type&QTDIR;
+
/*
* The offset is passed through on directories, normally. sysseek complains but
* pread is used by servers and e.g. exportfs that shouldn't need to worry about this issue.
@@ -629,19 +630,22 @@
}
long
-_sysfstat(int fd, void *buf, long n)
+_sysfstat(int fd, void *s, long n)
{Chan *c;
- uint l;
+ char *name;
+ uint l, r;
l = n;
- validaddr(buf, l, 1);
+ validaddr(s, l, 1);
c = fdtochan(fd, -1, 0, 1);
if(waserror()) {cclose(c);
nexterror();
}
- l = devtab[c->type]->stat(c, buf, l);
+ l = devtab[c->type]->stat(c, s, l);
+ if((name = pathlast(c->path)) != nil)
+ r = dirsetname(name, strlen(name), s, r, l);
poperror();
cclose(c);
return l;
@@ -683,6 +687,28 @@
return 0;
}
+
+void
+fdclose(int fd, int flag)
+{+ Chan *c;
+ Fgrp *f = up->fgrp;
+
+ lock(&f->lk);
+ c = fd <= f->maxfd ? f->fd[fd] : nil;
+ if(c == nil || (flag != 0)){+ unlock(&f->lk);
+ return;
+ }
+ f->fd[fd] = nil;
+ if(fd == f->maxfd){+ while(fd > 0 && f->fd[fd] == nil)
+ f->maxfd = --fd;
+ }
+ unlock(&f->lk);
+ cclose(c);
+}
+
static int
bindmount(int ismount, int fd, int afd, char* arg0, char* arg1, int flag, char* spec)
{@@ -699,38 +725,35 @@
free(spec);
nexterror();
}
-
- if(up->pgrp->noattach)
- error(Enoattach);
-
- ac = nil;
bc = fdtochan(fd, ORDWR, 0, 1);
- if(waserror()) {- if(ac != nil)
- cclose(ac);
+ if(waserror()){cclose(bc);
nexterror();
}
-
- if(afd >= 0)
+ ac = nil;
+ if(afd >= 0){ac = fdtochan(afd, ORDWR, 0, 1);
-
+ if(waserror()){+ cclose(ac);
+ nexterror();
+ }
+ }
c0 = mntattach(bc, ac, spec, flag&MCACHE);
- poperror(); /* ac bc */
- if(ac != nil)
+ if(ac != nil){cclose(ac);
+ poperror();
+ }
cclose(bc);
+ poperror();
}else{spec = nil;
validaddr((uintptr)arg0, 1, 0);
c0 = namec(arg0, Abind, 0, 0);
}
-
if(waserror()){cclose(c0);
nexterror();
}
-
validaddr((uintptr)arg1, 1, 0);
c1 = namec(arg1, Amount, 0, 0);
if(waserror()){@@ -737,17 +760,15 @@
cclose(c1);
nexterror();
}
-
ret = cmount(c0, c1, flag, spec);
-
- poperror();
cclose(c1);
poperror();
cclose(c0);
+ poperror();
if(ismount){- _fdclose(fd, 0);
- poperror();
+ fdclose(fd, 0);
free(spec);
+ poperror();
}
return ret;
}
@@ -1135,7 +1156,7 @@
}
int
-sysstat(char *name, uchar *buf, int n)
+sysstat(char *name, uchar *s, int n)
{starterror();
if(waserror()){@@ -1142,7 +1163,7 @@
_syserror();
return -1;
}
- n = _sysstat(name, buf, n);
+ n = _sysstat(name, s, n);
enderror();
return n;
}
--- a/kern/sysproc.c
+++ b/kern/sysproc.c
@@ -545,8 +545,13 @@
//p->nargs = 0;
//p->setargs = 0;
+ if(up->procctl == Proc_tracesyscall)
+ p->procctl = Proc_tracesyscall;
+
qunlock(&p->debug);
qunlock(&up->debug);
+
+ /* Something broke! */
if(waserror()){p->kp = 1;
nexterror();
@@ -558,7 +563,6 @@
qunlock(&p->seglock);
nexterror();
}
-
for(i = 0; i < NSEG; i++)
if(up->seg[i] != nil)
p->seg[i] = dupseg(up->seg, i, n);
@@ -565,6 +569,7 @@
qunlock(&p->seglock);
poperror();
+ /* File descriptors */
if(flag & (RFFDG|RFCFDG)) {if(flag & RFFDG)
p->fgrp = dupfgrp(up->fgrp);
@@ -579,22 +584,16 @@
/* Process groups */
if(flag & (RFNAMEG|RFCNAMEG)) {p->pgrp = newpgrp();
- if(flag & RFNAMEG)
- pgrpcpy(p->pgrp, up->pgrp);
- /* inherit notallowed */
- memmove(p->pgrp->notallowed, up->pgrp->notallowed, sizeof p->pgrp->notallowed);
+ pgrpcpy(p->pgrp, up->pgrp);
} else {p->pgrp = up->pgrp;
incref(&p->pgrp->ref);
}
- if(flag & RFNOMNT)
- devmask(p->pgrp, 1, devs);
-
if(flag & RFREND)
p->rgrp = newrgrp();
else {- incref(&up->rgrp->ref);
p->rgrp = up->rgrp;
+ incref(&up->rgrp->ref);
}
/* Environment group */
@@ -612,8 +611,12 @@
p->arg = 0;
poperror();
+
+ if(flag & RFNOMNT)
+ devmask(p->pgrp, 1, devs);
+
if((flag&RFNOWAIT) == 0){- // TODO: Actually use parent + ppid
+ p->parent = up;
lock(&up->exl);
up->nchild++;
unlock(&up->exl);
--
⑨