getentropy.c 500 B

123456789101112131415161718192021222324252627282930313233
  1. #define _BSD_SOURCE
  2. #include <unistd.h>
  3. #include <sys/random.h>
  4. #include <pthread.h>
  5. #include <errno.h>
  6. int getentropy(void *buffer, size_t len)
  7. {
  8. int cs, ret = 0;
  9. char *pos = buffer;
  10. if (len > 256) {
  11. errno = EIO;
  12. return -1;
  13. }
  14. pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
  15. while (len) {
  16. ret = getrandom(pos, len, 0);
  17. if (ret < 0) {
  18. if (errno == EINTR) continue;
  19. else break;
  20. }
  21. pos += ret;
  22. len -= ret;
  23. ret = 0;
  24. }
  25. pthread_setcancelstate(cs, 0);
  26. return ret;
  27. }