]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/bind9/bin/tools/genrandom.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / bind9 / bin / tools / genrandom.c
1 /*
2  * Copyright (C) 2004, 2005, 2007, 2009, 2010  Internet Systems Consortium, Inc. ("ISC")
3  * Copyright (C) 2000-2003  Internet Software Consortium.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15  * PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 /* $Id: genrandom.c,v 1.7 2010/05/17 23:51:04 tbox Exp $ */
19
20 /*! \file */
21 #include <config.h>
22
23 #include <isc/commandline.h>
24 #include <isc/print.h>
25 #include <isc/stdlib.h>
26 #include <isc/util.h>
27
28 #include <stdio.h>
29 #include <string.h>
30
31 const char *program = "genrandom";
32
33 ISC_PLATFORM_NORETURN_PRE static void
34 usage(void) ISC_PLATFORM_NORETURN_POST;
35
36 static void
37 usage(void) {
38         fprintf(stderr, "usage: %s [-n 2..9] k file\n", program);
39         exit(1);
40 }
41
42 static void
43 generate(char *filename, unsigned int bytes) {
44         FILE *fp;
45
46         fp = fopen(filename, "w");
47         if (fp == NULL) {
48                 printf("failed to open %s\n", filename);
49                 exit(1);
50         }
51
52         while (bytes > 0) {
53 #ifndef HAVE_ARC4RANDOM
54                 unsigned short int x = (rand() & 0xFFFF);
55 #else
56                 unsigned short int x = (arc4random() & 0xFFFF);
57 #endif
58                 unsigned char c = x & 0xFF;
59                 if (putc(c, fp) == EOF) {
60                         printf("error writing to %s\n", filename);
61                         exit(1);
62                 }
63                 c = x >> 8;
64                 if (putc(c, fp) == EOF) {
65                         printf("error writing to %s\n", filename);
66                         exit(1);
67                 }
68                 bytes -= 2;
69         }
70         fclose(fp);
71 }
72
73 int
74 main(int argc, char **argv) {
75         unsigned int bytes;
76         unsigned int k;
77         char *endp;
78         int c, i, n = 1;
79         size_t len;
80         char *name;
81
82         isc_commandline_errprint = ISC_FALSE;
83
84         while ((c = isc_commandline_parse(argc, argv, "hn:")) != EOF) {
85                 switch (c) {
86                 case 'n':
87                         n = strtol(isc_commandline_argument, &endp, 10);
88                         if ((*endp != 0) || (n <= 1) || (n > 9))
89                                 usage();
90                         break;
91
92                 case '?':
93                         if (isc_commandline_option != '?')
94                                 fprintf(stderr, "%s: invalid argument -%c\n",
95                                         program, isc_commandline_option);
96                 case 'h':
97                         usage();
98
99                 default:
100                         fprintf(stderr, "%s: unhandled option -%c\n",
101                                 program, isc_commandline_option);
102                         exit(1);
103                 }
104         }
105
106         if (isc_commandline_index + 2 != argc)
107                 usage();
108
109         k = strtoul(argv[isc_commandline_index++], &endp, 10);
110         if (*endp != 0)
111                 usage();
112         bytes = k << 10;
113
114 #ifndef HAVE_ARC4RANDOM
115         srand(0x12345678);
116 #endif
117         if (n == 1) {
118                 generate(argv[isc_commandline_index], bytes);
119                 return (0);
120         }
121
122         len = strlen(argv[isc_commandline_index]) + 2;
123         name = (char *) malloc(len);
124         if (name == NULL) {
125                 perror("malloc");
126                 exit(1);
127         }
128
129         for (i = 1; i <= n; i++) {
130                 snprintf(name, len, "%s%d", argv[isc_commandline_index], i);
131                 generate(name, bytes);
132         }
133         free(name);
134
135         return (0);
136 }