Initial import from FreeBSD RELENG_4:
[dragonfly.git] / crypto / kerberosIV / kuser / kinit.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  * Routine to initialize user to Kerberos.  Prompts optionally for
8  * user, instance and realm.  Authenticates user and gets a ticket
9  * for the Kerberos ticket-granting service for future use. 
10  *
11  * Options are: 
12  *
13  *   -i[instance]
14  *   -r[realm]
15  *   -v[erbose]
16  *   -l[ifetime]
17  *   -p
18  *
19  * $FreeBSD: src/crypto/kerberosIV/kuser/kinit.c,v 1.5 1999/09/19 21:56:05 markm Exp $
20  */
21
22 #include "kuser_locl.h"
23
24 RCSID("$Id: kinit.c,v 1.17 1997/12/12 04:48:44 assar Exp $");
25
26 #define LIFE    DEFAULT_TKT_LIFE /* lifetime of ticket in 5-minute units */
27 #define CHPASSLIFE 2
28
29 static void
30 get_input(char *s, int size, FILE *stream)
31 {
32     char *p;
33
34     if (fgets(s, size, stream) == NULL)
35         exit(1);
36     if ( (p = strchr(s, '\n')) != NULL)
37         *p = '\0';
38 }
39
40
41 static void
42 usage(void)
43 {
44     fprintf(stderr, "Usage: %s [-irvlp] [name]\n", __progname);
45     exit(1);
46 }
47
48 int
49 main(int argc, char **argv)
50 {
51     char    aname[ANAME_SZ];
52     char    inst[INST_SZ];
53     char    realm[REALM_SZ];
54     char    buf[MaxHostNameLen];
55     char    name[MAX_K_NAME_SZ];
56     char   *username = NULL;
57     int     iflag, rflag, vflag, lflag, pflag, lifetime, k_errno;
58     int     i;
59
60     set_progname (argv[0]);
61
62     *inst = *realm = '\0';
63     iflag = rflag = vflag = lflag = pflag = 0;
64     lifetime = LIFE;
65
66     while (--argc) {
67         if ((*++argv)[0] != '-') {
68             if (username)
69                 usage();
70             username = *argv;
71             continue;
72         }
73         for (i = 1; (*argv)[i] != '\0'; i++)
74             switch ((*argv)[i]) {
75             case 'i':           /* Instance */
76                 ++iflag;
77                 continue;
78             case 'r':           /* Realm */
79                 ++rflag;
80                 continue;
81             case 'v':           /* Verbose */
82                 ++vflag;
83                 continue;
84             case 'l':
85                 ++lflag;
86                 continue;
87             case 'p':
88                 ++pflag;        /* chpass-tickets */
89                 lifetime = CHPASSLIFE;
90                 break;
91             default:
92                 usage();
93             }
94     }
95     if (username &&
96         (k_errno = kname_parse(aname, inst, realm, username)) != KSUCCESS) {
97         warnx("%s", krb_get_err_text(k_errno));
98         iflag = rflag = 1;
99         username = NULL;
100     }
101     if (gethostname(buf, MaxHostNameLen)) 
102         err(1, "gethostname failed");
103     printf("%s (%s)\n", ORGANIZATION, buf);
104     if (username) {
105         printf("Kerberos Initialization for \"%s", aname);
106         if (*inst)
107             printf(".%s", inst);
108         if (*realm)
109             printf("@%s", realm);
110         printf("\"\n");
111     } else {
112         printf("Kerberos Initialization\n");
113         printf("Kerberos name: ");
114         get_input(name, sizeof(name), stdin);
115         if (!*name)
116             return 0;
117         if ((k_errno = kname_parse(aname, inst, realm, name)) != KSUCCESS )
118             errx(1, "%s", krb_get_err_text(k_errno));
119     }
120     /* optional instance */
121     if (iflag) {
122         printf("Kerberos instance: ");
123         get_input(inst, sizeof(inst), stdin);
124         if (!k_isinst(inst))
125             errx(1, "bad Kerberos instance format");
126     }
127     if (rflag) {
128         printf("Kerberos realm: ");
129         get_input(realm, sizeof(realm), stdin);
130         if (!k_isrealm(realm))
131             errx(1, "bad Kerberos realm format");
132     }
133     if (lflag) {
134          printf("Kerberos ticket lifetime (minutes): ");
135          get_input(buf, sizeof(buf), stdin);
136          lifetime = atoi(buf);
137          if (lifetime < 5)
138               lifetime = 1;
139          else
140               lifetime = krb_time_to_life(0, lifetime*60);
141          /* This should be changed if the maximum ticket lifetime */
142          /* changes */
143          if (lifetime > 255)
144               lifetime = 255;
145     }
146     if (!*realm && krb_get_lrealm(realm, 1))
147         errx(1, "krb_get_lrealm failed");
148     k_errno = krb_get_pw_in_tkt(aname, inst, realm,
149                                 pflag ? PWSERV_NAME : 
150                                 KRB_TICKET_GRANTING_TICKET,
151                                 pflag ? KADM_SINST  : realm,
152                                 lifetime, 0);
153     if (vflag) {
154         printf("Kerberos realm %s:\n", realm);
155         printf("%s\n", krb_get_err_text(k_errno));
156     } else if (k_errno)
157         errx(1, "%s", krb_get_err_text(k_errno));
158     exit(0);
159 }