X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/9bccf70c0258c7cac2dcb80011b2a964d884c552..13fec9890cf095cc781fdf7b8917cb03bf32dd4c:/bsd/dev/random/randomdev.c diff --git a/bsd/dev/random/randomdev.c b/bsd/dev/random/randomdev.c index f7830f40e..747656750 100644 --- a/bsd/dev/random/randomdev.c +++ b/bsd/dev/random/randomdev.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2000-2002 Apple Computer, Inc. All rights reserved. + * Copyright (c) 1999-2004 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -31,12 +31,15 @@ #include #include #include +#include #include #include #define RANDOM_MAJOR -1 /* let the kernel pick the device number */ +d_ioctl_t random_ioctl; + /* * A struct describing which functions will get invoked for certain * actions. @@ -47,9 +50,9 @@ static struct cdevsw random_cdevsw = random_close, /* close */ random_read, /* read */ random_write, /* write */ - eno_ioctl, /* ioctl */ - nulldev, /* stop */ - nulldev, /* reset */ + random_ioctl, /* ioctl */ + (stop_fcn_t *)nulldev, /* stop */ + (reset_fcn_t *)nulldev, /* reset */ NULL, /* tty's */ eno_select, /* select */ eno_mmap, /* mmap */ @@ -67,10 +70,11 @@ static mutex_t *gYarrowMutex = 0; #define RESEED_TICKS 50 /* how long a reseed operation can take */ + /* *Initialize ONLY the Yarrow generator. */ -void PreliminarySetup () +void PreliminarySetup( void ) { prng_error_status perr; struct timeval tt; @@ -118,7 +122,7 @@ void PreliminarySetup () * and to register ourselves with devfs */ void -random_init() +random_init( void ) { int ret; @@ -139,14 +143,29 @@ random_init() } devfs_make_node(makedev (ret, 0), DEVFS_CHAR, - UID_ROOT, GID_WHEEL, 0644, "random", 0); + UID_ROOT, GID_WHEEL, 0666, "random", 0); /* * also make urandom * (which is exactly the same thing in our context) */ devfs_make_node(makedev (ret, 1), DEVFS_CHAR, - UID_ROOT, GID_WHEEL, 0644, "urandom", 0); + UID_ROOT, GID_WHEEL, 0666, "urandom", 0); +} + +int +random_ioctl( __unused dev_t dev, u_long cmd, __unused caddr_t data, + __unused int flag, __unused struct proc *p ) +{ + switch (cmd) { + case FIONBIO: + case FIOASYNC: + break; + default: + return ENODEV; + } + + return (0); } /* @@ -155,7 +174,7 @@ random_init() */ int -random_open(dev_t dev, int flags, int devtype, struct proc *p) +random_open(__unused dev_t dev, int flags, __unused int devtype, __unused struct proc *p) { if (gRandomError != 0) { /* forget it, yarrow didn't come up */ @@ -169,8 +188,10 @@ random_open(dev_t dev, int flags, int devtype, struct proc *p) if (flags & FWRITE) { if (securelevel >= 2) return (EPERM); - if ((securelevel >= 1) && suser(p->p_ucred, &p->p_acflag)) +#ifndef __APPLE__ + if ((securelevel >= 1) && proc_suser(p)) return (EPERM); +#endif /* !__APPLE__ */ } return (0); @@ -182,7 +203,7 @@ random_open(dev_t dev, int flags, int devtype, struct proc *p) */ int -random_close(dev_t dev, int flags, int mode, struct proc *p) +random_close(__unused dev_t dev, __unused int flags, __unused int mode, __unused struct proc *p) { return (0); } @@ -193,7 +214,7 @@ random_close(dev_t dev, int flags, int mode, struct proc *p) * prng. */ int -random_write (dev_t dev, struct uio *uio, int ioflag) +random_write (__unused dev_t dev, struct uio *uio, __unused int ioflag) { int retCode = 0; char rdBuffer[256]; @@ -207,9 +228,10 @@ random_write (dev_t dev, struct uio *uio, int ioflag) /* Security server is sending us entropy */ - while (uio->uio_resid > 0 && retCode == 0) { + while (uio_resid(uio) > 0 && retCode == 0) { /* get the user's data */ - int bytesToInput = min(uio->uio_resid, sizeof (rdBuffer)); + // LP64todo - fix this! uio_resid may be 64-bit value + int bytesToInput = min(uio_resid(uio), sizeof (rdBuffer)); retCode = uiomove(rdBuffer, bytesToInput, uio); if (retCode != 0) goto /*ugh*/ error_exit; @@ -240,7 +262,7 @@ error_exit: /* do this to make sure the mutex unlocks. */ * return data to the caller. Results unpredictable. */ int -random_read(dev_t dev, struct uio *uio, int ioflag) +random_read(__unused dev_t dev, struct uio *uio, __unused int ioflag) { int retCode = 0; char wrBuffer[512]; @@ -251,9 +273,10 @@ random_read(dev_t dev, struct uio *uio, int ioflag) /* lock down the mutex */ mutex_lock(gYarrowMutex); - while (uio->uio_resid > 0 && retCode == 0) { + while (uio_resid(uio) > 0 && retCode == 0) { /* get the user's data */ - int bytesToRead = min(uio->uio_resid, sizeof (wrBuffer)); + // LP64todo - fix this! uio_resid may be 64-bit value + int bytesToRead = min(uio_resid(uio), sizeof (wrBuffer)); /* get the data from Yarrow */ if (prngOutput(gPrngRef, (BYTE *) wrBuffer, sizeof (wrBuffer)) != 0) { @@ -294,7 +317,7 @@ read_random(void* buffer, u_int numbytes) * Return an unsigned long pseudo-random number. */ u_long -RandomULong() +RandomULong( void ) { u_long buf; read_random(&buf, sizeof (buf));