Module Name: src Committed By: christos Date: Fri Dec 1 19:05:49 UTC 2017
Modified Files: src/sys/kern: subr_cprng.c Log Message: Allow attaching for write, but return no events. To generate a diff of this commit: cvs rdiff -u -r1.28 -r1.29 src/sys/kern/subr_cprng.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_cprng.c diff -u src/sys/kern/subr_cprng.c:1.28 src/sys/kern/subr_cprng.c:1.29 --- src/sys/kern/subr_cprng.c:1.28 Wed Oct 25 04:12:39 2017 +++ src/sys/kern/subr_cprng.c Fri Dec 1 14:05:49 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_cprng.c,v 1.28 2017/10/25 08:12:39 maya Exp $ */ +/* $NetBSD: subr_cprng.c,v 1.29 2017/12/01 19:05:49 christos Exp $ */ /*- * Copyright (c) 2011-2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_cprng.c,v 1.28 2017/10/25 08:12:39 maya Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_cprng.c,v 1.29 2017/12/01 19:05:49 christos Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -253,35 +253,6 @@ out: mutex_exit(&cprng->cs_lock); return result; } -static void filt_cprng_detach(struct knote *); -static int filt_cprng_event(struct knote *, long); - -static const struct filterops cprng_filtops = { - .f_isfd = 1, - .f_attach = NULL, - .f_detach = filt_cprng_detach, - .f_event = filt_cprng_event, -}; - -int -cprng_strong_kqfilter(struct cprng_strong *cprng, struct knote *kn) -{ - - switch (kn->kn_filter) { - case EVFILT_READ: - kn->kn_fop = &cprng_filtops; - kn->kn_hook = cprng; - mutex_enter(&cprng->cs_lock); - SLIST_INSERT_HEAD(&cprng->cs_selq.sel_klist, kn, kn_selnext); - mutex_exit(&cprng->cs_lock); - return 0; - - case EVFILT_WRITE: - default: - return EINVAL; - } -} - static void filt_cprng_detach(struct knote *kn) { @@ -293,7 +264,7 @@ filt_cprng_detach(struct knote *kn) } static int -filt_cprng_event(struct knote *kn, long hint) +filt_cprng_read_event(struct knote *kn, long hint) { struct cprng_strong *const cprng = kn->kn_hook; int ret; @@ -316,6 +287,62 @@ filt_cprng_event(struct knote *kn, long return ret; } +static int +filt_cprng_write_event(struct knote *kn, long hint) +{ + struct cprng_strong *const cprng = kn->kn_hook; + + if (hint == NOTE_SUBMIT) + KASSERT(mutex_owned(&cprng->cs_lock)); + else + mutex_enter(&cprng->cs_lock); + + kn->kn_data = 0; + + if (hint == NOTE_SUBMIT) + KASSERT(mutex_owned(&cprng->cs_lock)); + else + mutex_exit(&cprng->cs_lock); + + return 0; +} + +static const struct filterops cprng_read_filtops = { + .f_isfd = 1, + .f_attach = NULL, + .f_detach = filt_cprng_detach, + .f_event = filt_cprng_read_event, +}; + +static const struct filterops cprng_write_filtops = { + .f_isfd = 1, + .f_attach = NULL, + .f_detach = filt_cprng_detach, + .f_event = filt_cprng_write_event, +}; + +int +cprng_strong_kqfilter(struct cprng_strong *cprng, struct knote *kn) +{ + + switch (kn->kn_filter) { + case EVFILT_READ: + kn->kn_fop = &cprng_read_filtops; + break; + case EVFILT_WRITE: + kn->kn_fop = &cprng_write_filtops; + break; + default: + return EINVAL; + } + + kn->kn_hook = cprng; + mutex_enter(&cprng->cs_lock); + SLIST_INSERT_HEAD(&cprng->cs_selq.sel_klist, kn, kn_selnext); + mutex_exit(&cprng->cs_lock); + return 0; +} + int cprng_strong_poll(struct cprng_strong *cprng, int events) {