xref: /aosp_15_r20/external/musl/src/misc/getentropy.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #define _BSD_SOURCE
2*c9945492SAndroid Build Coastguard Worker #include <unistd.h>
3*c9945492SAndroid Build Coastguard Worker #include <sys/random.h>
4*c9945492SAndroid Build Coastguard Worker #include <pthread.h>
5*c9945492SAndroid Build Coastguard Worker #include <errno.h>
6*c9945492SAndroid Build Coastguard Worker 
getentropy(void * buffer,size_t len)7*c9945492SAndroid Build Coastguard Worker int getentropy(void *buffer, size_t len)
8*c9945492SAndroid Build Coastguard Worker {
9*c9945492SAndroid Build Coastguard Worker 	int cs, ret = 0;
10*c9945492SAndroid Build Coastguard Worker 	char *pos = buffer;
11*c9945492SAndroid Build Coastguard Worker 
12*c9945492SAndroid Build Coastguard Worker 	if (len > 256) {
13*c9945492SAndroid Build Coastguard Worker 		errno = EIO;
14*c9945492SAndroid Build Coastguard Worker 		return -1;
15*c9945492SAndroid Build Coastguard Worker 	}
16*c9945492SAndroid Build Coastguard Worker 
17*c9945492SAndroid Build Coastguard Worker 	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
18*c9945492SAndroid Build Coastguard Worker 
19*c9945492SAndroid Build Coastguard Worker 	while (len) {
20*c9945492SAndroid Build Coastguard Worker 		ret = getrandom(pos, len, 0);
21*c9945492SAndroid Build Coastguard Worker 		if (ret < 0) {
22*c9945492SAndroid Build Coastguard Worker 			if (errno == EINTR) continue;
23*c9945492SAndroid Build Coastguard Worker 			else break;
24*c9945492SAndroid Build Coastguard Worker 		}
25*c9945492SAndroid Build Coastguard Worker 		pos += ret;
26*c9945492SAndroid Build Coastguard Worker 		len -= ret;
27*c9945492SAndroid Build Coastguard Worker 		ret = 0;
28*c9945492SAndroid Build Coastguard Worker 	}
29*c9945492SAndroid Build Coastguard Worker 
30*c9945492SAndroid Build Coastguard Worker 	pthread_setcancelstate(cs, 0);
31*c9945492SAndroid Build Coastguard Worker 
32*c9945492SAndroid Build Coastguard Worker 	return ret;
33*c9945492SAndroid Build Coastguard Worker }
34