static ssize_t fill_buffer(const int fd, void *buf, const size_t size) { struct sol_buffer buffer = SOL_BUFFER_INIT_FLAGS(buf, size, SOL_BUFFER_FLAGS_MEMORY_NOT_OWNED | SOL_BUFFER_FLAGS_NO_NUL_BYTE); ssize_t ret; ret = sol_util_fill_buffer_exactly(fd, &buffer, size); if (ret < 0) return ret; return ret; }
static int uuid_gen(struct sol_uuid *ret) { struct sol_buffer buf = SOL_BUFFER_INIT_FLAGS(ret, sizeof(*ret), SOL_BUFFER_FLAGS_MEMORY_NOT_OWNED | SOL_BUFFER_FLAGS_NO_NUL_BYTE); struct sol_random *engine; ssize_t size; SOL_NULL_CHECK(ret, -EINVAL); engine = sol_random_new(SOL_RANDOM_DEFAULT, 0); SOL_NULL_CHECK(engine, -errno); size = sol_random_fill_buffer(engine, &buf, sizeof(*ret)); sol_random_del(engine); sol_buffer_fini(&buf); if (size != (ssize_t)sizeof(*ret)) return -EIO; *ret = assert_uuid_v4(*ret); return 0; }