1 /* 2 * Copyright (c) 1988, 1993, 1994 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34 #ifndef lint 35 static char copyright[] = 36 "@(#) Copyright (c) 1988, 1993, 1994\n\ 37 The Regents of the University of California. All rights reserved.\n"; 38 #endif /* not lint */ 39 40 #ifndef lint 41 static char sccsid[] = "From: @(#)passwd.c 8.3 (Berkeley) 4/2/94"; 42 static const char rcsid[] = 43 "$Id: passwd.c,v 1.5 1995/08/13 16:07:35 wpaul Exp $"; 44 #endif /* not lint */ 45 46 #include <err.h> 47 #include <errno.h> 48 #include <stdio.h> 49 #include <stdlib.h> 50 #include <unistd.h> 51 52 #ifdef YP 53 #include <pwd.h> 54 #include <pw_yp.h> 55 char *prog_name; 56 int __use_yp = 0; 57 #endif 58 59 #ifdef KERBEROS 60 #include "krb.h" 61 #endif 62 63 #include "extern.h" 64 65 void usage __P((void)); 66 67 int use_local_passwd = 0; 68 69 int 70 main(argc, argv) 71 int argc; 72 char **argv; 73 { 74 int ch; 75 char *uname; 76 char *iflag = 0, *rflag = 0, *uflag = 0; 77 78 #ifdef YP 79 #ifdef KERBEROS 80 char realm[REALM_SZ]; 81 #define OPTIONS "lysfi:r:u:" 82 #else 83 #define OPTIONS "lysf" 84 #endif 85 #else 86 #ifdef KERBEROS 87 char realm[REALM_SZ]; 88 #define OPTIONS "li:r:u:" 89 #else 90 #define OPTIONS "l" 91 #endif 92 #endif 93 94 #ifdef YP 95 int res = 0; 96 97 if (strstr(argv[0], (prog_name = "yppasswd"))) __use_yp = 1; 98 #endif 99 100 while ((ch = getopt(argc, argv, OPTIONS)) != EOF) { 101 switch (ch) { 102 case 'l': /* change local password file */ 103 use_local_passwd = 1; 104 break; 105 #ifdef KERBEROS 106 case 'i': 107 iflag = optarg; 108 break; 109 case 'r': 110 rflag = optarg; 111 break; 112 case 'u': 113 uflag = optarg; 114 break; 115 #endif /* KERBEROS */ 116 #ifdef YP 117 case 'y': /* Change NIS password */ 118 __use_yp = 1; 119 break; 120 #endif 121 default: 122 case '?': 123 usage(); 124 } 125 } 126 127 argc -= optind; 128 argv += optind; 129 130 if ((uname = getlogin()) == NULL) 131 err(1, "getlogin"); 132 133 switch(argc) { 134 case 0: 135 break; 136 case 1: 137 uname = argv[0]; 138 break; 139 default: 140 usage(); 141 } 142 143 #ifdef YP 144 /* 145 * If NIS is turned on in the password database, use it, else punt. 146 */ 147 #ifdef KERBEROS 148 if (__use_yp || (iflag == NULL && rflag == NULL && uflag == NULL)) { 149 #endif 150 res = use_yp(uname); 151 if (res == USER_YP_ONLY) { 152 if (!use_local_passwd) { 153 exit(yp_passwd(uname)); 154 } else { 155 /* 156 * Reject -l flag if NIS is turned on and the user 157 * doesn't exist in the local password database. 158 */ 159 errx(1, "unknown local user: %s.", uname); 160 } 161 } else if (res == USER_LOCAL_ONLY) { 162 /* 163 * Reject -y flag if user only exists locally. 164 */ 165 if (__use_yp) 166 errx(1, "unknown NIS user: %s.", uname); 167 } else if (res == USER_YP_AND_LOCAL) { 168 if (!use_local_passwd) 169 exit(yp_passwd(uname)); 170 } 171 #ifdef KERBEROS 172 } 173 #endif 174 #endif 175 176 if (!use_local_passwd) { 177 #ifdef KERBEROS 178 if(krb_get_lrealm(realm, 0) == KSUCCESS) { 179 fprintf(stderr, "realm %s\n", realm); 180 exit(krb_passwd(argv[0], iflag, rflag, uflag)); 181 } 182 #endif 183 } 184 exit(local_passwd(uname)); 185 } 186 187 void 188 usage() 189 { 190 191 #ifdef YP 192 #ifdef KERBEROS 193 fprintf(stderr, 194 "usage: passwd [-l] [-i instance] [-r realm] [-u fullname]\n"); 195 fprintf(stderr, 196 " [-l] [-y] [user]\n"); 197 #else 198 (void)fprintf(stderr, "usage: passwd [-l] [-y] [user] \n"); 199 #endif 200 #else 201 #ifdef KERBEROS 202 fprintf(stderr, 203 "usage: passwd [-l] [-i instance] [-r realm] [-u fullname] [user]\n"); 204 #else 205 (void)fprintf(stderr, "usage: passwd user\n"); 206 #endif 207 #endif 208 exit(1); 209 } 210