Skip to content

Commit

Permalink
reintroduce /dev/urandom arc4random for Haiku
Browse files Browse the repository at this point in the history
Their arc4random implementation hasn't made it to a stable release.
  • Loading branch information
guijan committed Jan 30, 2024
1 parent 83dc010 commit 4d04a60
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 2 deletions.
2 changes: 0 additions & 2 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,4 @@ Changes in libobsd master:
- Add C++ support
- Add timespeccmp(), timespecsub(), and other timeval/timespec macros from
sys/time.h
- Delete old /dev/urandom backend for arc4random now that HaikuOS doesn't need
it anymore

59 changes: 59 additions & 0 deletions src/stdlib/arc4random_buf_dev_urandom.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* Copyright (c) 2022 Guilherme Janczak <[email protected]>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

/* Haiku doesn't have a proper programming API for generating random numbers, so
* it's impossible to provide the semantics of arc4random_buf(). We'll
* approximate them with /dev/urandom.
*/
void
arc4random_buf(void *_buf, size_t nbytes)
{
int errnum;
int fd;
unsigned char *buf = _buf;
ssize_t nr;
size_t unr;
errnum = errno;

while ((fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC)) == -1) {
if (errno == EINTR)
continue;
abort();
}

while (nbytes > 0) {
nr = read(fd, buf, nbytes);
if (nr == -1) {
if (errno == EINTR)
continue;
abort();
} else if (nr == 0) {
abort(); /* /dev/urandom should never EOF. */
}

unr = nr;
buf += unr;
nbytes -= unr;
}

close(fd);
errno = errnum;
}
2 changes: 2 additions & 0 deletions src/stdlib/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ if stdlib['arc4random_buf'][2]
dependencies: bcrypt_dep)
deps += bcrypt_dep
impl = 'arc4random_buf_BCryptGenRandom.c'
elif host_machine.system() == 'haiku'
impl = 'arc4random_buf_dev_urandom.c'
elif host_machine.system() == 'emscripten'
impl = 'arc4random_buf_emscripten.c'
elif cc.has_function('getrandom', args: args,
Expand Down

0 comments on commit 4d04a60

Please sign in to comment.