Merge commit 'lha/master' into win32-port2
* commit 'lha/master': glue for strsvisx add Allan McRae and Victor Guerra, sort Version Heimdal 1.3.2 Remove fd caching since we don't have unload (deconstructor) support
This commit is contained in:
@@ -42,9 +42,6 @@
|
||||
|
||||
#include "randi.h"
|
||||
|
||||
static int random_fd = -1;
|
||||
static HEIMDAL_MUTEX random_mutex = HEIMDAL_MUTEX_INITIALIZER;
|
||||
|
||||
/*
|
||||
* Unix /dev/random
|
||||
*/
|
||||
@@ -93,44 +90,29 @@ static int
|
||||
unix_bytes(unsigned char *outdata, int size)
|
||||
{
|
||||
ssize_t count;
|
||||
int once = 0;
|
||||
int fd;
|
||||
|
||||
if (size < 0)
|
||||
return 0;
|
||||
else if (size == 0)
|
||||
return 1;
|
||||
|
||||
HEIMDAL_MUTEX_lock(&random_mutex);
|
||||
if (random_fd == -1) {
|
||||
retry:
|
||||
random_fd = get_device_fd(O_RDONLY);
|
||||
if (random_fd < 0) {
|
||||
HEIMDAL_MUTEX_unlock(&random_mutex);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
fd = get_device_fd(O_RDONLY);
|
||||
if (fd < 0)
|
||||
return 0;
|
||||
|
||||
while (size > 0) {
|
||||
HEIMDAL_MUTEX_unlock(&random_mutex);
|
||||
count = read (random_fd, outdata, size);
|
||||
HEIMDAL_MUTEX_lock(&random_mutex);
|
||||
if (random_fd < 0) {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
else if (errno == EBADF && once++ == 0) {
|
||||
close(random_fd);
|
||||
random_fd = -1;
|
||||
goto retry;
|
||||
}
|
||||
return 0;
|
||||
} else if (count <= 0) {
|
||||
HEIMDAL_MUTEX_unlock(&random_mutex);
|
||||
count = read(fd, outdata, size);
|
||||
if (count < 0 && errno == EINTR)
|
||||
continue;
|
||||
else if (count <= 0) {
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
outdata += count;
|
||||
size -= count;
|
||||
}
|
||||
HEIMDAL_MUTEX_unlock(&random_mutex);
|
||||
close(fd);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@@ -955,6 +955,14 @@ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||
strsvis(char *, const char *, int, const char *);
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_STRSVISX) || defined(NEED_STRSVISX_PROTO)
|
||||
#ifndef HAVE_STRSVISX
|
||||
#define strsvisx rk_strsvisx
|
||||
#endif
|
||||
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||
strsvisx(char *, const char *, size_t, int, const char *);
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_STRUNVIS) || defined(NEED_STRUNVIS_PROTO)
|
||||
#ifndef HAVE_STRUNVIS
|
||||
#define strunvis rk_strunvis
|
||||
|
Reference in New Issue
Block a user