make fmemopen's w+ mode truncate the buffer
[musl] / src / misc / getentropy.c
1 #include <sys/random.h>
2 #include <pthread.h>
3 #include <errno.h>
4
5 int getentropy(void *buffer, size_t len)
6 {
7         int cs, ret;
8         char *pos = buffer;
9
10         if (len > 256) {
11                 errno = EIO;
12                 return -1;
13         }
14
15         pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
16
17         while (len) {
18                 ret = getrandom(pos, len, 0);
19                 if (ret < 0) {
20                         if (errno == EINTR) continue;
21                         else break;
22                 }
23                 pos += ret;
24                 len -= ret;
25                 ret = 0;
26         }
27
28         pthread_setcancelstate(cs, 0);
29
30         return ret;
31 }