| 810 | #endif /* __APPLE__ */ |
| 811 | |
| 812 | unsigned long |
| 813 | sys_random_seed(void) |
| 814 | { |
| 815 | unsigned long seed = 0L; |
| 816 | unsigned long pid = (unsigned long) getpid(); |
| 817 | boolean no_seed = TRUE; |
| 818 | #ifdef DEV_RANDOM |
| 819 | FILE *fptr; |
| 820 | |
| 821 | fptr = fopen(DEV_RANDOM, "r"); |
| 822 | if (fptr) { |
| 823 | fread(&seed, sizeof (long), 1, fptr); |
| 824 | has_strong_rngseed = TRUE; /* decl.c */ |
| 825 | no_seed = FALSE; |
| 826 | (void) fclose(fptr); |
| 827 | } else { |
| 828 | /* leaves clue, doesn't exit */ |
| 829 | paniclog("sys_random_seed", "falling back to weak seed"); |
| 830 | } |
| 831 | #endif |
| 832 | if (no_seed) { |
| 833 | seed = (unsigned long) getnow(); /* time((TIME_type) 0) */ |
| 834 | /* Quick dirty band-aid to prevent PRNG prediction */ |
| 835 | if (pid) { |
| 836 | if (!(pid & 3L)) |
| 837 | pid -= 1L; |
| 838 | seed *= pid; |
| 839 | } |
| 840 | } |
| 841 | return seed; |
| 842 | } |
| 843 | |
| 844 | #if defined(MACOS) && defined(NHUUID) |
| 845 | extern void get_macos_uuid(char *); /* sys/unix/macuuid.m */ |