diff options
author | phk <phk@FreeBSD.org> | 2004-11-07 22:16:07 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2004-11-07 22:16:07 +0000 |
commit | 52da2f8e345a7de465e7604b8712493ea0fedebd (patch) | |
tree | a14848a9cd0a6a02b8bde301a11a3f8c51e8bdf7 /sys/kern/kern_descrip.c | |
parent | 878fd8dde724c338fc81887b50b0a93faf7495cd (diff) | |
download | FreeBSD-src-52da2f8e345a7de465e7604b8712493ea0fedebd.zip FreeBSD-src-52da2f8e345a7de465e7604b8712493ea0fedebd.tar.gz |
Introduce fdclose() which will clean an entry in a filedesc.
Replace homerolled versions with call to fdclose().
Make fdunused() static to kern_descrip.c
Diffstat (limited to 'sys/kern/kern_descrip.c')
-rw-r--r-- | sys/kern/kern_descrip.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index 384ca16..8f5ea75 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -99,6 +99,7 @@ static int do_dup(struct thread *td, enum dup_type type, int old, int new, static int fd_first_free(struct filedesc *, int, int); static int fd_last_used(struct filedesc *, int, int); static void fdgrowtable(struct filedesc *, int); +static void fdunused(struct filedesc *fdp, int fd); /* * A process is initially started out with NDFILE descriptors stored within @@ -224,7 +225,7 @@ fdused(struct filedesc *fdp, int fd) /* * Mark a file descriptor as unused. */ -void +static void fdunused(struct filedesc *fdp, int fd) { FILEDESC_LOCK_ASSERT(fdp, MA_OWNED); @@ -1729,6 +1730,21 @@ setugidsafety(td) FILEDESC_UNLOCK(fdp); } +void +fdclose(struct filedesc *fdp, struct file *fp, int idx, struct thread *td) +{ + + FILEDESC_LOCK(fdp); + if (fdp->fd_ofiles[idx] == fp) { + fdp->fd_ofiles[idx] = NULL; + fdunused(fdp, idx); + FILEDESC_UNLOCK(fdp); + fdrop(fp, td); + } else { + FILEDESC_UNLOCK(fdp); + } +} + /* * Close any files on exec? */ |