* PERFORMANCE OF THIS SOFTWARE.
*/
-/* $Id: genrandom.c,v 1.4 2009/03/07 23:47:45 tbox Exp $ */
+/* $Id: genrandom.c,v 1.4.152.1 2010/05/17 04:40:10 marka Exp $ */
/*! \file */
#include <config.h>
+#include <isc/commandline.h>
+#include <isc/stdlib.h>
+#include <isc/util.h>
+
#include <stdio.h>
-#include <time.h>
+#include <string.h>
-#include <isc/stdlib.h>
+const char *program = "genrandom";
-int
-main(int argc, char **argv) {
- unsigned int bytes;
- unsigned int k;
- char *endp;
- FILE *fp;
+ISC_PLATFORM_NORETURN_PRE static void
+usage(void) ISC_PLATFORM_NORETURN_POST;
- if (argc != 3) {
- printf("usage: genrandom k file\n");
- exit(1);
- }
- k = strtoul(argv[1], &endp, 10);
- if (*endp != 0) {
- printf("usage: genrandom k file\n");
- exit(1);
- }
- bytes = k << 10;
+static void
+usage(void) {
+ fprintf(stderr, "usage: %s [-n 2..9] k file\n", program);
+ exit(1);
+}
- fp = fopen(argv[2], "w");
+static void
+generate(char *filename, unsigned int bytes) {
+ FILE *fp;
+
+ fp = fopen(filename, "w");
if (fp == NULL) {
- printf("failed to open %s\n", argv[2]);
+ printf("failed to open %s\n", filename);
exit(1);
}
-#ifndef HAVE_ARC4RANDOM
- srand(0x12345678);
-#endif
while (bytes > 0) {
#ifndef HAVE_ARC4RANDOM
unsigned short int x = (rand() & 0xFFFF);
#endif
unsigned char c = x & 0xFF;
if (putc(c, fp) == EOF) {
- printf("error writing to file\n");
+ printf("error writing to %s\n", filename);
exit(1);
}
c = x >> 8;
if (putc(c, fp) == EOF) {
- printf("error writing to file\n");
+ printf("error writing to %s\n", filename);
exit(1);
}
bytes -= 2;
}
fclose(fp);
+}
+
+int
+main(int argc, char **argv) {
+ unsigned int bytes;
+ unsigned int k;
+ char *endp;
+ int c, i, n = 1;
+ size_t len;
+ char *name;
+
+ isc_commandline_errprint = ISC_FALSE;
+
+ while ((c = isc_commandline_parse(argc, argv, "hn:")) != EOF) {
+ switch (c) {
+ case 'n':
+ n = strtol(isc_commandline_argument, &endp, 10);
+ if ((*endp != 0) || (n <= 1) || (n > 9))
+ usage();
+ break;
+
+ case '?':
+ if (isc_commandline_option != '?')
+ fprintf(stderr, "%s: invalid argument -%c\n",
+ program, isc_commandline_option);
+ case 'h':
+ usage();
+
+ default:
+ fprintf(stderr, "%s: unhandled option -%c\n",
+ program, isc_commandline_option);
+ exit(1);
+ }
+ }
+
+ if (isc_commandline_index + 2 != argc)
+ usage();
+
+ k = strtoul(argv[isc_commandline_index++], &endp, 10);
+ if (*endp != 0)
+ usage();
+ bytes = k << 10;
+
+#ifndef HAVE_ARC4RANDOM
+ srand(0x12345678);
+#endif
+ if (n == 1) {
+ generate(argv[isc_commandline_index], bytes);
+ return (0);
+ }
+
+ len = strlen(argv[isc_commandline_index]) + 2;
+ name = (char *) malloc(len);
+ if (name == NULL) {
+ perror("malloc");
+ exit(1);
+ }
+
+ for (i = 1; i <= n; i++) {
+ snprintf(name, len, "%s%d", argv[isc_commandline_index], i);
+ generate(name, bytes);
+ }
+ free(name);
return (0);
}
- PERFORMANCE OF THIS SOFTWARE.
-->
-<!-- $Id: genrandom.docbook,v 1.4 2009/09/18 13:14:47 fdupont Exp $ -->
+<!-- $Id: genrandom.docbook,v 1.4.88.1 2010/05/17 04:40:10 marka Exp $ -->
<refentry id="man.genrandom">
<refentryinfo>
<date>Feb 19, 2009</date>
<refsynopsisdiv>
<cmdsynopsis>
<command>genrandom</command>
+ <arg><option>-n <replaceable class="parameter">number</replaceable></option></arg>
<arg choice="req"><replaceable class="parameter">size</replaceable></arg>
<arg choice="req"><replaceable class="parameter">filename</replaceable></arg>
</cmdsynopsis>
<title>DESCRIPTION</title>
<para>
<command>genrandom</command>
- generates a file containing a specified quantity of pseudo-random
- data, which can be used as a source of entropy for other commands
- on systems with no random device.
+ generates a file or a set of files containing a specified quantity
+ of pseudo-random data, which can be used as a source of entropy for
+ other commands on systems with no random device.
</para>
</refsect1>
<refsect1>
<title>ARGUMENTS</title>
<variablelist>
+ <varlistentry>
+ <term>-n <replaceable class="parameter">number</replaceable></term>
+ <listitem>
+ <para>
+ In place of generating one file, generates <option>number</option>
+ (from 2 to 9) files, appending <option>number</option> to the name.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry>
<term>size</term>
<listitem>