]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
2895. [func] genrandom: add support for the generation of multiple
authorMark Andrews <marka@isc.org>
Mon, 17 May 2010 04:40:10 +0000 (04:40 +0000)
committerMark Andrews <marka@isc.org>
Mon, 17 May 2010 04:40:10 +0000 (04:40 +0000)
                        files.  [RT #20917]

CHANGES
bin/tools/genrandom.c
bin/tools/genrandom.docbook

diff --git a/CHANGES b/CHANGES
index ee607f009234f85d63093f143bb9b1781c0530fe..d9fb61a28b225df1552719eaf9c0eddb8436dfb3 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+2895.  [func]          genrandom: add support for the generation of multiple
+                       files.  [RT #20917]
+
 2894.  [contrib]       DLZ LDAP support now use '$' not '%'. [RT #21294]
 
 2893.  [bug]           Improve managed keys support.  New named.conf option
index b34416e7d024ce5bc174c6e3d5951f75d321862b..41e104d568715385cdba13bb9a8455de4e20691f 100644 (file)
  * 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);
@@ -60,17 +56,80 @@ main(int argc, char **argv) {
 #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);
 }
index 581c93679da9e77bc9bc8f245fe6ab392123abcd..cd343d3a7328adcab5fcee9a1bf2c613beb4339a 100644 (file)
@@ -17,7 +17,7 @@
  - 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>
@@ -44,6 +44,7 @@
   <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>