Date: Tue, 1 Mar 2005 18:15:55 GMT From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 72266 for review Message-ID: <200503011815.j21IFttm079593@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=72266 Change 72266 by jhb@jhb_slimer on 2005/03/01 18:15:27 IFC @72263. Affected files ... .. //depot/projects/smpng/sys/compat/freebsd32/freebsd32_misc.c#16 integrate .. //depot/projects/smpng/sys/compat/linux/linux_util.c#14 integrate .. //depot/projects/smpng/sys/compat/linux/linux_util.h#12 integrate .. //depot/projects/smpng/sys/compat/ndis/kern_windrv.c#2 integrate .. //depot/projects/smpng/sys/kern/init_sysent.c#54 integrate .. //depot/projects/smpng/sys/kern/kern_event.c#37 integrate .. //depot/projects/smpng/sys/kern/syscalls.c#54 integrate .. //depot/projects/smpng/sys/kern/syscalls.master#55 integrate .. //depot/projects/smpng/sys/sys/event.h#14 integrate .. //depot/projects/smpng/sys/sys/syscall.h#53 integrate .. //depot/projects/smpng/sys/sys/syscall.mk#53 integrate .. //depot/projects/smpng/sys/sys/syscallsubr.h#19 integrate .. //depot/projects/smpng/sys/sys/sysproto.h#55 integrate Differences ... ==== //depot/projects/smpng/sys/compat/freebsd32/freebsd32_misc.c#16 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/freebsd32/freebsd32_misc.c,v 1.29 2005/03/01 13:50:57 ps Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/freebsd32/freebsd32_misc.c,v 1.30 2005/03/01 17:45:55 ps Exp $"); #include "opt_compat.h" @@ -556,44 +556,34 @@ int freebsd32_kevent(struct thread *td, struct freebsd32_kevent_args *uap) { - int error; - caddr_t sg; struct timespec32 ts32; - struct timespec ts; + struct timespec ts, *tsp; + struct kevent *ks; struct kevent32 ks32; - struct kevent *ks; - struct kevent_args a; - int i; - - sg = stackgap_init(); + struct kevent *changes, *events; + int error, i; - a.fd = uap->fd; - a.changelist = (struct kevent *)uap->changelist; - a.nchanges = uap->nchanges; - a.eventlist = (struct kevent *)uap->eventlist; - a.nevents = uap->nevents; - a.timeout = NULL; if (uap->timeout) { - a.timeout = stackgap_alloc(&sg, sizeof(struct timespec)); error = copyin(uap->timeout, &ts32, sizeof(ts32)); if (error) return (error); CP(ts32, ts, tv_sec); CP(ts32, ts, tv_nsec); - error = copyout(&ts, (void *)(uintptr_t)a.timeout, sizeof(ts)); - if (error) - return (error); - } - if (uap->changelist) { - a.changelist = (struct kevent *)stackgap_alloc(&sg, - uap->nchanges * sizeof(struct kevent)); + tsp = &ts; + } else + tsp = NULL; + if (uap->changelist && uap->nchanges > 0) { + changes = malloc(sizeof(struct kevent) * uap->nchanges, M_TEMP, + M_WAITOK); for (i = 0; i < uap->nchanges; i++) { error = copyin(&uap->changelist[i], &ks32, sizeof(ks32)); - if (error) + if (error) { + free(changes, M_TEMP); return (error); - ks = (struct kevent *)(uintptr_t)&a.changelist[i]; + } + ks = &changes[i]; CP(ks32, *ks, ident); CP(ks32, *ks, filter); CP(ks32, *ks, flags); @@ -601,15 +591,19 @@ CP(ks32, *ks, data); PTRIN_CP(ks32, *ks, udata); } - } - if (uap->eventlist) { - a.eventlist = stackgap_alloc(&sg, - uap->nevents * sizeof(struct kevent)); - } - error = kevent(td, &a); - if (uap->eventlist && error > 0) { - for (i = 0; i < error; i++) { - ks = &a.eventlist[i]; + } else + changes = NULL; + if (uap->eventlist && uap->nevents > 0) + events = malloc(sizeof(struct kevent) * uap->nevents, M_TEMP, + M_WAITOK); + else + events = NULL; + error = kern_kevent(td, uap->fd, changes, uap->nchanges, UIO_SYSSPACE, + events, uap->nevents, UIO_SYSSPACE, tsp); + free(changes, M_TEMP); + if (uap->eventlist && events && td->td_retval[0] > 0) { + for (i = 0; i < td->td_retval[0]; i++) { + ks = &events[i]; CP(*ks, ks32, ident); CP(*ks, ks32, filter); CP(*ks, ks32, flags); @@ -619,10 +613,12 @@ error = copyout(&ks32, &uap->eventlist[i], sizeof(ks32)); if (error) - return (error); + break; } } - return error; + if (events) + free(events, M_TEMP); + return (error); } int ==== //depot/projects/smpng/sys/compat/linux/linux_util.c#14 (text+ko) ==== @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/linux/linux_util.c,v 1.28 2005/02/07 18:46:05 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/linux/linux_util.c,v 1.29 2005/03/01 17:57:45 jhb Exp $"); #include <sys/param.h> #include <sys/lock.h> @@ -57,39 +57,6 @@ * be in exists. */ int -linux_emul_find(td, sgp, path, pbuf, cflag) - struct thread *td; - caddr_t *sgp; /* Pointer to stackgap memory */ - char *path; - char **pbuf; - int cflag; -{ - char *newpath; - size_t sz; - int error; - - error = linux_emul_convpath(td, path, (sgp == NULL) ? UIO_SYSSPACE : - UIO_USERSPACE, &newpath, cflag); - if (newpath == NULL) - return (error); - - if (sgp == NULL) { - *pbuf = newpath; - return (error); - } - - sz = strlen(newpath); - *pbuf = stackgap_alloc(sgp, sz + 1); - if (*pbuf != NULL) - error = copyout(newpath, *pbuf, sz + 1); - else - error = ENAMETOOLONG; - free(newpath, M_TEMP); - - return (error); -} - -int linux_emul_convpath(td, path, pathseg, pbuf, cflag) struct thread *td; char *path; ==== //depot/projects/smpng/sys/compat/linux/linux_util.h#12 (text+ko) ==== @@ -28,7 +28,7 @@ * * from: svr4_util.h,v 1.5 1994/11/18 02:54:31 christos Exp * from: linux_util.h,v 1.2 1995/03/05 23:23:50 fvdl Exp - * $FreeBSD: src/sys/compat/linux/linux_util.h,v 1.24 2005/01/05 22:34:35 imp Exp $ + * $FreeBSD: src/sys/compat/linux/linux_util.h,v 1.25 2005/03/01 17:57:45 jhb Exp $ */ /* @@ -78,19 +78,6 @@ extern const char linux_emul_path[]; int linux_emul_convpath(struct thread *, char *, enum uio_seg, char **, int); -int linux_emul_find(struct thread *, caddr_t *, char *, char **, int); - -#define CHECKALT(td, sgp, path, i) \ - do { \ - int _error; \ - \ - _error = linux_emul_find(td, sgp, path, &path, i); \ - if (_error == EFAULT) \ - return (_error); \ - } while (0) - -#define CHECKALTEXIST(td, sgp, path) CHECKALT(td, sgp, path, 0) -#define CHECKALTCREAT(td, sgp, path) CHECKALT(td, sgp, path, 1) #define LCONVPATH(td, upath, pathp, i) \ do { \ ==== //depot/projects/smpng/sys/compat/ndis/kern_windrv.c#2 (text+ko) ==== @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_windrv.c,v 1.4 2005/02/24 21:49:14 wpaul Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/ndis/kern_windrv.c,v 1.5 2005/03/01 17:21:25 wpaul Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -234,7 +234,7 @@ image_optional_header opt_hdr; driver_entry entry; struct drvdb_ent *new; - struct driver_object *dobj; + struct driver_object *drv; int status; /* @@ -277,43 +277,43 @@ if (new == NULL) return (ENOMEM); - dobj = malloc(sizeof(device_object), M_DEVBUF, M_NOWAIT|M_ZERO); - if (dobj == NULL) { + drv = malloc(sizeof(driver_object), M_DEVBUF, M_NOWAIT|M_ZERO); + if (drv == NULL) { free (new, M_DEVBUF); return (ENOMEM); } /* Allocate a driver extension structure too. */ - dobj->dro_driverext = malloc(sizeof(driver_extension), + drv->dro_driverext = malloc(sizeof(driver_extension), M_DEVBUF, M_NOWAIT|M_ZERO); - if (dobj->dro_driverext == NULL) { + if (drv->dro_driverext == NULL) { free(new, M_DEVBUF); - free(dobj, M_DEVBUF); + free(drv, M_DEVBUF); return(ENOMEM); } - INIT_LIST_HEAD((&dobj->dro_driverext->dre_usrext)); + INIT_LIST_HEAD((&drv->dro_driverext->dre_usrext)); - dobj->dro_driverstart = (void *)img; - dobj->dro_driversize = len; + drv->dro_driverstart = (void *)img; + drv->dro_driversize = len; - dobj->dro_drivername.us_len = strlen(DUMMY_REGISTRY_PATH) * 2; - dobj->dro_drivername.us_maxlen = strlen(DUMMY_REGISTRY_PATH) * 2; - dobj->dro_drivername.us_buf = NULL; + drv->dro_drivername.us_len = strlen(DUMMY_REGISTRY_PATH) * 2; + drv->dro_drivername.us_maxlen = strlen(DUMMY_REGISTRY_PATH) * 2; + drv->dro_drivername.us_buf = NULL; ndis_ascii_to_unicode(DUMMY_REGISTRY_PATH, - &dobj->dro_drivername.us_buf); + &drv->dro_drivername.us_buf); - new->windrv_object = dobj; + new->windrv_object = drv; /* Now call the DriverEntry() function. */ - status = MSCALL2(entry, dobj, &dobj->dro_drivername); + status = MSCALL2(entry, drv, &drv->dro_drivername); if (status != STATUS_SUCCESS) { - free(dobj->dro_drivername.us_buf, M_DEVBUF); - free(dobj, M_DEVBUF); + free(drv->dro_drivername.us_buf, M_DEVBUF); + free(drv, M_DEVBUF); free(new, M_DEVBUF); return(ENODEV); } ==== //depot/projects/smpng/sys/kern/init_sysent.c#54 (text+ko) ==== @@ -2,8 +2,8 @@ * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/kern/init_sysent.c,v 1.185 2005/01/26 02:29:18 jeff Exp $ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.184 2005/01/24 10:49:26 jeff Exp + * $FreeBSD: src/sys/kern/init_sysent.c,v 1.186 2005/03/01 17:44:34 ps Exp $ + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.186 2005/03/01 17:43:08 ps Exp */ #include "opt_compat.h" ==== //depot/projects/smpng/sys/kern/kern_event.c#37 (text+ko) ==== @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/kern/kern_event.c,v 1.88 2005/02/22 13:11:33 rwatson Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/kern_event.c,v 1.89 2005/03/01 17:45:55 ps Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -54,6 +54,7 @@ #include <sys/stat.h> #include <sys/sysctl.h> #include <sys/sysproto.h> +#include <sys/syscallsubr.h> #include <sys/taskqueue.h> #include <sys/uio.h> @@ -80,14 +81,17 @@ TASKQUEUE_DEFINE_THREAD(kqueue); +static int kevent_copyout(struct kevent **eventlist, enum uio_seg eventseg, + struct kevent *kevp, int count); static int kqueue_aquire(struct file *fp, struct kqueue **kqp); static void kqueue_release(struct kqueue *kq, int locked); static int kqueue_expand(struct kqueue *kq, struct filterops *fops, uintptr_t ident, int waitok); static void kqueue_task(void *arg, int pending); static int kqueue_scan(struct kqueue *kq, int maxevents, - struct kevent *ulistp, const struct timespec *timeout, - struct kevent *keva, struct thread *td); + struct kevent *eventlist, enum uio_seg eventseg, + const struct timespec *timeout, struct kevent *keva, + struct thread *td); static void kqueue_wakeup(struct kqueue *kq); static struct filterops *kqueue_fo_find(int filt); static void kqueue_fo_release(int filt); @@ -531,54 +535,91 @@ int kevent(struct thread *td, struct kevent_args *uap) { + struct timespec ts, *tsp; + int error; + + if (uap->timeout != NULL) { + error = copyin(uap->timeout, &ts, sizeof(ts)); + if (error) + return (error); + tsp = &ts; + } else + tsp = NULL; + + return (kern_kevent(td, uap->fd, uap->changelist, uap->nchanges, + UIO_USERSPACE, uap->eventlist, uap->nevents, UIO_USERSPACE, tsp)); +} + +/* + * Copy 'count' items into the destination list pointd to by *eventlist. The + * eventlist and nevents values are updated to point after the copied out + * item(s) upon return. + */ +static int +kevent_copyout(struct kevent **eventlist, enum uio_seg eventseg, + struct kevent *kevp, int count) +{ + int error; + + if (eventseg == UIO_USERSPACE) + error = copyout(kevp, *eventlist, + sizeof(struct kevent) * count); + else { + bcopy(kevp, *eventlist, sizeof(struct kevent) * count); + error = 0; + } + *eventlist += count; + return (error); +} + +int +kern_kevent(struct thread *td, int fd, struct kevent *changelist, int nchanges, + enum uio_seg changeseg, struct kevent *eventlist, int nevents, + enum uio_seg eventseg, const struct timespec *timeout) +{ struct kevent keva[KQ_NEVENTS]; - struct kevent *kevp; + struct kevent *kevp, *changes; struct kqueue *kq; struct file *fp; - struct timespec ts; int i, n, nerrors, error; - if ((error = fget(td, uap->fd, &fp)) != 0) + if ((error = fget(td, fd, &fp)) != 0) return (error); if ((error = kqueue_aquire(fp, &kq)) != 0) goto done_norel; - if (uap->timeout != NULL) { - error = copyin(uap->timeout, &ts, sizeof(ts)); - if (error) - goto done; - uap->timeout = &ts; - } - nerrors = 0; - while (uap->nchanges > 0) { - n = uap->nchanges > KQ_NEVENTS ? KQ_NEVENTS : uap->nchanges; - error = copyin(uap->changelist, keva, - n * sizeof *keva); - if (error) - goto done; + while (nchanges > 0) { + if (changeseg == UIO_USERSPACE) { + n = nchanges > KQ_NEVENTS ? KQ_NEVENTS : nchanges; + error = copyin(changelist, keva, n * sizeof *keva); + if (error) + goto done; + changes = keva; + } else { + changes = changelist; + n = nchanges; + } for (i = 0; i < n; i++) { - kevp = &keva[i]; + kevp = &changes[i]; kevp->flags &= ~EV_SYSFLAGS; error = kqueue_register(kq, kevp, td, 1); if (error) { - if (uap->nevents != 0) { + if (nevents != 0) { kevp->flags = EV_ERROR; kevp->data = error; - (void) copyout(kevp, - uap->eventlist, - sizeof(*kevp)); - uap->eventlist++; - uap->nevents--; + (void) kevent_copyout(&eventlist, + eventseg, kevp, 1); + nevents--; nerrors++; } else { goto done; } } } - uap->nchanges -= n; - uap->changelist += n; + nchanges -= n; + changelist += n; } if (nerrors) { td->td_retval[0] = nerrors; @@ -586,7 +627,7 @@ goto done; } - error = kqueue_scan(kq, uap->nevents, uap->eventlist, uap->timeout, + error = kqueue_scan(kq, nevents, eventlist, eventseg, timeout, keva, td); done: kqueue_release(kq, 0); @@ -1046,8 +1087,9 @@ * We treat KN_MARKER knotes as if they are INFLUX. */ static int -kqueue_scan(struct kqueue *kq, int maxevents, struct kevent *ulistp, - const struct timespec *tsp, struct kevent *keva, struct thread *td) +kqueue_scan(struct kqueue *kq, int maxevents, struct kevent *eventlist, + enum uio_seg eventseg, const struct timespec *tsp, struct kevent *keva, + struct thread *td) { struct kevent *kevp; struct timeval atv, rtv, ttv; @@ -1200,8 +1242,8 @@ if (nkev == KQ_NEVENTS) { KQ_UNLOCK_FLUX(kq); - error = copyout(keva, ulistp, sizeof *keva * nkev); - ulistp += nkev; + error = kevent_copyout(&eventlist, eventseg, keva, + nkev); nkev = 0; kevp = keva; KQ_LOCK(kq); @@ -1218,7 +1260,7 @@ done_nl: KQ_NOTOWNED(kq); if (nkev != 0) - error = copyout(keva, ulistp, sizeof *keva * nkev); + error = kevent_copyout(&eventlist, eventseg, keva, nkev); td->td_retval[0] = maxevents - count; return (error); } ==== //depot/projects/smpng/sys/kern/syscalls.c#54 (text+ko) ==== @@ -2,8 +2,8 @@ * System call names. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/kern/syscalls.c,v 1.171 2005/01/26 02:29:18 jeff Exp $ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.184 2005/01/24 10:49:26 jeff Exp + * $FreeBSD: src/sys/kern/syscalls.c,v 1.172 2005/03/01 17:44:34 ps Exp $ + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.186 2005/03/01 17:43:08 ps Exp */ const char *syscallnames[] = { ==== //depot/projects/smpng/sys/kern/syscalls.master#55 (text+ko) ==== @@ -1,4 +1,4 @@ - $FreeBSD: src/sys/kern/syscalls.master,v 1.185 2005/01/26 02:28:43 jeff Exp $ + $FreeBSD: src/sys/kern/syscalls.master,v 1.186 2005/03/01 17:43:08 ps Exp $ ; from: @(#)syscalls.master 8.2 (Berkeley) 1/13/94 ; ; System call name/number master file. @@ -515,7 +515,7 @@ 361 MSTD { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); } 362 MSTD { int kqueue(void); } 363 MSTD { int kevent(int fd, \ - const struct kevent *changelist, int nchanges, \ + struct kevent *changelist, int nchanges, \ struct kevent *eventlist, int nevents, \ const struct timespec *timeout); } 364 UNIMPL __cap_get_proc ==== //depot/projects/smpng/sys/sys/event.h#14 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/sys/event.h,v 1.26 2004/08/15 15:36:18 jmg Exp $ + * $FreeBSD: src/sys/sys/event.h,v 1.27 2005/03/01 17:45:55 ps Exp $ */ #ifndef _SYS_EVENT_H_ @@ -221,7 +221,7 @@ __BEGIN_DECLS int kqueue(void); -int kevent(int kq, const struct kevent *changelist, int nchanges, +int kevent(int kq, struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents, const struct timespec *timeout); __END_DECLS ==== //depot/projects/smpng/sys/sys/syscall.h#53 (text+ko) ==== @@ -2,8 +2,8 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/sys/syscall.h,v 1.168 2005/01/26 02:29:18 jeff Exp $ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.184 2005/01/24 10:49:26 jeff Exp + * $FreeBSD: src/sys/sys/syscall.h,v 1.169 2005/03/01 17:44:34 ps Exp $ + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.186 2005/03/01 17:43:08 ps Exp */ #define SYS_syscall 0 ==== //depot/projects/smpng/sys/sys/syscall.mk#53 (text+ko) ==== @@ -1,7 +1,7 @@ # FreeBSD system call names. # DO NOT EDIT-- this file is automatically generated. -# $FreeBSD: src/sys/sys/syscall.mk,v 1.123 2005/01/26 02:29:18 jeff Exp $ -# created from FreeBSD: src/sys/kern/syscalls.master,v 1.184 2005/01/24 10:49:26 jeff Exp +# $FreeBSD: src/sys/sys/syscall.mk,v 1.124 2005/03/01 17:44:34 ps Exp $ +# created from FreeBSD: src/sys/kern/syscalls.master,v 1.186 2005/03/01 17:43:08 ps Exp MIASM = \ syscall.o \ exit.o \ ==== //depot/projects/smpng/sys/sys/syscallsubr.h#19 (text+ko) ==== @@ -22,7 +22,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/sys/syscallsubr.h,v 1.25 2005/02/13 17:37:20 sobomax Exp $ + * $FreeBSD: src/sys/sys/syscallsubr.h,v 1.26 2005/03/01 17:44:34 ps Exp $ */ #ifndef _SYS_SYSCALLSUBR_H_ @@ -43,6 +43,7 @@ struct rusage; struct sockaddr; struct stat; +struct kevent; int kern___getcwd(struct thread *td, u_char *buf, enum uio_seg bufseg, u_int buflen); @@ -69,6 +70,9 @@ int kern_getrusage(struct thread *td, int who, struct rusage *rup); int kern_getsockopt(struct thread *td, int s, int level, int name, void *optval, enum uio_seg valseg, socklen_t *valsize); +int kern_kevent(struct thread *td, int fd, struct kevent *changelist, + int nchanges, enum uio_seg changeseg, struct kevent *eventlist, + int nevents, enum uio_seg eventseg, const struct timespec *timeout); int kern_lchown(struct thread *td, char *path, enum uio_seg pathseg, int uid, int gid); int kern_link(struct thread *td, char *path, char *link, ==== //depot/projects/smpng/sys/sys/sysproto.h#55 (text+ko) ==== @@ -2,8 +2,8 @@ * System call prototypes. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/sys/sysproto.h,v 1.167 2005/01/26 02:29:18 jeff Exp $ - * created from FreeBSD: src/sys/kern/syscalls.master,v 1.184 2005/01/24 10:49:26 jeff Exp + * $FreeBSD: src/sys/sys/sysproto.h,v 1.168 2005/03/01 17:44:34 ps Exp $ + * created from FreeBSD: src/sys/kern/syscalls.master,v 1.186 2005/03/01 17:43:08 ps Exp */ #ifndef _SYS_SYSPROTO_H_ @@ -1009,7 +1009,7 @@ }; struct kevent_args { char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; - char changelist_l_[PADL_(const struct kevent *)]; const struct kevent * changelist; char changelist_r_[PADR_(const struct kevent *)]; + char changelist_l_[PADL_(struct kevent *)]; struct kevent * changelist; char changelist_r_[PADR_(struct kevent *)]; char nchanges_l_[PADL_(int)]; int nchanges; char nchanges_r_[PADR_(int)]; char eventlist_l_[PADL_(struct kevent *)]; struct kevent * eventlist; char eventlist_r_[PADR_(struct kevent *)]; char nevents_l_[PADL_(int)]; int nevents; char nevents_r_[PADR_(int)];
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200503011815.j21IFttm079593>