Skip to content

Commit

Permalink
add getentropy function
Browse files Browse the repository at this point in the history
based loosely on patch by Hauke Mehrtens; converted to wrap the public
API of the underlying getrandom function rather than direct syscalls,
so that if/when a fallback implementation of getrandom is added it
will automatically get picked up by getentropy too.
  • Loading branch information
richfelker committed Feb 23, 2018
1 parent e206582 commit 82f1768
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 0 deletions.
1 change: 1 addition & 0 deletions include/unistd.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ int acct(const char *);
long syscall(long, ...);
int execvpe(const char *, char *const [], char *const []);
int issetugid(void);
int getentropy(void *, size_t);
#endif

#ifdef _GNU_SOURCE
Expand Down
31 changes: 31 additions & 0 deletions src/misc/getentropy.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#include <sys/random.h>
#include <pthread.h>
#include <errno.h>

int getentropy(void *buffer, size_t len)
{
int cs, ret;
char *pos = buffer;

if (len > 256) {
errno = EIO;
return -1;
}

pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);

while (len) {
ret = getrandom(pos, len, 0);
if (ret < 0) {
if (errno == EINTR) continue;
else break;
}
pos += ret;
len -= ret;
ret = 0;
}

pthread_setcancelstate(cs, 0);

return ret;
}

0 comments on commit 82f1768

Please sign in to comment.