shithub: drawcpu

Download patch

ref: 830f663db481f4566d0da79d2c29069d1e38a36d
parent: c2cdd4ac83e493d3be1705a890863e72210179e7
author: halfwit <michaelmisch1985@gmail.com>
date: Wed Jan 7 10:38:35 EST 2026

Remove competing Fd definition, we have fgrp

--- a/kern/dat.h
+++ b/kern/dat.h
@@ -10,7 +10,6 @@
 typedef struct Dirtab	Dirtab;
 typedef struct Egrp	Egrp;
 typedef struct Evalue	Evalue;
-typedef struct Fd Fd;
 typedef struct Fgrp	Fgrp;
 typedef struct DevConf	DevConf;
 typedef struct Label	Label;
@@ -105,7 +104,7 @@
 
 	COPEN	= 0x0001,		/* for i/o */
 	CMSG	= 0x0002,		/* the message channel for a mount */
-/*	CCREATE	= 0x0004,		permits creation if c->mnt */
+	CCREATE	= 0x0004,		/* permits creation if c->mnt */
 	CCEXEC	= 0x0008,		/* close on exec */
 	CFREE	= 0x0010,		/* not in use */
 	CRCLOSE	= 0x0020,		/* remove on close */
@@ -375,11 +374,11 @@
 struct Fgrp
 {
 	Ref	ref;
+	Lock lk;
 	Chan	**fd;
 	int	nfd;			/* number allocated */
 	int	maxfd;			/* highest fd in use */
 	int	exceed;			/* debugging */
-	Lock lk;
 };
 
 enum
@@ -434,14 +433,6 @@
 	Proc_tracesyscall,
 };
 
-struct Fd
-{
-	RWLock rw;
-	Ref ref;
-	uint *fds;
-	int nfds;
-};
-
 struct Proc
 {
 	uint	state;
@@ -485,7 +476,6 @@
 	u32int CPSR;		/* status register */
 	u32int FPSR;
 	double F[Nfpregs];
-	Fd	   *fd; 		/* fd for syscall emulation */
 
 	/* Notes */
 	Note	*lastnote;
--- a/kern/fns.h
+++ b/kern/fns.h
@@ -68,8 +68,6 @@
 u32int      evenaddr(u32int,u32int);
 void		exhausted(char*);
 void		exit(int);
-Fd*         copyfd(Fd*);
-void        fddecref(Fd*);
 Chan*		fdtochan(int, int, int, int);
 void        fpatransfer(u32int);
 void        fpaoperation(u32int);
@@ -218,7 +216,6 @@
 int 		setlabel(Label*);
 void		setmalloctag(void*, uintptr);
 void		setrealloctag(void*, uintptr);
-void        setcexec(Fd *, int, int);
 long		showfilewrite(char*, int);
 char*		skipslash(char*);
 void		sleep(Rendez*, int(*)(void*), void*);
--- a/kern/procinit.c
+++ b/kern/procinit.c
@@ -31,8 +31,6 @@
 
 	p = mallocz(sizeof(Proc), 1);
 	p->pid = incref(&pidref);
-	p->fd = mallocz(sizeof(Fd), 1);
-	incref(&p->fd->ref);
 	strcpy(p->user, eve);
 	p->syserrstr = p->errbuf0;
 	p->errstr = p->errbuf1;
--- a/kern/syscall.c
+++ b/kern/syscall.c
@@ -7,6 +7,19 @@
 #include "sys.h"
 #include "proc.h"
 
+static void
+setcexec(int fd, int flags)
+{
+	Chan *c;
+	c = up->fgrp->fd[fd];   // get the Chan we just stored
+	if(c != nil){
+    	if(flags & OCEXEC)
+        	c->flag |= CCEXEC;
+    	else
+        	c->flag &= ~CCEXEC;
+	}
+}
+
 static void *
 emalloc(int n)
 {
@@ -79,10 +92,10 @@
 		free(namet);
 	if(fd < 0) {
 		noteerr(0, 1);
-		up->R[0] = fd;
+		up->R[0] = -1;
 		return;
 	}
-	setcexec(up->fd, fd, flags & OCEXEC);
+	setcexec(fd, flags & OCEXEC);
 	up->R[0] = fd;
 }
 
@@ -108,7 +121,7 @@
 		up->R[0] = fd;
 		return;
 	}
-	setcexec(up->fd, fd, flags & OCEXEC);
+	setcexec(fd, flags & OCEXEC);
 	up->R[0] = fd;
 }
 
@@ -123,7 +136,7 @@
 #endif
 	up->R[0] = noteerr(close(fd), 0);
 	if((fd & (1<<31)) == 0)
-		setcexec(up->fd, fd, 0);
+		setcexec(fd, 0);
 }
 
 static void
@@ -443,6 +456,20 @@
 	}
 	segunlock(seg1);
 
+	/* Close files marked close-on-exec */
+    if(up->fgrp != nil) {
+        Chan *c;
+        lock(&up->fgrp->lk);
+        for(i = 2; i <= up->fgrp->maxfd; i++) {
+            c = up->fgrp->fd[i];
+            if(c != nil && (c->flag & CCEXEC)) {
+                up->fgrp->fd[i] = nil;
+                cclose(c);
+            }
+        }
+        unlock(&up->fgrp->lk);
+    }
+
 	rc = loadtext(namet, argc, argvv);
 
 	for(i = 0; i < argc; i++)
@@ -736,7 +763,6 @@
 	}
 
 	afd = newfd(ac);
-	setcexec(up->fd, afd, ORDWR|OCEXEC);
 	up->R[0] = afd;
 	poperror(); /* ac */
 }
--- a/kern/sysfile.c
+++ b/kern/sysfile.c
@@ -652,14 +652,12 @@
 }
 
 long
-_sysstat(char *name, void *buf, long n)
+_sysstat(char *name, void *s, long l)
 {
 	Chan *c;
-	uchar *s;
-	uint l, r;
+	uint r;
 
-	l = n;
-	validaddr(buf, l, 1);
+	validaddr(s, l, 1);
 	validaddr(name, 1, 0);
 	c = namec(name, Aaccess, 0, 0);
 	if(waserror()){
@@ -666,12 +664,12 @@
 		cclose(c);
 		nexterror();
 	}
-	l = devtab[c->type]->stat(c, buf, l);
+	r = 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;
+	return r;
 }
 
 long
@@ -863,13 +861,12 @@
 }
 
 long
-_syswstat(char *name, void *buf, long n)
+_syswstat(char *name, void *s, long l)
 {
 	Chan *c;
-	uint l;
+	uint r;
 
-	l = n;
-	validstat(buf, l);
+	validstat(s, l);
 	validaddr(name, 1, 0);
 	c = namec(name, Aaccess, 0, 0);
 	if(waserror()){
@@ -876,27 +873,25 @@
 		cclose(c);
 		nexterror();
 	}
-	l = devtab[c->type]->wstat(c, buf, l);
+	r = devtab[c->type]->wstat(c, s, l);
 	poperror();
 	cclose(c);
-	return l;
+	return r;
 }
 
 long
-_sysfwstat(int fd, void *buf, long n)
+_sysfwstat(int fd, void *s, long l)
 {
 	Chan *c;
-	uint l;
 
-	l = n;
-	validaddr(buf, l, 0);
-	validstat(buf, l);
+	validaddr(s, l, 0);
+	validstat(s, l);
 	c = fdtochan(fd, -1, 1, 1);
 	if(waserror()) {
 		cclose(c);
 		nexterror();
 	}
-	l = devtab[c->type]->wstat(c, buf, l);
+	l = devtab[c->type]->wstat(c, s, l);
 	poperror();
 	cclose(c);
 	return l;
--- a/kern/sysproc.c
+++ b/kern/sysproc.c
@@ -76,78 +76,7 @@
 	return(w);
 }
 
-Fd *
-newfid(void)
-{
-	Fd *fd;
-	
-	fd = mallocz(sizeof(*fd), 1);
-	incref(&fd->ref);
-	return fd;
-}
-
-Fd *
-copyfd(Fd *old)
-{
-	Fd *new;
-	
-	rlock(&old->rw);
-	new = newfid();
-	if(old->nfds > 0) {
-		new->nfds = old->nfds;
-		new->fds = mallocz(old->nfds, 1);
-		memcpy(new->fds, old->fds, old->nfds);
-	}
-	runlock(&old->rw);
-	return new;
-}
-
-void
-fddecref(Fd *fd)
-{
-	if(decref(&fd->ref) == 0) {
-		free(fd->fds);
-		free(fd);
-	}
-}
-
 int
-iscexec(Fd *fd, int n)
-{
-	int r;
-
-	r = 0;
-	rlock(&fd->rw);
-	if(n / 8 < fd->nfds)
-		r = (fd->fds[n / 8] & (1 << (n % 8))) != 0;
-	runlock(&fd->rw);
-	return r;
-}
-
-void
-setcexec(Fd *fd, int n, int status)
-{
-	int old;
-
-	wlock(&fd->rw);
-	if(n / 8 >= fd->nfds) {
-		if(status == 0) {
-			wunlock(&fd->rw);
-			return;
-		}
-		old = fd->nfds;
-		fd->nfds = (n / 8) + 1;
-		fd->fds = realloc(fd->fds, fd->nfds);
-		memset(fd->fds + old, 0, fd->nfds - old);
-	}
-	if(status == 0)
-		fd->fds[n / 8] &= ~(1 << (n % 8));
-	else
-		fd->fds[n / 8] |= (1 << (n % 8));
-	wunlock(&fd->rw);
-}
-
-int
 procfdprint(Chan *c, int fd, char *s, int ns)
 {
 	return snprint(s, ns, "%3d %.2s %C %4ld (%.16llux %lud %.2ux) %5ld %8lld %s\n",
@@ -158,28 +87,6 @@
 		8102, c->offset, c->path->s);
 }
 
-void
-fdclear(Fd *fd)
-{
-	int i, j, k;
-
-	wlock(&fd->rw);
-	if(fd->nfds == 0) {
-		wunlock(&fd->rw);
-		return;
-	}
-	for(i = 0; i < fd->nfds; i++) {
-		j = fd->fds[i];
-		for(k = 0; k < 8; k++)
-			if(j & (1<<k))
-				close(8 * i + k);
-	}
-	free(fd->fds);
-	fd->nfds = 0;
-	fd->fds = nil;
-	wunlock(&fd->rw);
-}
-
 ulong
 beswal(ulong l)
 {
@@ -430,7 +337,6 @@
     memset(bss->data, 0, bss->size);
     up->R[15] = beswal(hdr.entry);
     close(fd);
-    fdclear(up->fd);
     initstack(argc, argv);
 
 #ifdef DTRACE
--