Simpler implementation

This commit is contained in:
Jōshin 2018-12-27 06:03:44 +00:00
parent a9f39225c5
commit 7a7e7b30f8
5 changed files with 76 additions and 46 deletions

17
include/ent.h Normal file
View File

@ -0,0 +1,17 @@
#ifndef _ENT_H
#define _ENT_H
#include <stddef.h>
/*
* Fills buf with high-quality entropy.
*
* buflen is the number of bytes, no greater than 256.
*
* Returns 0 on success. On failure, returns -1 and sets errno to
* indicate the error.
*/
int
ent_getentropy(void* buf, size_t buflen);
#endif /* _ENT_H */

View File

@ -1,26 +0,0 @@
#ifndef _LIBENT_DETAIL_H
#define _LIBENT_DETAIL_H
#if defined _WIN32 || defined __CYGWIN__
# ifdef WIN_EXPORT
# ifdef __GNUC__
# define ENT_EXPORT __attribute__ ((dllexport))
# else
# define ENT_EXPORT __declspec(dllexport)
# endif
# else
# ifdef __GNUC__
# define ENT_EXPORT __attribute__ ((dllimport))
# else
# define ENT_EXPORT __declspec(dllimport)
# endif
# endif
#else
# if __GNUC__ >= 4
# define ENT_EXPORT __attribute__ ((visibility ("default")))
# else
# define ENT_EXPORT
# endif
#endif
#endif /* _LIBENT_DETAIL_H */

View File

@ -1,12 +0,0 @@
#ifndef _LIBENT_ENT_H
#define _LIBENT_ENT_H
#include <stddef.h>
#include <ent/detail.h>
ENT_EXPORT
int
ent_getentropy(void *buf, size_t buflen);
#endif /* _LIBENT_ENT_H */

View File

@ -3,11 +3,33 @@ project('libent', 'c', 'cpp',
version : '0.0.1', version : '0.0.1',
license : 'MIT') license : 'MIT')
inc = include_directories('include') conf_data = configuration_data()
compiler = meson.get_compiler('c')
install_headers('include/ent/ent.h', subdir : 'ent') code = '''#include <unistd.h>
#include <sys/random.h>
int main() { return getentropy((void*)0, 0); }
'''
have_getentropy = compiler.links(code,name : 'system getentropy')
conf_data.set('USE_GETENTROPY', have_getentropy)
if not have_getentropy
code = '''#include <fcntl.h>
int main() { return -1 != open("/dev/urandom", O_RDONLY) ? 0 : 1; }
'''
use_urandom = compiler.run(code, name : 'open /dev/urandom')
conf_data.set('USE_URANDOM', use_urandom.returncode() == 0)
endif
configure_file(output : 'config.h',
configuration : conf_data)
inc = include_directories('.', 'include')
install_headers('include/ent.h')
ent_sources = ['src/ent.c'] ent_sources = ['src/ent.c']
libent = shared_library('ent', libent = shared_library('ent',
ent_sources, ent_sources,
include_directories : inc, include_directories : inc,

View File

@ -1,14 +1,43 @@
#include <ent/ent.h> #include <ent.h>
#if defined __OPENBSD__ || (defined __linux__ && defined _DEFAULT_SOURCE) #include <assert.h>
# include <unistd.h>
# define getentropy_impl getentropy #include "config.h"
#elif defined __APPLE__ && defined __MACH__
#if defined(USE_GETENTROPY)
# include <unistd.h> # include <unistd.h>
# if defined(__APPLE__) || defined(__linux__)
# include <sys/random.h> # include <sys/random.h>
# endif
# define getentropy_impl getentropy # define getentropy_impl getentropy
#elif defined(USE_URANDOM)
# include <fcntl.h>
# include <sys/types.h>
# include <unistd.h>
#else #else
# error "Port: getentropy unimplemented" # error "port: getentropy"
#endif
#if defined(USE_URANDOM)
static int
getentropy_impl(void* buf, size_t buflen)
{
int fd;
assert(buflen <= 256);
if (-1 == (fd = open("/dev/urandom", O_RDONLY))) {
return -1;
}
if (buflen != read(fd, buf, buflen)) {
(void) close(fd);
return -1;
}
close(fd);
return 0;
}
#endif #endif
int int