" return __builtin_cpu_supports(\"mmx\");\n"
"}"
},
+ { "HAVE_SYS_RANDOM", "<sys/random.h>",
+ "OUTSIDE_MAIN", NULL, NULL,
+ "#include <sys/random.h>\n" },
};
static void c12r_err(int eval, const char *fmt, ...)
),
description: 'Is isblank() available?'
)
+conf.set10(
+ 'HAVE_SYS_RANDOM',
+ cc.compiles(
+ '''#include <sys/random.h>''',
+ name: 'sys/random.h'
+ ),
+ description: 'Is sys/random.h(getrandom) include-able?'
+)
configure_file(
output: 'config.h',
/**
* This program uses NVMe IOCTLs to run native nvme commands to a device.
*/
-
+#include "config.h"
#include "nvme/tree.h"
#include "nvme/types.h"
#include <errno.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
-#include <sys/random.h>
+
+#if HAVE_SYS_RANDOM
+ #include <sys/random.h>
+#endif
#include "common.h"
#include "nvme.h"
}
#endif
+static ssize_t getrandom_bytes(void *buf, size_t buflen)
+{
+#if !HAVE_SYS_RANDOM
+ return getrandom(buf, buflen, GRND_NONBLOCK);
+#else
+ ssize_t result;
+ int fd, err = 0;
+
+ fd = open("/dev/urandom", O_RDONLY);
+ if (fd < 0)
+ return fd;
+ result = read(fd, buf, buflen);
+ if (result < 0)
+ err = errno;
+ close(fd);
+ errno = err;
+ return result;
+#endif
+}
+
static bool is_chardev(void)
{
return S_ISCHR(nvme_stat.st_mode);
if (!raw_secret)
return -ENOMEM;
if (!cfg.secret) {
- if (getrandom(raw_secret, cfg.key_len, GRND_NONBLOCK) < 0)
- return errno;
+ if (getrandom_bytes(raw_secret, cfg.key_len) < 0)
+ return -errno;
} else {
int secret_len = 0, i;
unsigned int c;