xref: /openbsd/usr.bin/passwd/passwd.c (revision f2dfb0a4)
1 /*	$OpenBSD: passwd.c,v 1.7 1998/01/20 15:32:21 art Exp $	*/
2 
3 /*
4  * Copyright (c) 1988 The Regents of the University of California.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *	This product includes software developed by the University of
18  *	California, Berkeley and its contributors.
19  * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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 #ifndef lint
37 char copyright[] =
38 "@(#) Copyright (c) 1988 The Regents of the University of California.\n\
39  All rights reserved.\n";
40 #endif /* not lint */
41 
42 #ifndef lint
43 /*static char sccsid[] = "from: @(#)passwd.c	5.5 (Berkeley) 7/6/91";*/
44 static char rcsid[] = "$OpenBSD: passwd.c,v 1.7 1998/01/20 15:32:21 art Exp $";
45 #endif /* not lint */
46 
47 #include <stdio.h>
48 #include <string.h>
49 #include <unistd.h>
50 #ifdef KERBEROS
51 #include <kerberosIV/krb.h>
52 #endif
53 
54 /*
55  * Note on configuration:
56  *      Generally one would not use both Kerberos and YP
57  *      to maintain passwords.
58  *
59  */
60 
61 int use_kerberos;
62 int use_yp;
63 
64 #ifdef YP
65 int force_yp;
66 #endif
67 
68 
69 extern int local_passwd(char *);
70 extern int yp_passwd(char *);
71 extern int krb_passwd(int, char **);
72 void usage(void);
73 
74 
75 int
76 main(argc, argv)
77 	int argc;
78 	char **argv;
79 {
80 	extern int optind;
81 	register int ch;
82 	char *username;
83 	int status = 0;
84 #if defined(KERBEROS) || defined(KERBEROS5)
85 	extern char realm[];
86 
87 	if (krb_get_lrealm(realm,1) == KSUCCESS)
88 		use_kerberos = 1;
89 #endif
90 #ifdef	YP
91 	use_yp = _yp_check(NULL);
92 #endif
93 
94 	/* Process args and options */
95 	while ((ch = getopt(argc, argv, "lyk")) != -1)
96 		switch (ch) {
97 		case 'l':		/* change local password file */
98 			use_kerberos = 0;
99 			use_yp = 0;
100 			break;
101 		case 'k':		/* change Kerberos password */
102 #if defined(KERBEROS) || defined(KERBEROS5)
103 			use_kerberos = 1;
104 			use_yp = 0;
105 			exit(krb_passwd(argc, argv));
106 			break;
107 #else
108 			fprintf(stderr, "passwd: Kerberos not compiled in\n");
109 			exit(1);
110 #endif
111 		case 'y':		/* change YP password */
112 #ifdef	YP
113 			if (!use_yp) {
114 				fprintf(stderr, "passwd: YP not in use.\n");
115 				exit(1);
116 			}
117 			use_kerberos = 0;
118 			use_yp = 1;
119 			force_yp = 1;
120 			break;
121 #else
122 			fprintf(stderr, "passwd: YP not compiled in\n");
123 			exit(1);
124 #endif
125 		default:
126 			usage();
127 			exit(1);
128 		}
129 
130 	argc -= optind;
131 	argv += optind;
132 
133 	username = getlogin();
134 	if (username == NULL) {
135 		fprintf(stderr, "passwd: who are you ??\n");
136 		exit(1);
137 	}
138 
139 	switch(argc) {
140 	case 0:
141 		break;
142 	case 1:
143 #if defined(KERBEROS) || defined(KERBEROS5)
144 	    if (use_kerberos && strcmp(argv[0], username)) {
145 		(void)fprintf(stderr, "passwd: %s\n\t%s\n%s\n",
146 			      "to change another user's Kerberos password, do",
147 			      "\"passwd -k -u <user>\";",
148 			      "to change a user's local passwd, use \"passwd -l <user>\"");
149 		exit(1);
150 	    }
151 #endif
152 		username = argv[0];
153 		break;
154 	default:
155 		usage();
156 		exit(1);
157 	}
158 
159 #if defined(KERBEROS) || defined(KERBEROS5)
160         if (use_kerberos)
161                 exit(krb_passwd(argc, argv));
162 #endif
163 
164 #ifdef	YP
165 	if (force_yp || ((status = local_passwd(username)) && use_yp))
166 		exit(yp_passwd(username));
167 	exit(status);
168 #endif
169 	exit(local_passwd(username));
170 }
171 
172 void
173 usage(void)
174 {
175 	fprintf(stderr, "usage: passwd [-l] [-y] [-k [-n name] [-i instance] [-r realm] [-u username[.instance][@realm]] [user]\n");
176 }
177