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
--
⑨