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