svn commit: r280955 - in head/sys: modules/notrandom dev/notrandom

Andrew Turner andrew at fubar.geek.nz
Wed Apr 1 12:31:22 UTC 2015


On Wed, 1 Apr 2015 13:36:28 +0200
Mateusz Guzik <mjg at freebsd.org> wrote:

> Author: mjg
> Date: Wed Apr  1 13:37:00 2015
> New Revision: 280955
> URL: https://svnweb.freebsd.org/changeset/base/280955
> 
> Log:
>   Add /dev/notrandom
> 
>   notrandom provides fast and reliable not random numbers.
> 
>   This was added in an effort to increase feature-compatiblity with
>   Solaris 10.
> 
>   See http://www.brendangregg.com/Specials/notrandom.c for Solaris
>   implementation.
> 
>   Reviewed-by: Bruce Schneier (ok, not really)
>   MFC after:	1 week

I've been thinking about adding something similar for some time. I do
have one question, should it accept data for the notrandom number
generator? It would only need to accept up until the first notrandom
number. I was thinking something like the following patch (untested).

Andrew

diff --git a/sys/dev/notrandom/notrandom.c
b/sys/dev/notrandom/notrandom.c index c09eaf3..9e5f523 100644
--- a/sys/dev/notrandom/notrandom.c
+++ b/sys/dev/notrandom/notrandom.c
@@ -41,10 +41,12 @@ static struct cdev *notrandom_dev;
 
 static d_ioctl_t notrandom_ioctl;
 static d_read_t notrandom_read;
+static d_read_t notrandom_write;
 
 static struct cdevsw notrandom_cdevsw = {
        .d_version =    D_VERSION,
        .d_read =       notrandom_read,
+       .d_write =      notrandom_write,
        .d_ioctl =      notrandom_ioctl,
        .d_name =       "notrandom",
        .d_flags =      D_MMAP_ANON,
@@ -91,6 +93,30 @@ notrandom_read(struct cdev *dev __unused, struct uio
*uio, int flags __unused) 
 /* ARGSUSED */
 static int
+notrandom_write(struct cdev *dev __unused, struct uio *uio, int flags
__unused)
+{
+       size_t pos;
+       ssize_t len;
+       int error = 0;
+       char buf;
+
+       pos = 0;
+       while (uio->uio_resid > 0) {
+               len = uio->uio_resid;
+               error = uiomove(&buf, 1, uio);
+               if (error != 0)
+                       break;
+               if (buf != 7)
+                       return (EIO);
+               notrandom_buf[pos++] = buf;
+               pos %= sizeof(notrandom_buf);
+       }
+
+       return (error);
+}
+
+/* ARGSUSED */
+static int
 notrandom_modevent(module_t mod __unused, int type, void *data
__unused) {
        int error = 0;


More information about the svn-src-head mailing list