xref: /third_party/musl/src/misc/getentropy.c
  • Home
  • History
  • Annotate Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
  • only in /third_party/musl/src/misc/
1570af302Sopenharmony_ci#define _BSD_SOURCE
2570af302Sopenharmony_ci#include <unistd.h>
3570af302Sopenharmony_ci#include <sys/random.h>
4570af302Sopenharmony_ci#include <pthread.h>
5570af302Sopenharmony_ci#include <errno.h>
6570af302Sopenharmony_ci
7570af302Sopenharmony_ciint getentropy(void *buffer, size_t len)
8570af302Sopenharmony_ci{
9570af302Sopenharmony_ci	int cs, ret = 0;
10570af302Sopenharmony_ci	char *pos = buffer;
11570af302Sopenharmony_ci
12570af302Sopenharmony_ci	if (len > 256) {
13570af302Sopenharmony_ci		errno = EIO;
14570af302Sopenharmony_ci		return -1;
15570af302Sopenharmony_ci	}
16570af302Sopenharmony_ci
17570af302Sopenharmony_ci	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
18570af302Sopenharmony_ci
19570af302Sopenharmony_ci	while (len) {
20570af302Sopenharmony_ci		ret = getrandom(pos, len, 0);
21570af302Sopenharmony_ci		if (ret < 0) {
22570af302Sopenharmony_ci			if (errno == EINTR) continue;
23570af302Sopenharmony_ci			else break;
24570af302Sopenharmony_ci		}
25570af302Sopenharmony_ci		pos += ret;
26570af302Sopenharmony_ci		len -= ret;
27570af302Sopenharmony_ci		ret = 0;
28570af302Sopenharmony_ci	}
29570af302Sopenharmony_ci
30570af302Sopenharmony_ci	pthread_setcancelstate(cs, 0);
31570af302Sopenharmony_ci
32570af302Sopenharmony_ci	return ret;
33570af302Sopenharmony_ci}
34

Indexes created Thu Nov 07 10:32:03 CST 2024