2895. [func] genrandom: add support for the generation of multiple

files.  [RT #20917]
This commit is contained in:
Mark Andrews
2010-05-17 04:38:45 +00:00
parent 7e621e1c51
commit 3ec79bbc03
3 changed files with 104 additions and 31 deletions

View File

@@ -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] 2894. [contrib] DLZ LDAP support now use '$' not '%'. [RT #21294]
2893. [bug] Improve managed keys support. New named.conf option 2893. [bug] Improve managed keys support. New named.conf option

View File

@@ -15,43 +15,39 @@
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $Id: genrandom.c,v 1.4 2009/03/07 23:47:45 tbox Exp $ */ /* $Id: genrandom.c,v 1.5 2010/05/17 04:38:45 marka Exp $ */
/*! \file */ /*! \file */
#include <config.h> #include <config.h>
#include <stdio.h> #include <isc/commandline.h>
#include <time.h>
#include <isc/stdlib.h> #include <isc/stdlib.h>
#include <isc/util.h>
int #include <stdio.h>
main(int argc, char **argv) { #include <string.h>
unsigned int bytes;
unsigned int k; const char *program = "genrandom";
char *endp;
ISC_PLATFORM_NORETURN_PRE static void
usage(void) ISC_PLATFORM_NORETURN_POST;
static void
usage(void) {
fprintf(stderr, "usage: %s [-n 2..9] k file\n", program);
exit(1);
}
static void
generate(char *filename, unsigned int bytes) {
FILE *fp; FILE *fp;
if (argc != 3) { fp = fopen(filename, "w");
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;
fp = fopen(argv[2], "w");
if (fp == NULL) { if (fp == NULL) {
printf("failed to open %s\n", argv[2]); printf("failed to open %s\n", filename);
exit(1); exit(1);
} }
#ifndef HAVE_ARC4RANDOM
srand(0x12345678);
#endif
while (bytes > 0) { while (bytes > 0) {
#ifndef HAVE_ARC4RANDOM #ifndef HAVE_ARC4RANDOM
unsigned short int x = (rand() & 0xFFFF); unsigned short int x = (rand() & 0xFFFF);
@@ -60,17 +56,80 @@ main(int argc, char **argv) {
#endif #endif
unsigned char c = x & 0xFF; unsigned char c = x & 0xFF;
if (putc(c, fp) == EOF) { if (putc(c, fp) == EOF) {
printf("error writing to file\n"); printf("error writing to %s\n", filename);
exit(1); exit(1);
} }
c = x >> 8; c = x >> 8;
if (putc(c, fp) == EOF) { if (putc(c, fp) == EOF) {
printf("error writing to file\n"); printf("error writing to %s\n", filename);
exit(1); exit(1);
} }
bytes -= 2; bytes -= 2;
} }
fclose(fp); 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); return (0);
} }

View File

@@ -17,7 +17,7 @@
- PERFORMANCE OF THIS SOFTWARE. - PERFORMANCE OF THIS SOFTWARE.
--> -->
<!-- $Id: genrandom.docbook,v 1.4 2009/09/18 13:14:47 fdupont Exp $ --> <!-- $Id: genrandom.docbook,v 1.5 2010/05/17 04:38:45 marka Exp $ -->
<refentry id="man.genrandom"> <refentry id="man.genrandom">
<refentryinfo> <refentryinfo>
<date>Feb 19, 2009</date> <date>Feb 19, 2009</date>
@@ -44,6 +44,7 @@
<refsynopsisdiv> <refsynopsisdiv>
<cmdsynopsis> <cmdsynopsis>
<command>genrandom</command> <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">size</replaceable></arg>
<arg choice="req"><replaceable class="parameter">filename</replaceable></arg> <arg choice="req"><replaceable class="parameter">filename</replaceable></arg>
</cmdsynopsis> </cmdsynopsis>
@@ -53,15 +54,25 @@
<title>DESCRIPTION</title> <title>DESCRIPTION</title>
<para> <para>
<command>genrandom</command> <command>genrandom</command>
generates a file containing a specified quantity of pseudo-random generates a file or a set of files containing a specified quantity
data, which can be used as a source of entropy for other commands of pseudo-random data, which can be used as a source of entropy for
on systems with no random device. other commands on systems with no random device.
</para> </para>
</refsect1> </refsect1>
<refsect1> <refsect1>
<title>ARGUMENTS</title> <title>ARGUMENTS</title>
<variablelist> <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> <varlistentry>
<term>size</term> <term>size</term>
<listitem> <listitem>