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