diff --git a/sys/dev/null/null.c b/sys/dev/null/null.c index 7ffc618e63ee..99ee04060d23 100644 --- a/sys/dev/null/null.c +++ b/sys/dev/null/null.c @@ -53,6 +53,13 @@ static d_write_t null_write; static d_ioctl_t null_ioctl; static d_ioctl_t zero_ioctl; static d_read_t zero_read; +static d_kqfilter_t zero_kqfilter; +static f_event zero_kread; + +static const struct filterops zero_filterops_read = { + .f_isfd = 1, + .f_event = zero_kqread, +}; static struct cdevsw full_cdevsw = { .d_version = D_VERSION, @@ -75,6 +82,7 @@ static struct cdevsw zero_cdevsw = { .d_read = zero_read, .d_write = null_write, .d_ioctl = zero_ioctl, + .d_kqfilter = zero_kqfilter, .d_name = "zero", .d_flags = D_MMAP_ANON, }; @@ -197,5 +205,27 @@ null_modevent(module_t mod __unused, int type, void *data __unused) return (0); } +static int +zero_kqread(struct knote *kn, long hint) +{ + return 1; +} + +static int +zero_kqfilter(struct cdev *dev, struct knote *kn) +{ + if (kn->kn_filter != EVFILT_READ) + return(EOPNOTSUPP); + + struct knlist lst; + knlist_init(&lst, NULL, NULL, NULL, NULL); + kn->kn_fop = &zero_filterops_read; + knlist_add(&lst, kn, 0); + KNOTE_LOCKED(&lst, 0); + knlist_remove(&lst, kn, 0); + + return (0); +} + DEV_MODULE(null, null_modevent, NULL); MODULE_VERSION(null, 1);