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

Julian Elischer julian at freebsd.org
Wed Apr 1 15:07:35 UTC 2015


On 4/1/15 8:31 PM, Andrew Turner wrote:
> 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.
the not-random  write- side code should have a sysctl that decides 
whether it rejects data that is too random.
>>
>>    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