1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35: #include <sys/cdefs.h>
36: #ifndef lint
37: __COPYRIGHT("@(#) Copyright (c) 1994\n\
38: The Regents of the University of California. All rights reserved.\n");
39: #endif
40:
41: #ifndef lint
42: #if 0
43: static char sccsid[] = "@(#)random.c 8.6 (Berkeley) 6/1/94";
44: #else
45: __RCSID("$NetBSD: random.c,v 1.9 2004/01/27 20:30:30 jsm Exp $");
46: #endif
47: #endif
48:
49: #include <sys/types.h>
50: #include <sys/time.h>
51:
52: #include <err.h>
53: #include <errno.h>
54: #include <stdio.h>
55: #include <stdlib.h>
56: #include <time.h>
57: #include <unistd.h>
58: #include <limits.h>
59:
60: #define MAXRANDOM 2147483647
61:
62: int main(int, char **);
63: void usage(void) __attribute__((__noreturn__));
64:
65: int
66: main(argc, argv)
67: int argc;
68: char *argv[];
69: {
70: struct timeval tp;
71: double denom;
72: int ch, random_exit, selected, unbuffer_output;
73: char *ep;
74:
75:
76: setregid(getgid(), getgid());
77:
78: denom = 0;
79: random_exit = unbuffer_output = 0;
80: while ((ch = getopt(argc, argv, "er")) != -1)
81: switch (ch) {
82: case 'e':
83: random_exit = 1;
84: break;
85: case 'r':
86: unbuffer_output = 1;
87: break;
88: default:
89: case '?':
90: usage();
91:
92: }
93:
94: argc -= optind;
95: argv += optind;
96:
97: switch (argc) {
98: case 0:
99: denom = 2;
100: break;
101: case 1:
102: errno = 0;
103: denom = strtod(*argv, &ep);
104: if (errno == ERANGE)
105: err(1, "%s", *argv);
106: if (denom == 0 || *ep != '\0')
107: errx(1, "denominator is not valid.");
108: break;
109: default:
110: usage();
111:
112: }
113:
114: (void)gettimeofday(&tp, NULL);
115: srandom((u_int)(tp.tv_usec + tp.tv_sec + getpid()));
116:
117:
118: if (random_exit)
119: return ((denom * random()) / MAXRANDOM);
120:
121:
122:
123:
124:
125: if (unbuffer_output)
126: setbuf(stdout, NULL);
127:
128:
129:
130:
131:
132:
133:
134: selected = (int)(denom * random() / MAXRANDOM) == 0;
135: while ((ch = getchar()) != EOF) {
136: if (selected)
137: (void)putchar(ch);
138: if (ch == '\n') {
139:
140: if (ferror(stdout))
141: err(2, "stdout");
142:
143:
144: selected = (int)(denom * random() / MAXRANDOM) == 0;
145: }
146: }
147: if (ferror(stdin))
148: err(2, "stdin");
149: exit (0);
150: }
151:
152: void
153: usage()
154: {
155:
156: (void)fprintf(stderr, "usage: random [-er] [denominator]\n");
157: exit(1);
158: }