1 /* $NetBSD: generate-requests.c,v 1.1.1.1 2011/04/13 18:14:38 elric Exp $ */ 2 3 /* 4 * Copyright (c) 2000 - 2004 Kungliga Tekniska Högskolan 5 * (Royal Institute of Technology, Stockholm, Sweden). 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * 3. Neither the name of the Institute nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 */ 35 36 #include "kuser_locl.h" 37 38 static unsigned 39 read_words (const char *filename, char ***ret_w) 40 { 41 unsigned n, alloc; 42 FILE *f; 43 char buf[256]; 44 char **w = NULL; 45 46 f = fopen (filename, "r"); 47 if (f == NULL) 48 err (1, "cannot open %s", filename); 49 alloc = n = 0; 50 while (fgets (buf, sizeof(buf), f) != NULL) { 51 buf[strcspn(buf, "\r\n")] = '\0'; 52 if (n >= alloc) { 53 alloc += 16; 54 w = erealloc (w, alloc * sizeof(char **)); 55 } 56 w[n++] = estrdup (buf); 57 } 58 *ret_w = w; 59 if (n == 0) 60 errx(1, "%s is an empty file, no words to try", filename); 61 fclose(f); 62 return n; 63 } 64 65 static void 66 generate_requests (const char *filename, unsigned nreq) 67 { 68 krb5_principal client; 69 krb5_context context; 70 krb5_error_code ret; 71 krb5_creds cred; 72 int i; 73 char **words; 74 unsigned nwords; 75 76 ret = krb5_init_context (&context); 77 if (ret) 78 errx (1, "krb5_init_context failed: %d", ret); 79 80 nwords = read_words (filename, &words); 81 82 for (i = 0; i < nreq; ++i) { 83 char *name = words[rand() % nwords]; 84 85 memset(&cred, 0, sizeof(cred)); 86 87 ret = krb5_parse_name (context, name, &client); 88 if (ret) 89 krb5_err (context, 1, ret, "krb5_parse_name %s", name); 90 91 ret = krb5_get_init_creds_password (context, &cred, client, "", 92 NULL, NULL, 0, NULL, NULL); 93 if (ret) 94 krb5_free_cred_contents (context, &cred); 95 krb5_free_principal(context, client); 96 } 97 } 98 99 static int version_flag = 0; 100 static int help_flag = 0; 101 102 static struct getargs args[] = { 103 { "version", 0, arg_flag, &version_flag }, 104 { "help", 0, arg_flag, &help_flag } 105 }; 106 107 static void 108 usage (int ret) 109 { 110 arg_printusage (args, 111 sizeof(args)/sizeof(*args), 112 NULL, 113 "file number"); 114 exit (ret); 115 } 116 117 int 118 main(int argc, char **argv) 119 { 120 int optidx = 0; 121 int nreq; 122 char *end; 123 124 setprogname(argv[0]); 125 if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) 126 usage(1); 127 128 if (help_flag) 129 usage (0); 130 131 if(version_flag) { 132 print_version(NULL); 133 exit(0); 134 } 135 136 argc -= optidx; 137 argv += optidx; 138 139 if (argc != 2) 140 usage (1); 141 srand (0); 142 nreq = strtol (argv[1], &end, 0); 143 if (argv[1] == end || *end != '\0') 144 usage (1); 145 generate_requests (argv[0], nreq); 146 return 0; 147 } 148