static void * devpoll_init(struct event_base *base) { int dpfd, nfiles = NEVENT; struct rlimit rl; struct devpollop *devpollop; if (!(devpollop = mm_calloc(1, sizeof(struct devpollop)))) return (NULL); if (getrlimit(RLIMIT_NOFILE, &rl) == 0 && rl.rlim_cur != RLIM_INFINITY) nfiles = rl.rlim_cur; /* Initialize the kernel queue */ if ((dpfd = evutil_open_closeonexec_("/dev/poll", O_RDWR, 0)) == -1) { event_warn("open: /dev/poll"); mm_free(devpollop); return (NULL); } devpollop->dpfd = dpfd; /* Initialize fields */ /* FIXME: allocating 'nfiles' worth of space here can be * expensive and unnecessary. See how epoll.c does it instead. */ devpollop->events = mm_calloc(nfiles, sizeof(struct pollfd)); if (devpollop->events == NULL) { mm_free(devpollop); close(dpfd); return (NULL); } devpollop->nevents = nfiles; devpollop->changes = mm_calloc(nfiles, sizeof(struct pollfd)); if (devpollop->changes == NULL) { mm_free(devpollop->events); mm_free(devpollop); close(dpfd); return (NULL); } evsig_init_(base); return (devpollop); }
static int arc4_seed_urandom_helper_(const char *fname) { unsigned char buf[ADD_ENTROPY]; int fd; size_t n; fd = evutil_open_closeonexec_(fname, O_RDONLY, 0); if (fd<0) return -1; n = read_all(fd, buf, sizeof(buf)); close(fd); if (n != sizeof(buf)) return -1; arc4_addrandom(buf, sizeof(buf)); evutil_memclear_(buf, sizeof(buf)); return 0; }
static int arc4_seed_proc_sys_kernel_random_uuid(void) { /* Occasionally, somebody will make /proc/sys accessible in a chroot, * but not /dev/urandom. Let's try /proc/sys/kernel/random/uuid. * Its format is stupid, so we need to decode it from hex. */ int fd; char buf[128]; unsigned char entropy[64]; int bytes, n, i, nybbles; for (bytes = 0; bytes<ADD_ENTROPY; ) { fd = evutil_open_closeonexec_("/proc/sys/kernel/random/uuid", O_RDONLY, 0); if (fd < 0) return -1; n = read(fd, buf, sizeof(buf)); close(fd); if (n<=0) return -1; memset(entropy, 0, sizeof(entropy)); for (i=nybbles=0; i<n; ++i) { if (EVUTIL_ISXDIGIT_(buf[i])) { int nyb = evutil_hex_char_to_int_(buf[i]); if (nybbles & 1) { entropy[nybbles/2] |= nyb; } else { entropy[nybbles/2] |= nyb<<4; } ++nybbles; } } if (nybbles < 2) return -1; arc4_addrandom(entropy, nybbles/2); bytes += nybbles/2; } evutil_memclear_(entropy, sizeof(entropy)); evutil_memclear_(buf, sizeof(buf)); arc4_seeded_ok = 1; return 0; }