Hi,

Joerg Sonnenberger wrote:
> On Wed, Jul 04, 2007 at 08:27:49PM -0400, Ighighi Ighighi wrote:
>> The closefrom() call, available in Solaris, is present in NetBSD since
>> version 3.0.
>> It is implemented with the F_CLOSEM fcntl() available since version 2.0.
> 
> You could also add a system call like it was done in DragonFly. That
> might be even simpler to implement.

Here is my implementation for FreeBSD.  Some difference between my and
DragonFly's implementation:

 - closefrom(-1) would be no-op on DragonFly, my version would close all
open files (From my understanding of OpenSolaris's userland
implementation, this is Solaris's behavior).
 - my version closefrom(very_big_fd) would result in EBADF.  I am not
very sure whether this is correct, but it does not hurt for applications
that thinks closefrom() would return void.

To RW:  I have not found a suitable audit event for this, should I
create a new event?

Cheers,
-- 
Xin LI <[EMAIL PROTECTED]>      http://www.delphij.net/
FreeBSD - The Power to Serve!
Index: lib/libc/sys/Symbol.map
===================================================================
RCS file: /home/ncvs/src/lib/libc/sys/Symbol.map,v
retrieving revision 1.8
diff -u -p -u -r1.8 Symbol.map
--- lib/libc/sys/Symbol.map     5 Jun 2007 08:24:34 -0000       1.8
+++ lib/libc/sys/Symbol.map     6 Jul 2007 08:38:55 -0000
@@ -65,6 +65,7 @@ FBSD_1.0 {
        clock_gettime;
        clock_settime;
        close;
+       closefrom;
        connect;
        dup;
        dup2;
Index: sys/kern/init_sysent.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/init_sysent.c,v
retrieving revision 1.229
diff -u -p -u -r1.229 init_sysent.c
--- sys/kern/init_sysent.c      4 Jul 2007 22:49:54 -0000       1.229
+++ sys/kern/init_sysent.c      6 Jul 2007 08:12:02 -0000
@@ -2,7 +2,7 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/kern/init_sysent.c,v 1.229 2007/07/04 22:49:54 peter Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/kern/syscalls.master,v 1.232 2007/07/04 
22:47:37 peter Exp 
  */
 
@@ -510,4 +510,5 @@ struct sysent sysent[] = {
        { AS(lseek_args), (sy_call_t *)lseek, AUE_LSEEK, NULL, 0, 0 },  /* 478 
= lseek */
        { AS(truncate_args), (sy_call_t *)truncate, AUE_TRUNCATE, NULL, 0, 0 }, 
/* 479 = truncate */
        { AS(ftruncate_args), (sy_call_t *)ftruncate, AUE_FTRUNCATE, NULL, 0, 0 
},      /* 480 = ftruncate */
+       { AS(closefrom_args), (sy_call_t *)closefrom, AUE_NULL, NULL, 0, 0 },   
/* 481 = closefrom */
 };
Index: sys/kern/kern_descrip.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_descrip.c,v
retrieving revision 1.312
diff -u -p -u -r1.312 kern_descrip.c
--- sys/kern/kern_descrip.c     3 Jul 2007 21:26:06 -0000       1.312
+++ sys/kern/kern_descrip.c     6 Jul 2007 08:04:00 -0000
@@ -989,6 +989,44 @@ fgetown(sigiop)
 }
 
 /*
+ * Close many file descriptors.
+ */
+#ifndef _SYS_SYSPROTO_H_
+struct closefrom_args {
+       int     fd;
+};
+#endif
+/* ARGSUSED */
+int
+closefrom(struct thread *td, struct closefrom_args *uap)
+{
+
+       return(kern_closefrom(td, uap->fd));
+}
+
+int
+kern_closefrom(struct thread *td, int fd)
+{
+       struct filedesc *fdp;
+       int currfd;
+
+       fdp = td->td_proc->p_fd;
+
+       if (fd > fdp->fd_lastfile)
+               return (EBADF);
+       else if (fd < 0)
+               fd = 0;
+
+       MPASS(fd >= 0);
+
+       while ((currfd = fdp->fd_lastfile) >= fd)
+               if (kern_close(td, currfd) == EINTR)
+                       return (EINTR);
+
+       return (0);
+}
+
+/*
  * Close a file descriptor.
  */
 #ifndef _SYS_SYSPROTO_H_
Index: sys/kern/syscalls.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/syscalls.c,v
retrieving revision 1.213
diff -u -p -u -r1.213 syscalls.c
--- sys/kern/syscalls.c 4 Jul 2007 22:49:55 -0000       1.213
+++ sys/kern/syscalls.c 6 Jul 2007 08:12:02 -0000
@@ -2,7 +2,7 @@
  * System call names.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/kern/syscalls.c,v 1.213 2007/07/04 22:49:55 peter Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/kern/syscalls.master,v 1.232 2007/07/04 
22:47:37 peter Exp 
  */
 
@@ -488,4 +488,5 @@ const char *syscallnames[] = {
        "lseek",                        /* 478 = lseek */
        "truncate",                     /* 479 = truncate */
        "ftruncate",                    /* 480 = ftruncate */
+       "closefrom",                    /* 481 = closefrom */
 };
Index: sys/kern/syscalls.master
===================================================================
RCS file: /home/ncvs/src/sys/kern/syscalls.master,v
retrieving revision 1.232
diff -u -p -u -r1.232 syscalls.master
--- sys/kern/syscalls.master    4 Jul 2007 22:47:37 -0000       1.232
+++ sys/kern/syscalls.master    6 Jul 2007 07:41:28 -0000
@@ -846,5 +846,6 @@
                                    int whence); }
 479    AUE_TRUNCATE    STD     { int truncate(char *path, off_t length); }
 480    AUE_FTRUNCATE   STD     { int ftruncate(int fd, off_t length); }
+481    AUE_NULL        STD     { int closefrom(int fd); }
 ; Please copy any additions and changes to the following compatability tables:
 ; sys/compat/freebsd32/syscalls.master
Index: sys/kern/systrace_args.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/systrace_args.c,v
retrieving revision 1.13
diff -u -p -u -r1.13 systrace_args.c
--- sys/kern/systrace_args.c    4 Jul 2007 22:49:55 -0000       1.13
+++ sys/kern/systrace_args.c    6 Jul 2007 08:12:02 -0000
@@ -2,7 +2,7 @@
  * System call argument to DTrace register array converstion.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/kern/systrace_args.c,v 1.13 2007/07/04 22:49:55 peter Exp 
$
+ * $FreeBSD$
  * This file is part of the DTrace syscall provider.
  */
 
@@ -2862,6 +2862,13 @@ systrace_args(int sysnum, void *params, 
                *n_args = 2;
                break;
        }
+       /* closefrom */
+       case 481: {
+               struct closefrom_args *p = params;
+               iarg[0] = p->fd; /* int */
+               *n_args = 1;
+               break;
+       }
        default:
                *n_args = 0;
                break;
Index: sys/compat/freebsd32/freebsd32_proto.h
===================================================================
RCS file: /home/ncvs/src/sys/compat/freebsd32/freebsd32_proto.h,v
retrieving revision 1.77
diff -u -p -u -r1.77 freebsd32_proto.h
--- sys/compat/freebsd32/freebsd32_proto.h      4 Jul 2007 23:03:50 -0000       
1.77
+++ sys/compat/freebsd32/freebsd32_proto.h      6 Jul 2007 09:57:00 -0000
@@ -2,7 +2,7 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/compat/freebsd32/freebsd32_proto.h,v 1.77 2007/07/04 
23:03:50 peter Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.90 
2007/07/04 23:02:40 peter Exp 
  */
 
Index: sys/compat/freebsd32/freebsd32_syscall.h
===================================================================
RCS file: /home/ncvs/src/sys/compat/freebsd32/freebsd32_syscall.h,v
retrieving revision 1.75
diff -u -p -u -r1.75 freebsd32_syscall.h
--- sys/compat/freebsd32/freebsd32_syscall.h    4 Jul 2007 23:03:50 -0000       
1.75
+++ sys/compat/freebsd32/freebsd32_syscall.h    6 Jul 2007 09:57:00 -0000
@@ -2,7 +2,7 @@
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/compat/freebsd32/freebsd32_syscall.h,v 1.75 2007/07/04 
23:03:50 peter Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.90 
2007/07/04 23:02:40 peter Exp 
  */
 
@@ -337,4 +337,5 @@
 #define        FREEBSD32_SYS_freebsd32_lseek   478
 #define        FREEBSD32_SYS_freebsd32_truncate        479
 #define        FREEBSD32_SYS_freebsd32_ftruncate       480
-#define        FREEBSD32_SYS_MAXSYSCALL        481
+#define        FREEBSD32_SYS_closefrom 481
+#define        FREEBSD32_SYS_MAXSYSCALL        482
Index: sys/compat/freebsd32/freebsd32_syscalls.c
===================================================================
RCS file: /home/ncvs/src/sys/compat/freebsd32/freebsd32_syscalls.c,v
retrieving revision 1.66
diff -u -p -u -r1.66 freebsd32_syscalls.c
--- sys/compat/freebsd32/freebsd32_syscalls.c   4 Jul 2007 23:03:50 -0000       
1.66
+++ sys/compat/freebsd32/freebsd32_syscalls.c   6 Jul 2007 09:57:00 -0000
@@ -2,7 +2,7 @@
  * System call names.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/compat/freebsd32/freebsd32_syscalls.c,v 1.66 2007/07/04 
23:03:50 peter Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.90 
2007/07/04 23:02:40 peter Exp 
  */
 
@@ -488,4 +488,5 @@ const char *freebsd32_syscallnames[] = {
        "freebsd32_lseek",                      /* 478 = freebsd32_lseek */
        "freebsd32_truncate",                   /* 479 = freebsd32_truncate */
        "freebsd32_ftruncate",                  /* 480 = freebsd32_ftruncate */
+       "closefrom",                    /* 481 = closefrom */
 };
Index: sys/compat/freebsd32/freebsd32_sysent.c
===================================================================
RCS file: /home/ncvs/src/sys/compat/freebsd32/freebsd32_sysent.c,v
retrieving revision 1.76
diff -u -p -u -r1.76 freebsd32_sysent.c
--- sys/compat/freebsd32/freebsd32_sysent.c     4 Jul 2007 23:03:50 -0000       
1.76
+++ sys/compat/freebsd32/freebsd32_sysent.c     6 Jul 2007 09:57:00 -0000
@@ -2,7 +2,7 @@
  * System call switch table.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/compat/freebsd32/freebsd32_sysent.c,v 1.76 2007/07/04 
23:03:50 peter Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/compat/freebsd32/syscalls.master,v 1.90 
2007/07/04 23:02:40 peter Exp 
  */
 
@@ -519,4 +519,5 @@ struct sysent freebsd32_sysent[] = {
        { AS(freebsd32_lseek_args), (sy_call_t *)freebsd32_lseek, AUE_LSEEK, 
NULL, 0, 0 },      /* 478 = freebsd32_lseek */
        { AS(freebsd32_truncate_args), (sy_call_t *)freebsd32_truncate, 
AUE_TRUNCATE, NULL, 0, 0 },     /* 479 = freebsd32_truncate */
        { AS(freebsd32_ftruncate_args), (sy_call_t *)freebsd32_ftruncate, 
AUE_FTRUNCATE, NULL, 0, 0 },  /* 480 = freebsd32_ftruncate */
+       { AS(closefrom_args), (sy_call_t *)closefrom, AUE_NULL, NULL, 0, 0 },   
/* 481 = closefrom */
 };
Index: sys/compat/freebsd32/syscalls.master
===================================================================
RCS file: /home/ncvs/src/sys/compat/freebsd32/syscalls.master,v
retrieving revision 1.90
diff -u -p -u -r1.90 syscalls.master
--- sys/compat/freebsd32/syscalls.master        4 Jul 2007 23:02:40 -0000       
1.90
+++ sys/compat/freebsd32/syscalls.master        6 Jul 2007 09:56:37 -0000
@@ -794,3 +794,4 @@
                                    u_int32_t lengthlo, u_int32_t lengthhi); }
 480    AUE_FTRUNCATE   STD     { int freebsd32_ftruncate(int fd, \
                                    u_int32_t lengthlo, u_int32_t lengthhi); }
+481    AUE_NULL        NOPROTO { int closefrom(int fd); }
Index: sys/sys/syscall.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/syscall.h,v
retrieving revision 1.210
diff -u -p -u -r1.210 syscall.h
--- sys/sys/syscall.h   4 Jul 2007 22:49:55 -0000       1.210
+++ sys/sys/syscall.h   6 Jul 2007 08:12:02 -0000
@@ -2,7 +2,7 @@
  * System call numbers.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/sys/syscall.h,v 1.210 2007/07/04 22:49:55 peter Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/kern/syscalls.master,v 1.232 2007/07/04 
22:47:37 peter Exp 
  */
 
@@ -400,4 +400,5 @@
 #define        SYS_lseek       478
 #define        SYS_truncate    479
 #define        SYS_ftruncate   480
-#define        SYS_MAXSYSCALL  481
+#define        SYS_closefrom   481
+#define        SYS_MAXSYSCALL  482
Index: sys/sys/syscall.mk
===================================================================
RCS file: /home/ncvs/src/sys/sys/syscall.mk,v
retrieving revision 1.165
diff -u -p -u -r1.165 syscall.mk
--- sys/sys/syscall.mk  4 Jul 2007 22:49:55 -0000       1.165
+++ sys/sys/syscall.mk  6 Jul 2007 08:12:02 -0000
@@ -1,6 +1,6 @@
 # FreeBSD system call names.
 # DO NOT EDIT-- this file is automatically generated.
-# $FreeBSD: src/sys/sys/syscall.mk,v 1.165 2007/07/04 22:49:55 peter Exp $
+# $FreeBSD$
 # created from FreeBSD: src/sys/kern/syscalls.master,v 1.232 2007/07/04 
22:47:37 peter Exp 
 MIASM =  \
        syscall.o \
@@ -348,4 +348,5 @@ MIASM =  \
        mmap.o \
        lseek.o \
        truncate.o \
-       ftruncate.o
+       ftruncate.o \
+       closefrom.o
Index: sys/sys/syscallsubr.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/syscallsubr.h,v
retrieving revision 1.46
diff -u -p -u -r1.46 syscallsubr.h
--- sys/sys/syscallsubr.h       7 Jun 2007 19:45:19 -0000       1.46
+++ sys/sys/syscallsubr.h       6 Jul 2007 08:02:13 -0000
@@ -73,6 +73,7 @@ int   kern_clock_gettime(struct thread *td
 int    kern_clock_settime(struct thread *td, clockid_t clock_id,
            struct timespec *ats);
 int    kern_close(struct thread *td, int fd);
+int    kern_closefrom(struct thread *td, int fd);
 int    kern_connect(struct thread *td, int fd, struct sockaddr *sa);
 int    kern_eaccess(struct thread *td, char *path, enum uio_seg pathseg,
            int flags);
Index: sys/sys/sysproto.h
===================================================================
RCS file: /home/ncvs/src/sys/sys/sysproto.h,v
retrieving revision 1.214
diff -u -p -u -r1.214 sysproto.h
--- sys/sys/sysproto.h  4 Jul 2007 22:49:55 -0000       1.214
+++ sys/sys/sysproto.h  6 Jul 2007 08:12:02 -0000
@@ -2,7 +2,7 @@
  * System call prototypes.
  *
  * DO NOT EDIT-- this file is automatically generated.
- * $FreeBSD: src/sys/sys/sysproto.h,v 1.214 2007/07/04 22:49:55 peter Exp $
+ * $FreeBSD$
  * created from FreeBSD: src/sys/kern/syscalls.master,v 1.232 2007/07/04 
22:47:37 peter Exp 
  */
 
@@ -1515,6 +1515,9 @@ struct ftruncate_args {
        char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
        char length_l_[PADL_(off_t)]; off_t length; char 
length_r_[PADR_(off_t)];
 };
+struct closefrom_args {
+       char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
+};
 int    nosys(struct thread *, struct nosys_args *);
 void   sys_exit(struct thread *, struct sys_exit_args *);
 int    fork(struct thread *, struct fork_args *);
@@ -1853,6 +1856,7 @@ int       mmap(struct thread *, struct mmap_ar
 int    lseek(struct thread *, struct lseek_args *);
 int    truncate(struct thread *, struct truncate_args *);
 int    ftruncate(struct thread *, struct ftruncate_args *);
+int    closefrom(struct thread *, struct closefrom_args *);
 
 #ifdef COMPAT_43
 
@@ -2416,6 +2420,7 @@ int       freebsd4_sigreturn(struct thread *, 
 #define        SYS_AUE_lseek   AUE_LSEEK
 #define        SYS_AUE_truncate        AUE_TRUNCATE
 #define        SYS_AUE_ftruncate       AUE_FTRUNCATE
+#define        SYS_AUE_closefrom       AUE_NULL
 
 #undef PAD_
 #undef PADL_
Index: crypto/openssh/config.h
===================================================================
RCS file: /home/ncvs/src/crypto/openssh/config.h,v
retrieving revision 1.19
diff -u -p -u -r1.19 config.h
--- crypto/openssh/config.h     6 Oct 2006 14:27:26 -0000       1.19
+++ crypto/openssh/config.h     6 Jul 2007 08:34:23 -0000
@@ -187,7 +187,7 @@
 #define HAVE_CLOCK_T 1
 
 /* Define to 1 if you have the `closefrom' function. */
-/* #undef HAVE_CLOSEFROM */
+#define HAVE_CLOSEFROM 0
 
 /* Define if gai_strerror() returns const char * */
 #define HAVE_CONST_GAI_STRERROR_PROTO 1
Index: crypto/openssh/ssh_namespace.h
===================================================================
RCS file: /home/ncvs/src/crypto/openssh/ssh_namespace.h,v
retrieving revision 1.2
diff -u -p -u -r1.2 ssh_namespace.h
--- crypto/openssh/ssh_namespace.h      30 Sep 2006 13:38:05 -0000      1.2
+++ crypto/openssh/ssh_namespace.h      6 Jul 2007 09:11:24 -0000
@@ -145,7 +145,6 @@
 #define ciphers_valid                          ssh_ciphers_valid
 #define cleanhostname                          ssh_cleanhostname
 #define cleanup_exit                           ssh_cleanup_exit
-#define closefrom                              ssh_closefrom
 #define colon                                  ssh_colon
 #define compat_cipher_proposal                 ssh_compat_cipher_proposal
 #define compat_datafellows                     ssh_compat_datafellows

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to