Change __signed to signed.
[dragonfly.git] / crypto / kerberosIV / admin / ext_srvtab.c
1 /*
2  * Copyright 1987, 1988 by the Massachusetts Institute of Technology. 
3  *
4  * For copying and distribution information, please see the file
5  * <mit-copyright.h>. 
6  *
7  * Description 
8  */
9
10 #include "adm_locl.h"
11
12 RCSID("$Id: ext_srvtab.c,v 1.18 1999/09/16 20:37:20 assar Exp $");
13
14 static des_cblock master_key;
15 static des_cblock session_key;
16 static des_key_schedule master_key_schedule;
17 static char realm[REALM_SZ];
18
19 static void
20 StampOutSecrets(void)
21 {
22     memset(master_key, 0, sizeof master_key);
23     memset(session_key, 0, sizeof session_key);
24     memset(master_key_schedule, 0, sizeof master_key_schedule);
25 }
26
27 static void
28 usage(void)
29 {
30     fprintf(stderr, 
31             "Usage: %s [-n] [-r realm] instance [instance ...]\n",
32             __progname);
33     StampOutSecrets();
34     exit(1);
35 }
36
37 static void
38 FWrite(void *p, int size, int n, FILE *f)
39 {
40     if (fwrite(p, size, n, f) != n) {
41         StampOutSecrets();
42         errx(1, "Error writing output file.  Terminating.\n");
43     }
44 }
45
46 int
47 main(int argc, char **argv)
48 {
49     FILE *fout;
50     char fname[1024];
51     int fopen_errs = 0;
52     int arg;
53     Principal princs[40];
54     int more; 
55     int prompt = KDB_GET_PROMPT;
56     int n, i;
57     
58     set_progname (argv[0]);
59     memset(realm, 0, sizeof(realm));
60     
61 #ifdef HAVE_ATEXIT
62     atexit(StampOutSecrets);
63 #endif
64
65     /* Parse commandline arguments */
66     if (argc < 2)
67         usage();
68     else {
69         for (i = 1; i < argc; i++) {
70             if (strcmp(argv[i], "-n") == 0)
71                 prompt = FALSE;
72             else if (strcmp(argv[i], "-r") == 0) {
73                 if (++i >= argc)
74                     usage();
75                 else {
76                     strlcpy(realm, argv[i], REALM_SZ);
77                     /* 
78                      * This is to humor the broken way commandline
79                      * argument parsing is done.  Later, this
80                      * program ignores everything that starts with -.
81                      */
82                     argv[i][0] = '-';
83                 }
84             }
85             else if (argv[i][0] == '-')
86                 usage();
87             else
88                 if (!k_isinst(argv[i])) {
89                   warnx("bad instance name: %s", argv[i]);
90                   usage();
91             }
92         }
93     }
94
95     if (kdb_get_master_key (prompt, &master_key, master_key_schedule) != 0)
96       errx (1, "Couldn't read master key.");
97
98     if (kdb_verify_master_key (&master_key, master_key_schedule, stderr) < 0) {
99       exit(1);
100     }
101
102     /* For each arg, search for instances of arg, and produce */
103     /* srvtab file */
104     if (!realm[0])
105       if (krb_get_lrealm(realm, 1) != KSUCCESS) {
106           StampOutSecrets();
107           errx (1, "couldn't get local realm");
108       }
109     umask(077);
110
111     for (arg = 1; arg < argc; arg++) {
112         if (argv[arg][0] == '-')
113             continue;
114         snprintf(fname, sizeof(fname), "%s-new-srvtab", argv[arg]);
115         if ((fout = fopen(fname, "w")) == NULL) {
116             warn("Couldn't create file '%s'.", fname);
117             fopen_errs++;
118             continue;
119         }
120         printf("Generating '%s'....\n", fname);
121         n = kerb_get_principal("*", argv[arg], &princs[0], 40, &more);
122         if (more)
123             fprintf(stderr, "More than 40 found...\n");
124         for (i = 0; i < n; i++) {
125             FWrite(princs[i].name, strlen(princs[i].name) + 1, 1, fout);
126             FWrite(princs[i].instance, strlen(princs[i].instance) + 1,
127                    1, fout);
128             FWrite(realm, strlen(realm) + 1, 1, fout);
129             FWrite(&princs[i].key_version,
130                 sizeof(princs[i].key_version), 1, fout);
131             copy_to_key(&princs[i].key_low, &princs[i].key_high, session_key);
132             kdb_encrypt_key (&session_key, &session_key, 
133                              &master_key, master_key_schedule, DES_DECRYPT);
134             FWrite(session_key, sizeof session_key, 1, fout);
135         }
136         fclose(fout);
137     }
138     StampOutSecrets();
139     return fopen_errs;          /* 0 errors if successful */
140 }