18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * magic.c - PPP Magic Number routines. 38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved. 58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Redistribution and use in source and binary forms, with or without 78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * modification, are permitted provided that the following conditions 88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * are met: 98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * notice, this list of conditions and the following disclaimer. 128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * notice, this list of conditions and the following disclaimer in 158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * the documentation and/or other materials provided with the 168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * distribution. 178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 3. The name "Carnegie Mellon University" must not be used to 198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * endorse or promote products derived from this software without 208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * prior written permission. For permission or any legal 218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * details, please contact 228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Office of Technology Transfer 238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Carnegie Mellon University 248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 5000 Forbes Avenue 258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Pittsburgh, PA 15213-3890 268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * (412) 268-4387, fax: (412) 268-7395 278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * tech-transfer@andrew.cmu.edu 288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 4. Redistributions of any form whatsoever must retain the following 308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * acknowledgment: 318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * "This product includes software developed by Computing Services 328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * at Carnegie Mellon University (http://www.cmu.edu/computing/)." 338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO 358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE 378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN 398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING 408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define RCSID "$Id: magic.c,v 1.11 2003/06/11 23:56:26 paulus Exp $" 448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdio.h> 468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdlib.h> 478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <unistd.h> 488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/types.h> 498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <sys/time.h> 508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "pppd.h" 528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include "magic.h" 538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic const char rcsid[] = RCSID; 558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern long mrand48 __P((void)); 578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectextern void srand48 __P((long)); 588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * magic_init - Initialize the magic number generator. 618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * 628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Attempts to compute a random number seed which will not repeat. 638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * The current method uses the current hostid, current process ID 648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and current time, currently. 658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid 678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectmagic_init() 688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project long seed; 708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project struct timeval t; 718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project gettimeofday(&t, NULL); 738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project seed = get_host_seed() ^ t.tv_sec ^ t.tv_usec ^ getpid(); 748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project srand48(seed); 758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * magic - Returns the next magic number. 798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectu_int32_t 818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectmagic() 828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (u_int32_t) mrand48(); 848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * random_bytes - Fill a buffer with random bytes. 888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid 908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectrandom_bytes(unsigned char *buf, int len) 918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project int i; 938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project for (i = 0; i < len; ++i) 958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project buf[i] = mrand48() >> 24; 968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifdef NO_DRAND48 998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/* 1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Substitute procedures for those systems which don't have 1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * drand48 et al. 1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */ 1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdouble 1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectdrand48() 1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return (double)random() / (double)0x7fffffffL; /* 2**31-1 */ 1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectlong 1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectmrand48() 1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project return random(); 1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectvoid 1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectsrand48(seedval) 1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectlong seedval; 1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{ 1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project srandom((int)seedval); 1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project} 1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project 1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif 124