magic.c revision 1.4
1/*	$NetBSD: magic.c,v 1.4 2014/10/25 21:11:37 christos Exp $	*/
2
3/*
4 * magic.c - PPP Magic Number routines.
5 *
6 * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in
17 *    the documentation and/or other materials provided with the
18 *    distribution.
19 *
20 * 3. The name "Carnegie Mellon University" must not be used to
21 *    endorse or promote products derived from this software without
22 *    prior written permission. For permission or any legal
23 *    details, please contact
24 *      Office of Technology Transfer
25 *      Carnegie Mellon University
26 *      5000 Forbes Avenue
27 *      Pittsburgh, PA  15213-3890
28 *      (412) 268-4387, fax: (412) 268-7395
29 *      tech-transfer@andrew.cmu.edu
30 *
31 * 4. Redistributions of any form whatsoever must retain the following
32 *    acknowledgment:
33 *    "This product includes software developed by Computing Services
34 *     at Carnegie Mellon University (http://www.cmu.edu/computing/)."
35 *
36 * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
37 * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
38 * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
39 * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
40 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
41 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
42 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
43 */
44
45#include <sys/cdefs.h>
46#if 0
47#define RCSID	"Id: magic.c,v 1.11 2003/06/11 23:56:26 paulus Exp "
48static const char rcsid[] = RCSID;
49#else
50__RCSID("$NetBSD: magic.c,v 1.4 2014/10/25 21:11:37 christos Exp $");
51#endif
52
53#include <stdio.h>
54#include <stdlib.h>
55#include <unistd.h>
56#include <sys/types.h>
57#include <sys/time.h>
58
59#include "pppd.h"
60#include "magic.h"
61
62
63extern long mrand48 __P((void));
64extern void srand48 __P((long));
65
66/*
67 * magic_init - Initialize the magic number generator.
68 *
69 * Attempts to compute a random number seed which will not repeat.
70 * The current method uses the current hostid, current process ID
71 * and current time, currently.
72 */
73void
74magic_init()
75{
76    long seed;
77    struct timeval t;
78
79    gettimeofday(&t, NULL);
80    seed = get_host_seed() ^ t.tv_sec ^ t.tv_usec ^ getpid();
81    srand48(seed);
82}
83
84/*
85 * magic - Returns the next magic number.
86 */
87u_int32_t
88magic()
89{
90    return (u_int32_t) mrand48();
91}
92
93/*
94 * random_bytes - Fill a buffer with random bytes.
95 */
96void
97random_bytes(unsigned char *buf, int len)
98{
99	int i;
100
101	for (i = 0; i < len; ++i)
102		buf[i] = mrand48() >> 24;
103}
104
105#ifdef NO_DRAND48
106/*
107 * Substitute procedures for those systems which don't have
108 * drand48 et al.
109 */
110
111double
112drand48()
113{
114    return (double)random() / (double)0x7fffffffL; /* 2**31-1 */
115}
116
117long
118mrand48()
119{
120    return random();
121}
122
123void
124srand48(seedval)
125long seedval;
126{
127    srandom((int)seedval);
128}
129
130#endif
131