Status: FIONBIO/FIOASYNC is in http://www.freebsd.org/cgi/query-pr.cgi?pr=138526 /dev/full already rejected in upstream (kern/68961) --- a/sys/dev/null/null.c +++ b/sys/dev/null/null.c @@ -45,9 +45,11 @@ /* For use with destroy_dev(9). */ static struct cdev *null_dev; +static struct cdev *full_dev; static struct cdev *zero_dev; static d_write_t null_write; +static d_write_t full_write; static d_ioctl_t null_ioctl; static d_read_t zero_read; @@ -59,6 +61,14 @@ .d_name = "null", }; +static struct cdevsw full_cdevsw = { + .d_version = D_VERSION, + .d_read = (d_read_t *)nullop, + .d_write = full_write, + .d_ioctl = null_ioctl, + .d_name = "full", +}; + static struct cdevsw zero_cdevsw = { .d_version = D_VERSION, .d_read = zero_read, @@ -78,11 +88,25 @@ /* ARGSUSED */ static int +full_write(struct cdev *dev __unused, struct uio *uio, int flags __unused) +{ + uio->uio_resid = 0; + + return (ENOSPC); +} + +#include +/* ARGSUSED */ +static int null_ioctl(struct cdev *dev __unused, u_long cmd, caddr_t data __unused, int flags __unused, struct thread *td) { int error; + if (cmd == FIONBIO) + return 0; + if ((cmd == FIOASYNC) && ((*(int *)data) == 0)) + return 0; if (cmd != DIOCSKERNELDUMP) return (ENOIOCTL); error = priv_check(td, PRIV_SETDUMPER); @@ -122,12 +146,15 @@ printf("null: \n"); null_dev = make_dev_credf(MAKEDEV_ETERNAL_KLD, &null_cdevsw, 0, NULL, UID_ROOT, GID_WHEEL, 0666, "null"); + full_dev = make_dev_credf(MAKEDEV_ETERNAL_KLD, &full_cdevsw, 0, + NULL, UID_ROOT, GID_WHEEL, 0666, "full"); zero_dev = make_dev_credf(MAKEDEV_ETERNAL_KLD, &zero_cdevsw, 0, NULL, UID_ROOT, GID_WHEEL, 0666, "zero"); break; case MOD_UNLOAD: destroy_dev(null_dev); + destroy_dev(full_dev); destroy_dev(zero_dev); break;