看板 DFBSD_submit 關於我們 聯絡資訊
--J/dobhs11T7y2rNN Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi all, attached patch implements (somewhat naively) closefrom. It was on my list for too long. Joerg --J/dobhs11T7y2rNN Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="closefrom.diff" Index: kern/init_sysent.c =================================================================== RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/kern/init_sysent.c,v retrieving revision 1.27 diff -u -r1.27 init_sysent.c --- kern/init_sysent.c 21 Mar 2005 16:47:49 -0000 1.27 +++ kern/init_sysent.c 4 Apr 2005 20:09:18 -0000 @@ -2,7 +2,7 @@ * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/kern/init_sysent.c,v 1.27 2005/03/21 16:47:49 joerg Exp $ + * $DragonFly$ * created from DragonFly: src/sys/kern/syscalls.master,v 1.21 2005/03/21 16:45:08 joerg Exp */ @@ -496,4 +496,5 @@ { AS(jail_attach_args), (sy_call_t *)jail_attach }, /* 471 = jail_attach */ { AS(sys_set_tls_area_args), (sy_call_t *)sys_set_tls_area }, /* 472 = sys_set_tls_area */ { AS(sys_get_tls_area_args), (sy_call_t *)sys_get_tls_area }, /* 473 = sys_get_tls_area */ + { AS(closefrom_args), (sy_call_t *)closefrom }, /* 474 = closefrom */ }; Index: kern/kern_descrip.c =================================================================== RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/kern/kern_descrip.c,v retrieving revision 1.39 diff -u -r1.39 kern_descrip.c --- kern/kern_descrip.c 2 Feb 2005 20:36:09 -0000 1.39 +++ kern/kern_descrip.c 4 Apr 2005 20:33:33 -0000 @@ -609,9 +609,49 @@ } /* + * Close many file descriptors. + */ +/* ARGSUSED */ + +int +closefrom(struct closefrom_args *uap) +{ + return(kern_closefrom(uap->fd)); +} + +int +kern_closefrom(int fd) +{ + struct thread *td = curthread; + struct proc *p = td->td_proc; + struct filedesc *fdp; + int currfd, error; + + KKASSERT(p); + fdp = p->p_fd; + + if (fd < 0) /* XXX error? */ + return(EINVAL); + if (fd > fdp->fd_lastfile) + return(EBADF); + while ((currfd = fdp->fd_lastfile) >= fd) { + if (fdp->fd_ofiles[currfd] != NULL) { + error = kern_close(currfd); + if (error != 0 && error != EBADF) + return(error); + } else { + KASSERT((currfd == 0), ("fdp->fd_lastfile invalid")); + break; + } + } + return(0); +} + +/* * Close a file descriptor. */ /* ARGSUSED */ + int close(struct close_args *uap) { Index: kern/syscalls.c =================================================================== RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/kern/syscalls.c,v retrieving revision 1.26 diff -u -r1.26 syscalls.c --- kern/syscalls.c 21 Mar 2005 16:47:49 -0000 1.26 +++ kern/syscalls.c 4 Apr 2005 20:09:18 -0000 @@ -2,7 +2,7 @@ * System call names. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/kern/syscalls.c,v 1.26 2005/03/21 16:47:49 joerg Exp $ + * $DragonFly$ * created from DragonFly: src/sys/kern/syscalls.master,v 1.21 2005/03/21 16:45:08 joerg Exp */ @@ -481,4 +481,5 @@ "jail_attach", /* 471 = jail_attach */ "sys_set_tls_area", /* 472 = sys_set_tls_area */ "sys_get_tls_area", /* 473 = sys_get_tls_area */ + "closefrom", /* 474 = closefrom */ }; Index: kern/syscalls.master =================================================================== RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/kern/syscalls.master,v retrieving revision 1.21 diff -u -r1.21 syscalls.master --- kern/syscalls.master 21 Mar 2005 16:45:08 -0000 1.21 +++ kern/syscalls.master 4 Apr 2005 20:09:18 -0000 @@ -638,4 +638,5 @@ 471 STD BSD { int jail_attach(int jid); } 472 STD BSD { int sys_set_tls_area(int which, struct tls_info *info, size_t infosize); } 473 STD BSD { int sys_get_tls_area(int which, struct tls_info *info, size_t infosize); } +474 STD BSD { int closefrom(int fd); } Index: sys/kern_syscall.h =================================================================== RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/sys/kern_syscall.h,v retrieving revision 1.26 diff -u -r1.26 kern_syscall.h --- sys/kern_syscall.h 31 Jan 2005 17:20:48 -0000 1.26 +++ sys/kern_syscall.h 4 Apr 2005 20:09:18 -0000 @@ -141,6 +141,7 @@ int kern_mknod(struct nlookupdata *nd, int mode, int dev); int kern_open(struct nlookupdata *nd, int flags, int mode, int *res); int kern_close(int fd); +int kern_closefrom(int fd); int kern_readlink(struct nlookupdata *nd, char *buf, int count, int *res); int kern_rename(struct nlookupdata *fromnd, struct nlookupdata *tond); int kern_rmdir(struct nlookupdata *nd); Index: sys/syscall-args =================================================================== RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/sys/syscall-args,v retrieving revision 1.11 diff -u -r1.11 syscall-args --- sys/syscall-args 21 Mar 2005 16:47:49 -0000 1.11 +++ sys/syscall-args 4 Apr 2005 20:09:18 -0000 @@ -1,6 +1,6 @@ # System call argument table. # DO NOT EDIT-- this file is automatically generated. -# $DragonFly: src/sys/sys/syscall-args,v 1.11 2005/03/21 16:47:49 joerg Exp $ +# $DragonFly$ # Created from DragonFly: src/sys/kern/syscalls.master,v 1.21 2005/03/21 16:45:08 joerg Exp @@ -263,3 +263,4 @@ int jail_attach jail_attach jail_attach_args int jid int sys_set_tls_area sys_set_tls_area sys_set_tls_area_args int which struct tls_info * info size_t infosize int sys_get_tls_area sys_get_tls_area sys_get_tls_area_args int which struct tls_info * info size_t infosize +int closefrom closefrom closefrom_args int fd Index: sys/syscall-hide.h =================================================================== RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/sys/syscall-hide.h,v retrieving revision 1.28 diff -u -r1.28 syscall-hide.h --- sys/syscall-hide.h 21 Mar 2005 16:47:49 -0000 1.28 +++ sys/syscall-hide.h 4 Apr 2005 20:09:18 -0000 @@ -2,7 +2,7 @@ * System call hiders. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/sys/syscall-hide.h,v 1.28 2005/03/21 16:47:49 joerg Exp $ + * $DragonFly$ * created from DragonFly: src/sys/kern/syscalls.master,v 1.21 2005/03/21 16:45:08 joerg Exp */ @@ -301,3 +301,4 @@ HIDE_BSD(jail_attach) HIDE_BSD(sys_set_tls_area) HIDE_BSD(sys_get_tls_area) +HIDE_BSD(closefrom) Index: sys/syscall.h =================================================================== RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/sys/syscall.h,v retrieving revision 1.28 diff -u -r1.28 syscall.h --- sys/syscall.h 21 Mar 2005 16:47:49 -0000 1.28 +++ sys/syscall.h 4 Apr 2005 20:09:18 -0000 @@ -2,7 +2,7 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/sys/syscall.h,v 1.28 2005/03/21 16:47:49 joerg Exp $ + * $DragonFly$ * created from DragonFly: src/sys/kern/syscalls.master,v 1.21 2005/03/21 16:45:08 joerg Exp */ @@ -312,4 +312,5 @@ #define SYS_jail_attach 471 #define SYS_sys_set_tls_area 472 #define SYS_sys_get_tls_area 473 -#define SYS_MAXSYSCALL 474 +#define SYS_closefrom 474 +#define SYS_MAXSYSCALL 475 Index: sys/syscall.mk =================================================================== RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/sys/syscall.mk,v retrieving revision 1.28 diff -u -r1.28 syscall.mk --- sys/syscall.mk 21 Mar 2005 16:47:49 -0000 1.28 +++ sys/syscall.mk 4 Apr 2005 20:09:19 -0000 @@ -1,6 +1,6 @@ # DragonFly system call names. # DO NOT EDIT-- this file is automatically generated. -# $DragonFly: src/sys/sys/syscall.mk,v 1.28 2005/03/21 16:47:49 joerg Exp $ +# $DragonFly$ # created from DragonFly: src/sys/kern/syscalls.master,v 1.21 2005/03/21 16:45:08 joerg Exp MIASM = \ syscall.o \ @@ -261,4 +261,5 @@ umtx_wakeup.o \ jail_attach.o \ sys_set_tls_area.o \ - sys_get_tls_area.o + sys_get_tls_area.o \ + closefrom.o Index: sys/sysproto.h =================================================================== RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/sys/sysproto.h,v retrieving revision 1.28 diff -u -r1.28 sysproto.h --- sys/sysproto.h 21 Mar 2005 16:47:49 -0000 1.28 +++ sys/sysproto.h 4 Apr 2005 20:09:19 -0000 @@ -2,7 +2,7 @@ * System call prototypes. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/sys/sysproto.h,v 1.28 2005/03/21 16:47:49 joerg Exp $ + * $DragonFly$ * created from DragonFly: src/sys/kern/syscalls.master,v 1.21 2005/03/21 16:45:08 joerg Exp */ @@ -2194,6 +2194,13 @@ struct tls_info * info; char info_[PAD_(struct tls_info *)]; size_t infosize; char infosize_[PAD_(size_t)]; }; +struct closefrom_args { +#ifdef _KERNEL + struct sysmsg sysmsg; +#endif + union usrmsg usrmsg; + int fd; char fd_[PAD_(int)]; +}; #ifdef _KERNEL @@ -2454,6 +2461,7 @@ int jail_attach (struct jail_attach_args *); int sys_set_tls_area (struct sys_set_tls_area_args *); int sys_get_tls_area (struct sys_get_tls_area_args *); +int closefrom (struct closefrom_args *); #endif /* _KERNEL */ Index: sys/sysunion.h =================================================================== RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/sys/sysunion.h,v retrieving revision 1.25 diff -u -r1.25 sysunion.h --- sys/sysunion.h 21 Mar 2005 16:47:49 -0000 1.25 +++ sys/sysunion.h 4 Apr 2005 20:09:19 -0000 @@ -2,7 +2,7 @@ * Union of syscall args for messaging. * * DO NOT EDIT-- this file is automatically generated. - * $DragonFly: src/sys/sys/sysunion.h,v 1.25 2005/03/21 16:47:49 joerg Exp $ + * $DragonFly$ * created from DragonFly: src/sys/kern/syscalls.master,v 1.21 2005/03/21 16:45:08 joerg Exp */ @@ -346,4 +346,5 @@ struct jail_attach_args jail_attach; struct sys_set_tls_area_args sys_set_tls_area; struct sys_get_tls_area_args sys_get_tls_area; + struct closefrom_args closefrom; }; --J/dobhs11T7y2rNN--