1 /* 2 * magic.c - PPP Magic Number routines. 3 * 4 * Copyright (c) 1989 Carnegie Mellon University. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms are permitted 8 * provided that the above copyright notice and this paragraph are 9 * duplicated in all such forms and that any documentation, 10 * advertising materials, and other materials related to such 11 * distribution and use acknowledge that the software was developed 12 * by Carnegie Mellon University. The name of the 13 * University may not be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 17 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 18 */ 19 20 #include <stdio.h> 21 #include <stdlib.h> 22 #include <unistd.h> 23 #include <sys/types.h> 24 #include <sys/time.h> 25 26 #include "pppd.h" 27 #include "magic.h" 28 29 #ifdef NO_DRAND48 30 long mrand48 __P((void)); 31 void srand48 __P((long)); 32 #endif 33 34 /* 35 * magic_init - Initialize the magic number generator. 36 * 37 * Attempts to compute a random number seed which will not repeat. 38 * The current method uses the current hostid, current process ID 39 * and current time, currently. 40 */ 41 void 42 magic_init() 43 { 44 long seed; 45 struct timeval t; 46 47 (void) gettimeofday(&t, NULL); 48 seed = get_host_seed() ^ t.tv_sec ^ t.tv_usec ^ getpid(); 49 srand48(seed); 50 } 51 52 /* 53 * magic - Returns the next magic number. 54 */ 55 u_int32_t 56 magic() 57 { 58 return (u_int32_t) mrand48(); 59 } 60 61 #ifdef NO_DRAND48 62 /* 63 * Substitute procedures for those systems which don't have 64 * drand48 et al. 65 */ 66 67 double 68 drand48() 69 { 70 return (double)random() / (double)0x7fffffffL; /* 2**31-1 */ 71 } 72 73 long 74 mrand48() 75 { 76 return random(); 77 } 78 79 void 80 srand48(seedval) 81 long seedval; 82 { 83 srandom((int)seedval); 84 } 85 86 #endif 87