random.c 812 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #include <plan9.h>
  2. #include <fcall.h>
  3. #include <u9fs.h>
  4. #include <stdlib.h>
  5. #include <sys/time.h>
  6. #include <fcntl.h>
  7. static long
  8. getseed(void)
  9. {
  10. struct timeval tv;
  11. long seed;
  12. int fd, len;
  13. len = 0;
  14. fd = open("/dev/urandom", O_RDONLY);
  15. if(fd > 0){
  16. len = readn(fd, &seed, sizeof(seed));
  17. close(fd);
  18. }
  19. if(len != sizeof(seed)){
  20. gettimeofday(&tv, nil);
  21. seed = tv.tv_sec ^ tv.tv_usec ^ (getpid()<<8);
  22. }
  23. return seed;
  24. }
  25. static int seeded;
  26. void
  27. randombytes(uchar *r, uint nr)
  28. {
  29. int i;
  30. ulong l;
  31. if(!seeded){
  32. seeded=1;
  33. srand48(getseed());
  34. }
  35. for(i=0; i+4<=nr; i+=4,r+=4){
  36. l = (ulong)mrand48();
  37. r[0] = l;
  38. r[1] = l>>8;
  39. r[2] = l>>16;
  40. r[3] = l>>24;
  41. }
  42. if(i<nr){
  43. l = (ulong)mrand48();
  44. switch(nr-i){
  45. case 3:
  46. r[2] = l>>16;
  47. case 2:
  48. r[1] = l>>8;
  49. case 1:
  50. r[0] = l;
  51. }
  52. }
  53. }