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)
{