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 Workerint 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