1 1.8 riastrad /* $NetBSD: devnull.c,v 1.8 2018/09/03 16:29:37 riastradh Exp $ */ 2 1.1 pooka 3 1.1 pooka /* 4 1.1 pooka * Copyright (c) 2009 Antti Kantee. All Rights Reserved. 5 1.1 pooka * 6 1.1 pooka * Redistribution and use in source and binary forms, with or without 7 1.1 pooka * modification, are permitted provided that the following conditions 8 1.1 pooka * are met: 9 1.1 pooka * 1. Redistributions of source code must retain the above copyright 10 1.1 pooka * notice, this list of conditions and the following disclaimer. 11 1.1 pooka * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 pooka * notice, this list of conditions and the following disclaimer in the 13 1.1 pooka * documentation and/or other materials provided with the distribution. 14 1.1 pooka * 15 1.1 pooka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 16 1.1 pooka * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 1.1 pooka * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 1.1 pooka * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 1.1 pooka * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 1.1 pooka * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 21 1.1 pooka * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 1.1 pooka * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 1.1 pooka * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 1.1 pooka * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 1.1 pooka * SUCH DAMAGE. 26 1.1 pooka */ 27 1.1 pooka 28 1.1 pooka /* 29 1.1 pooka * /dev/null, the infamous bytesink. 30 1.1 pooka * 31 1.1 pooka * I can't imagine it being very different in the rump kernel than in 32 1.1 pooka * the host kernel. But nonetheless it serves as a simple example. 33 1.1 pooka */ 34 1.1 pooka 35 1.1 pooka #include <sys/cdefs.h> 36 1.8 riastrad __KERNEL_RCSID(0, "$NetBSD: devnull.c,v 1.8 2018/09/03 16:29:37 riastradh Exp $"); 37 1.1 pooka 38 1.1 pooka #include <sys/param.h> 39 1.1 pooka #include <sys/conf.h> 40 1.1 pooka #include <sys/device.h> 41 1.1 pooka #include <sys/stat.h> 42 1.1 pooka 43 1.7 pooka #include <rump-sys/vfs.h> 44 1.1 pooka 45 1.1 pooka static dev_type_open(rump_devnullopen); 46 1.1 pooka static dev_type_read(rump_devnullrw); 47 1.1 pooka 48 1.1 pooka static struct cdevsw null_cdevsw = { 49 1.5 dholland .d_open = rump_devnullopen, 50 1.5 dholland .d_close = nullclose, 51 1.5 dholland .d_read = rump_devnullrw, 52 1.5 dholland .d_write = rump_devnullrw, 53 1.5 dholland .d_ioctl = noioctl, 54 1.5 dholland .d_stop = nostop, 55 1.5 dholland .d_tty = notty, 56 1.5 dholland .d_poll = nopoll, 57 1.5 dholland .d_mmap = nommap, 58 1.5 dholland .d_kqfilter = nokqfilter, 59 1.6 dholland .d_discard = nodiscard, 60 1.5 dholland .d_flag = D_OTHER | D_MPSAFE 61 1.1 pooka }; 62 1.1 pooka 63 1.1 pooka int 64 1.1 pooka rump_devnull_init() 65 1.1 pooka { 66 1.2 pooka devmajor_t null_bmaj, null_cmaj; 67 1.1 pooka int error; 68 1.1 pooka 69 1.1 pooka null_bmaj = null_cmaj = NODEVMAJOR; 70 1.1 pooka error = devsw_attach("null", NULL, &null_bmaj, &null_cdevsw,&null_cmaj); 71 1.2 pooka KASSERT(error || null_cmaj == 2); 72 1.1 pooka 73 1.4 pooka error = rump_vfs_makeonedevnode(S_IFCHR, 74 1.4 pooka "/dev/null", null_cmaj, DEV_NULL); 75 1.4 pooka if (error) 76 1.4 pooka return error; 77 1.4 pooka return rump_vfs_makeonedevnode(S_IFCHR, 78 1.4 pooka "/dev/zero", null_cmaj, DEV_ZERO); 79 1.1 pooka } 80 1.1 pooka 81 1.1 pooka static int 82 1.1 pooka rump_devnullopen(dev_t dev, int flag, int mode, struct lwp *l) 83 1.1 pooka { 84 1.1 pooka 85 1.3 pooka if (minor(dev) == DEV_ZERO || minor(dev) == DEV_NULL) 86 1.3 pooka return 0; 87 1.3 pooka return ENXIO; 88 1.1 pooka } 89 1.1 pooka 90 1.1 pooka static int 91 1.1 pooka rump_devnullrw(dev_t dev, struct uio *uio, int flags) 92 1.1 pooka { 93 1.3 pooka char zeros[512]; 94 1.3 pooka int error; 95 1.3 pooka 96 1.3 pooka switch (minor(dev)) { 97 1.3 pooka case DEV_NULL: 98 1.3 pooka if (uio->uio_rw == UIO_WRITE) 99 1.3 pooka uio->uio_resid = 0; 100 1.3 pooka break; 101 1.3 pooka case DEV_ZERO: 102 1.3 pooka if (uio->uio_rw == UIO_WRITE) { 103 1.3 pooka uio->uio_resid = 0; 104 1.3 pooka break; 105 1.3 pooka } 106 1.3 pooka memset(zeros, 0, sizeof(zeros)); 107 1.3 pooka while (uio->uio_resid > 0) { 108 1.3 pooka error = uiomove(zeros, 109 1.8 riastrad uimin(sizeof(zeros), uio->uio_resid), uio); 110 1.3 pooka if (error) 111 1.3 pooka return error; 112 1.3 pooka } 113 1.3 pooka break; 114 1.3 pooka default: 115 1.3 pooka return ENXIO; /* how? */ 116 1.3 pooka } 117 1.1 pooka 118 1.1 pooka return 0; 119 1.1 pooka } 120