PageRenderTime 13ms CodeModel.GetById 6ms app.highlight 5ms RepoModel.GetById 1ms app.codeStats 0ms

/contrib/bind9/bin/tools/genrandom.c

https://bitbucket.org/freebsd/freebsd-head/
C | 136 lines | 97 code | 21 blank | 18 comment | 25 complexity | 4483c12bc238799bd2a75782cd0383f3 MD5 | raw file
  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
 31const char *program = "genrandom";
 32
 33ISC_PLATFORM_NORETURN_PRE static void
 34usage(void) ISC_PLATFORM_NORETURN_POST;
 35
 36static void
 37usage(void) {
 38	fprintf(stderr, "usage: %s [-n 2..9] k file\n", program);
 39	exit(1);
 40}
 41
 42static void
 43generate(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
 73int
 74main(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}