shithub: drawcpu

Download patch

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);
--