annotate usr/src/cmd/passwd/passwd.c @ 108:55ad989fc90b

6271160 gcc and cmd/groups don't get along 6271163 gcc and cmd/grpck don't get along 6272057 gcc and cmd/oamuser don't get along 6272073 gcc and cmd/passmgmt don't get along 6272075 gcc and cmd/passwd don't get along 6272665 gcc and cmd/pwck don't get along 6272669 gcc and cmd/pwconv don't get along
author basabi
date Wed, 29 Jun 2005 19:06:58 -0700
parents 68f95e015346
children daa9de9e340c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
2 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
3 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
4 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
5 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
6 * (the "License"). You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
7 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
8 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
10 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
11 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
12 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
13 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
14 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
16 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
17 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
18 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
19 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
20 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
21 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
22 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
24 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
25 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
28 /* All Rights Reserved */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
29
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
30 /* Copyright (c) 1987, 1988 Microsoft Corporation */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
31 /* All Rights Reserved */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
32
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
33 #pragma ident "%Z%%M% %I% %E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
34
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
35 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
36 * passwd is a program whose sole purpose is to manage
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
37 * the password file, map, or table. It allows system administrator
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
38 * to add, change and display password attributes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
39 * Non privileged user can change password or display
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
40 * password attributes which corresponds to their login name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
41 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
42
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
43 #include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
44 #include <pwd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
45 #include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
46 #include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
47 #include <unistd.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
48 #include <stdlib.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
49 #include <locale.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
50 #include <stdarg.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
51 #include <errno.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
52 #include <string.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
53 #include <security/pam_appl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
54 #include <security/pam_modules.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
55 #include <security/pam_impl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
56 #include <rpcsvc/nis.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
57 #undef GROUP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
58 #include <syslog.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
59 #include <userdefs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
60 #include <passwdutil.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
61
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
62 #include <nss_dbdefs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
64 #include <deflt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
65
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
66 #undef GROUP
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
67 #include <bsm/adt.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
68 #include <bsm/adt_event.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
69
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
70 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
71 * flags indicate password attributes to be modified
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
72 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
73
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
74 #define LFLAG 0x001 /* lock user's password */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
75 #define DFLAG 0x002 /* delete user's password */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
76 #define MFLAG 0x004 /* set max field -- # of days passwd is valid */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
77 #define NFLAG 0x008 /* set min field -- # of days between */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
78 /* password changes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
79 #define SFLAG 0x010 /* display password attributes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
80 #define FFLAG 0x020 /* expire user's password */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
81 #define AFLAG 0x040 /* display password attributes for all users */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
82 #define SAFLAG (SFLAG|AFLAG) /* display password attributes for all users */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
83 #define WFLAG 0x100 /* warn user to change passwd */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
84 #define OFLAG 0x200 /* domain name */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
85 #define EFLAG 0x400 /* change shell */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
86 #define GFLAG 0x800 /* change gecos information */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
87 #define HFLAG 0x1000 /* change home directory */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
88 #define XFLAG 0x2000 /* no login */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
89 #define UFLAG 0x4000 /* unlock user's password */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
91 #define NONAGEFLAG (EFLAG | GFLAG | HFLAG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
92 #define AGEFLAG (LFLAG | FFLAG | MFLAG | NFLAG | WFLAG | XFLAG | UFLAG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
93 #define MUTEXFLAG (DFLAG | LFLAG | XFLAG | UFLAG | SAFLAG)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
94
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
96 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
97 * exit code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
98 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
99
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
100 #define SUCCESS 0 /* succeeded */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
101 #define NOPERM 1 /* No permission */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
102 #define BADOPT 2 /* Invalid combination of option */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
103 #define FMERR 3 /* File/table manipulation error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
104 #define FATAL 4 /* Old file/table can not be recovered */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
105 #define FBUSY 5 /* Lock file/table busy */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
106 #define BADSYN 6 /* Incorrect syntax */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
107 #define BADAGE 7 /* Aging is disabled */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
108 #define NOMEM 8 /* No memory */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
109 #define SYSERR 9 /* System error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
110 #define EXPIRED 10 /* Account expired */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
111
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
112 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
113 * define error messages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
114 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
115 #define MSG_NP "Permission denied"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
116 #define MSG_BS "Invalid combination of options"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
117 #define MSG_FE "Unexpected failure. Password file/table unchanged."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
118 #define MSG_FF "Unexpected failure. Password file/table missing."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
119 #define MSG_FB "Password file/table busy. Try again later."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
120 #define MSG_NV "Invalid argument to option"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
121 #define MSG_AD "Password aging is disabled"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
122 #define MSG_RS "Cannot change from restricted shell %s\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
123 #define MSG_NM "Out of memory."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
124 #define MSG_UNACCEPT "%s is unacceptable as a new shell\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
125 #define MSG_UNAVAIL "warning: %s is unavailable on this machine\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
126 #define MSG_COLON "':' is not allowed.\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
127 #define MSG_MAXLEN "Maximum number of characters allowed is %d."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
128 #define MSG_CONTROL "Control characters are not allowed.\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
129 #define MSG_SHELL_UNCHANGED "Login shell unchanged.\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
130 #define MSG_GECOS_UNCHANGED "Finger information unchanged.\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
131 #define MSG_DIR_UNCHANGED "Homedir information unchanged.\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
132 #define MSG_NAME "\nName [%s]: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
133 #define MSG_HOMEDIR "\nHome Directory [%s]: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
134 #define MSG_OLDSHELL "Old shell: %s\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
135 #define MSG_NEWSHELL "New shell: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
136 #define MSG_AGAIN "\nPlease try again\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
137 #define MSG_INPUTHDR "Default values are printed inside of '[]'.\n" \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
138 "To accept the default, type <return>.\n" \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
139 "To have a blank entry, type the word 'none'.\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
140 #define MSG_UNKNOWN "%s: User unknown: %s\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
141 #define MSG_ACCOUNT_EXP "User account has expired: %s\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
142 #define MSG_AUTHTOK_EXP "Your password has been expired for too long.\n" \
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
143 "Please contact the system administrator.\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
144 #define MSG_NIS_HOMEDIR "-h does not apply to NIS"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
145 #define MSG_CUR_PASS "Enter existing login password: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
146 #define MSG_CUR_PASS_UNAME "Enter %s's existing login password: "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
147 #define MSG_SUCCESS "%s: password information changed for %s\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
148 #define MSG_SORRY "%s: Sorry, wrong passwd\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
149 #define MSG_INFO "%s: Changing password for %s\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
152 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
153 * return code from ckarg() routine
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
154 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
155 #define FAIL -1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
156
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
157 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
158 * defind password file name
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
159 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
160 #define PASSWD "/etc/passwd"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
161
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
162 #define MAX_INPUT_LEN 512
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
164 #define DEF_ATTEMPTS 3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
166 /* Number of characters in that make up an encrypted password (for now) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
167 #define NUMCP 13
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
168
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
169 #ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
170 #define dprintf1 printf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
171 #else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
172 #define dprintf1(w, x)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
173 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
174
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
175 extern int optind;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
177 static int retval = SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
178 static int pam_retval = PAM_SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
179 static uid_t uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
180 static char *prognamep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
181 static long maxdate; /* password aging information */
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
182 static int passwd_conv(int, struct pam_message **,
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
183 struct pam_response **, void *);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
184 static struct pam_conv pam_conv = {passwd_conv, NULL};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
185 static pam_handle_t *pamh; /* Authentication handle */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
186 static char *usrname; /* user whose attribute we update */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
187 static adt_session_data_t *ah; /* audit session handle */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
188 static adt_event_data_t *event = NULL; /* event to be generated */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
189
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
190 static pam_repository_t auth_rep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
191 static pwu_repository_t repository;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
192 static pwu_repository_t __REPFILES = { "files", NULL, 0 };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
194 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
195 * Function Declarations
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
196 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
197 extern nis_name nis_local_directory(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
199 extern void setusershell(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
200 extern char *getusershell(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
201 extern void endusershell(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
202
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
203 static void passwd_exit(int retcode) __NORETURN;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
204 static void rusage(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
205 static int ckuid(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
206 static int ckarg(int argc, char **argv, attrlist **attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
207
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
208 static int get_namelist(pwu_repository_t, char ***, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
209 static int get_namelist_files(char ***, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
210 static int get_namelist_nisplus(char ***, int *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
211 static int get_attr(char *, pwu_repository_t *, attrlist **);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
212 static void display_attr(char *, attrlist *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
213 static void free_attr(attrlist *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
214 static void attrlist_add(attrlist **, attrtype, char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
215 static void attrlist_reorder(attrlist **);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
216 static char *userinput(char *, pwu_repository_t *, attrtype);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
217 static char *getresponse(char *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
219 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
220 * main():
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
221 * The main routine will call ckarg() to parse the command line
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
222 * arguments and call the appropriate functions to perform the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
223 * tasks specified by the arguments. It allows system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
224 * administrator to add, change and display password attributes.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
225 * Non privileged user can change password or display
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
226 * password attributes which corresponds to their login name.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
227 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
228
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
229 int
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
230 main(int argc, char *argv[])
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
231 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
233 int flag;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
234 char **namelist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
235 int num_user;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
236 int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
237 attrlist *attributes = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
238 char *input;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
239 int tries = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
240 int updated_reps;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
242
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
243 if (prognamep = strrchr(argv[0], '/'))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
244 ++prognamep;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
245 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
246 prognamep = argv[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
248 auth_rep.type = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
249 auth_rep.scope = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
250 repository.type = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
251 repository.scope = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
252 repository.scope_len = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
254
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
255 /* initialization for variables, set locale and textdomain */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
256 i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
257 flag = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
258
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
259 uid = getuid(); /* get the user id */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
260 (void) setlocale(LC_ALL, "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
262 #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
263 #define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
264 #endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
265 (void) textdomain(TEXT_DOMAIN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
267 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
268 * ckarg() parses the arguments. In case of an error,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
269 * it sets the retval and returns FAIL (-1).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
270 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
271
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
272 flag = ckarg(argc, argv, &attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
273 dprintf1("flag is %0x\n", flag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
274 if (flag == FAIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
275 passwd_exit(retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
277 argc -= optind;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
278
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
279 if (argc < 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
280 if ((usrname = getlogin()) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
281 struct passwd *pass = getpwuid(uid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
282 if (pass != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
283 usrname = pass->pw_name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
284 else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
285 rusage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
286 exit(NOPERM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
287 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
288 } else if (flag == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
289 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
290 * If flag is zero, change passwd.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
291 * Otherwise, it will display or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
292 * modify password aging attributes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
293 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
294 (void) fprintf(stderr, gettext(MSG_INFO), prognamep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
295 usrname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
296 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
297 } else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
298 usrname = argv[optind];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
300 if (pam_start("passwd", usrname, &pam_conv, &pamh) != PAM_SUCCESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
301 passwd_exit(NOPERM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
302
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
303 auth_rep.type = repository.type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
304 auth_rep.scope = repository.scope;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
305 auth_rep.scope_len = repository.scope_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
306
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
307 if (auth_rep.type != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
308 if (pam_set_item(pamh, PAM_REPOSITORY, (void *)&auth_rep)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
309 != PAM_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
310 passwd_exit(NOPERM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
311 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
312 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
314 if (flag == SAFLAG) { /* display password attributes for all users */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
315 retval = get_namelist(repository, &namelist, &num_user);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
316 if (retval != SUCCESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
317 (void) passwd_exit(retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
319 if (num_user == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
320 (void) fprintf(stderr, "%s: %s\n", prognamep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
321 gettext(MSG_FF));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
322 passwd_exit(FATAL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
323 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
324 i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
325 while (namelist[i] != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
326 (void) get_attr(namelist[i], &repository,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
327 &attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
328 (void) display_attr(namelist[i], attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
329 (void) free(namelist[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
330 (void) free_attr(attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
331 i++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
332 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
333 (void) free(namelist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
334 passwd_exit(SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
335 } else if (flag == SFLAG) { /* display password attributes by user */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
336 if (get_attr(usrname, &repository, &attributes) ==
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
337 PWU_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
338 (void) display_attr(usrname, attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
339 (void) free_attr(attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
340 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
341 passwd_exit(SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
342 /* NOT REACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
343 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
345
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
346 switch (pam_authenticate(pamh, 0)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
347 case PAM_SUCCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
348 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
349 case PAM_USER_UNKNOWN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
350 (void) fprintf(stderr, gettext(MSG_UNKNOWN), prognamep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
351 usrname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
352 passwd_exit(NOPERM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
353 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
354 case PAM_PERM_DENIED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
355 passwd_exit(NOPERM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
356 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
357 case PAM_AUTH_ERR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
358 (void) fprintf(stderr, gettext(MSG_SORRY), prognamep);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
359 passwd_exit(NOPERM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
360 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
361 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
362 /* system error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
363 passwd_exit(FMERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
364 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
365 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
367 if (flag == 0) { /* changing user password */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
368 int chk_authtok = 0; /* check password strength */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
370 dprintf1("call pam_chauthtok() repository name =%s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
371 repository.type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
372
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
373 /* Set up for Audit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
374 if (adt_start_session(&ah, NULL, ADT_USE_PROC_DATA) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
375 perror("adt_start_session");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
376 passwd_exit(SYSERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
377 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
378 if ((event = adt_alloc_event(ah, ADT_passwd)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
379 perror("adt_alloc_event");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
380 passwd_exit(NOMEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
381 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
382 if (argc >= 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
383 /* save target user */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
384 event->adt_passwd.username = usrname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
385 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
386
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
387 /* Don't check account expiration when invoked by root */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
388 if (ckuid() != SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
389 pam_retval = pam_acct_mgmt(pamh, PAM_SILENT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
390 switch (pam_retval) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
391 case PAM_ACCT_EXPIRED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
392 (void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
393 gettext(MSG_ACCOUNT_EXP), usrname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
394 passwd_exit(EXPIRED);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
395 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
396 case PAM_AUTHTOK_EXPIRED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
397 (void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
398 gettext(MSG_AUTHTOK_EXP));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
399 passwd_exit(NOPERM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
400 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
401 case PAM_NEW_AUTHTOK_REQD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
402 /* valid error when changing passwords */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
403 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
404 case PAM_SUCCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
405 /* Ok to change password */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
406 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
407 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
408 passwd_exit(NOPERM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
409 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
410 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
411
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
413 pam_retval = PAM_AUTHTOK_ERR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
414 tries = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
415 if (ckuid() == SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
416 /* bypass password strength checks */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
417 chk_authtok = PAM_NO_AUTHTOK_CHECK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
418 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
419
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
420 while (pam_retval == PAM_AUTHTOK_ERR && tries <= DEF_ATTEMPTS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
421 if (tries > 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
422 (void) printf(gettext(MSG_AGAIN));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
423 pam_retval = pam_chauthtok(pamh, chk_authtok);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
424 if (pam_retval == PAM_TRY_AGAIN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
425 (void) sleep(1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
426 pam_retval = pam_chauthtok(pamh, chk_authtok);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
427 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
428 tries++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
429 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
430
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
431 switch (pam_retval) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
432 case PAM_SUCCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
433 retval = SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
434 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
435 case PAM_AUTHTOK_DISABLE_AGING:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
436 retval = BADAGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
437 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
438 case PAM_AUTHTOK_LOCK_BUSY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
439 retval = FBUSY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
440 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
441 case PAM_TRY_AGAIN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
442 retval = FBUSY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
443 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
444 case PAM_AUTHTOK_ERR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
445 case PAM_AUTHTOK_RECOVERY_ERR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
446 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
447 retval = NOPERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
448 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
449 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
450
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
451 (void) passwd_exit(retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
452 /* NOT REACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
453 } else { /* changing attributes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
454 switch (flag) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
455 case EFLAG: /* changing user password attributes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
456 input = userinput(usrname, &repository, ATTR_SHELL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
457 if (input)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
458 attrlist_add(&attributes, ATTR_SHELL, input);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
459 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
460 (void) printf(gettext(MSG_SHELL_UNCHANGED));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
461 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
462 case GFLAG:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
463 input = userinput(usrname, &repository, ATTR_GECOS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
464 if (input)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
465 attrlist_add(&attributes, ATTR_GECOS, input);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
466 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
467 (void) printf(gettext(MSG_GECOS_UNCHANGED));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
468 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
469 case HFLAG:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
470 input = userinput(usrname, &repository, ATTR_HOMEDIR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
471 if (input)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
472 attrlist_add(&attributes, ATTR_HOMEDIR, input);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
473 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
474 (void) printf(gettext(MSG_DIR_UNCHANGED));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
475 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
476 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
477
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
478 if (attributes != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
479 retval = __set_authtoken_attr(usrname,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
480 pamh->ps_item[PAM_AUTHTOK].pi_addr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
481 NULL, &repository, attributes, &updated_reps);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
482 switch (retval) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
483 case PWU_SUCCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
484 for (i = 1; i <= REP_LAST; i <<= 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
485 if ((updated_reps & i) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
486 continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
487 (void) printf(gettext(MSG_SUCCESS),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
488 prognamep, usrname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
489 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
490 retval = SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
491 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
492 case PWU_AGING_DISABLED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
493 retval = BADAGE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
494 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
495 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
496 retval = NOPERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
497 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
498 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
499 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
500 retval = SUCCESS; /* nothing to change won't fail */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
501 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
502 (void) passwd_exit(retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
503 }
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
504 /* NOTREACHED */
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
505 return (0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
506 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
507
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
508 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
509 * Get a line of input from the user.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
510 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
511 * If the line is empty, or the input equals 'oldval', NULL is returned.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
512 * therwise, a malloced string containing the input (minus the trailing
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
513 * newline) is returned.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
514 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
515 char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
516 getresponse(char *oldval)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
517 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
518 char resp[MAX_INPUT_LEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
519 char *retval = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
520 int resplen;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
521
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
522 (void) fgets(resp, sizeof (resp) - 1, stdin);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
523 resplen = strlen(resp) - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
524 if (resp[resplen] == '\n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
525 resp[resplen] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
526 if (*resp != '\0' && strcmp(resp, oldval) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
527 retval = strdup(resp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
528 return (retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
529 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
530
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
531 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
532 * char *userinput(item)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
533 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
534 * user conversation function. The old value of attribute "item" is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
535 * displayed while the user is asked to provide a new value.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
536 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
537 * returns a malloc()-ed string if the user actualy provided input
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
538 * or NULL if the user simply hit return or the input equals the old
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
539 * value (not changed).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
540 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
541 char *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
542 userinput(char *name, pwu_repository_t *rep, attrtype type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
543 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
544 attrlist oldattr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
545 char *oldval; /* shorthand for oldattr.data.val_s */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
546 char *valid; /* points to valid shells */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
547 char *response;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
548 char *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
549
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
550 oldattr.type = type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
551 oldattr.next = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
552
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
553 if (__get_authtoken_attr(name, rep, &oldattr) != PWU_SUCCESS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
554 passwd_exit(FMERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
555
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
556 oldval = oldattr.data.val_s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
558 if (type == ATTR_SHELL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
559 /* No current shell: set DEFSHL as default choice */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
560 if (*oldval == '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
561 free(oldval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
562 oldval = strdup(DEFSHL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
563 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
564
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
565 if (ckuid() != SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
566 /* User must currently have a valid shell */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
567 setusershell();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
568 valid = getusershell();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
569 while (valid && strcmp(valid, oldval) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
570 valid = getusershell();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
571 endusershell();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
572
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
573 if (valid == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
574 (void) fprintf(stderr, gettext(MSG_RS), oldval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
575 free(oldval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
576 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
577 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
578 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
579 (void) printf(gettext(MSG_OLDSHELL), oldval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
580 (void) printf(gettext(MSG_NEWSHELL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
581 (void) fflush(stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
582
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
583 response = getresponse(oldval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
584 free(oldval); /* We don't need the old value anymore */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
585
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
586 if (response == NULL || *response == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
587 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
588
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
589 /* Make sure new shell is listed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
590 setusershell();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
591 valid = getusershell();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
592 while (valid) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
593 char *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
594
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
595 /* Allow user to give shell without path */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
596 if (*response == '/') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
597 cp = valid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
598 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
599 if ((cp = strrchr(valid, '/')) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
600 cp = valid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
601 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
602 cp++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
603 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
604 if (strcmp(cp, response) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
605 if (*response != '/') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
606 /* take shell name including path */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
607 free(response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
608 response = strdup(valid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
609 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
610 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
611 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
612 valid = getusershell();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
613 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
614 endusershell();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
615
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
616 if (valid == NULL) { /* No valid shell matches */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
617 (void) fprintf(stderr, gettext(MSG_UNACCEPT), response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
618 return (NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
619 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
621 if (access(response, X_OK) < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
622 (void) fprintf(stderr, gettext(MSG_UNAVAIL), response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
623 return (response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
624 /* NOT REACHED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
625 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
626 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
627 * if type == SHELL, we have returned by now. Only GECOS and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
628 * HOMEDIR get to this point.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
629 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
630 (void) printf(gettext(MSG_INPUTHDR));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
632 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
633 * PRE: oldval points to malloced string with Old Value
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
634 * INV: oldval remains unchanged
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
635 * POST:response points to valid string or NULL.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
636 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
637 for (;;) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
638 if (type == ATTR_GECOS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
639 (void) printf(gettext(MSG_NAME), oldval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
640 else if (type == ATTR_HOMEDIR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
641 (void) printf(gettext(MSG_HOMEDIR), oldval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
643 response = getresponse(oldval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
644
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
645 if (response && strcmp(response, "none") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
646 *response = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
647
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
648 /* No-change or empty string are OK */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
649 if (response == NULL || *response == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
650 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
651
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
652 /* Check for illegal characters */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
653 if (strchr(response, ':')) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
654 (void) fprintf(stderr, "%s", gettext(MSG_COLON));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
655 free(response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
656 } else if (strlen(response) > MAX_INPUT_LEN - 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
657 (void) fprintf(stderr, gettext(MSG_MAXLEN),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
658 MAX_INPUT_LEN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
659 free(response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
660 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
661 /* don't allow control characters */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
662 for (cp = response; *cp >= 040; cp++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
663 ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
664 if (*cp != '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
665 (void) fprintf(stderr, gettext(MSG_CONTROL));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
666 free(response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
667 } else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
668 break; /* response is a valid string */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
669 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
670 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
671 * We only get here if the input was invalid.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
672 * In that case, we again ask the user for input.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
673 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
674 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
675 free(oldval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
676 return (response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
677 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
678 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
679 * ckarg():
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
680 * This function parses and verifies the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
681 * arguments. It takes three parameters:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
682 * argc => # of arguments
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
683 * argv => pointer to an argument
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
684 * attrlist => pointer to list of password attributes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
685 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
686
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
687 static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
688 ckarg(int argc, char **argv, attrlist **attributes)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
689 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
690 extern char *optarg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
691 char *char_p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
692 int opt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
693 int flag;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
694
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
695 flag = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
696
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
697 while ((opt = getopt(argc, argv, "r:aldefghsux:n:w:D:N")) != EOF) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
698 switch (opt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
699
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
700 case 'r': /* Repository Specified */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
701 /* repository: this option should be specified first */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
702
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
703 if (repository.type != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
704 (void) fprintf(stderr, gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
705 "Repository is already defined or specified.\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
706 rusage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
707 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
708 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
709 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
710 if (strcmp(optarg, "nisplus") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
711 repository.type = optarg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
712 repository.scope = nis_local_directory();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
713 if (repository.scope != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
714 repository.scope_len =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
715 strlen(repository.scope)+ 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
716 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
717 } else if (strcmp(optarg, "nis") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
718 repository.type = optarg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
719 } else if (strcmp(optarg, "ldap") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
720 repository.type = optarg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
721 } else if (strcmp(optarg, "files") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
722 repository.type = optarg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
723 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
724 (void) fprintf(stderr,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
725 gettext("invalid repository: %s\n"),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
726 optarg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
727 rusage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
728 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
729 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
730 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
731 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
733 case 'd': /* Delete Auth Token */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
734 /* if no repository the default for -d is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
735 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
736 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
737
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
738 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
739 * Delete the password - only privileged processes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
740 * can execute this for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
741 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
742 if (IS_FILES(repository) == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
743 (void) fprintf(stderr, gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
744 "-d only applies to files repository\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
745 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
746 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
747 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
748 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
749
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
750 if (ckuid() != SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
751 retval = NOPERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
752 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
753 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
754 if (flag & (LFLAG|SAFLAG|DFLAG|XFLAG|UFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
755 rusage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
756 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
757 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
758 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
759 flag |= DFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
760 attrlist_add(attributes, ATTR_PASSWD, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
761 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
762
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
763 case 'N': /* set account to be "no login" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
764
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
765 /* if no repository the default for -N is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
766 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
767 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
768
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
769 if (IS_FILES(repository) == FALSE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
770 IS_NISPLUS(repository) == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
771 (void) fprintf(stderr, gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
772 "-N only applies to files or nisplus repository\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
773 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
774 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
775 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
776 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
777
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
778 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
779 * Only privileged processes can execute this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
780 * for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
781 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
782 if (IS_FILES(repository) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
783 ((retval = ckuid()) != SUCCESS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
784 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
785 if (flag & (MUTEXFLAG|NONAGEFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
786 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
787 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
788 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
789 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
790 flag |= XFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
791 attrlist_add(attributes, ATTR_NOLOGIN_ACCOUNT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
792 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
793
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
794 case 'l': /* lock the password */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
795
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
796 /* if no repository the default for -l is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
797 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
798 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
799
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
800 if (IS_FILES(repository) == FALSE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
801 IS_NISPLUS(repository) == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
802 (void) fprintf(stderr, gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
803 "-l only applies to files or nisplus repository\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
804 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
805 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
806 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
807 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
808
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
809 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
810 * Only privileged processes can execute this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
811 * for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
812 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
813 if (IS_FILES(repository) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
814 ((retval = ckuid()) != SUCCESS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
815 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
816 if (flag & (MUTEXFLAG|NONAGEFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
817 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
818 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
819 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
820 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
821 flag |= LFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
822 attrlist_add(attributes, ATTR_LOCK_ACCOUNT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
823 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
824
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
825 case 'u': /* unlock the password */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
826
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
827 /* if no repository the default for -u is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
828 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
829 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
830
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
831 if (IS_FILES(repository) == FALSE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
832 IS_NISPLUS(repository) == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
833 (void) fprintf(stderr, gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
834 "-u only applies to files or nisplus repository\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
835 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
836 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
837 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
838 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
839
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
840 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
841 * Only privileged processes can execute this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
842 * for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
843 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
844 if (IS_FILES(repository) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
845 ((retval = ckuid()) != SUCCESS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
846 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
847 if (flag & (MUTEXFLAG|NONAGEFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
848 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
849 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
850 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
851 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
852 flag |= UFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
853 attrlist_add(attributes, ATTR_UNLOCK_ACCOUNT, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
854 attrlist_add(attributes, ATTR_RST_FAILED_LOGINS, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
855 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
856
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
857 case 'x': /* set the max date */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
858
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
859 /* if no repository the default for -x is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
860 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
861 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
862
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
863 if (IS_FILES(repository) == FALSE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
864 IS_NISPLUS(repository) == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
865 (void) fprintf(stderr, gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
866 "-x only applies to files or nisplus repository\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
867 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
868 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
869 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
870 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
871
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
872 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
873 * Only privileged process can execute this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
874 * for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
875 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
876 if (IS_FILES(repository) && (ckuid() != SUCCESS)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
877 retval = NOPERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
878 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
879 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
880 if (flag & (SAFLAG|MFLAG|NONAGEFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
881 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
882 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
883 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
884 flag |= MFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
885 if ((int)strlen(optarg) <= 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
886 (maxdate = strtol(optarg, &char_p, 10)) < -1 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
887 *char_p != '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
888 (void) fprintf(stderr, "%s: %s -x\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
889 prognamep, gettext(MSG_NV));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
890 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
891 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
892 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
893 attrlist_add(attributes, ATTR_MAX, optarg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
894 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
895
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
896 case 'n': /* set the min date */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
897
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
898 /* if no repository the default for -n is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
899 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
900 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
901
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
902 if (IS_FILES(repository) == FALSE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
903 IS_NISPLUS(repository) == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
904 (void) fprintf(stderr, gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
905 "-n only applies to files or nisplus repository\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
906 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
907 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
908 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
909 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
910
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
911 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
912 * Only privileged process can execute this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
913 * for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
914 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
915 if (IS_FILES(repository) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
916 ((retval = ckuid()) != SUCCESS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
917 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
918 if (flag & (SAFLAG|NFLAG|NONAGEFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
919 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
920 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
921 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
922 flag |= NFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
923 if ((int)strlen(optarg) <= 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
924 (strtol(optarg, &char_p, 10)) < 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
925 *char_p != '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
926 (void) fprintf(stderr, "%s: %s -n\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
927 prognamep, gettext(MSG_NV));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
928 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
929 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
930 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
931 attrlist_add(attributes, ATTR_MIN, optarg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
932 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
933
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
934 case 'w': /* set the warning field */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
935
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
936 /* if no repository the default for -w is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
937 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
938 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
939
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
940 if (IS_FILES(repository) == FALSE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
941 IS_NISPLUS(repository) == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
942 (void) fprintf(stderr, gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
943 "-w only applies to files or nisplus repository\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
944 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
945 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
946 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
947 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
948
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
949 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
950 * Only privileged process can execute this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
951 * for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
952 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
953 if (IS_FILES(repository) && (ckuid() != SUCCESS)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
954 retval = NOPERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
955 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
956 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
957 if (flag & (SAFLAG|WFLAG|NONAGEFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
958 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
959 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
960 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
961 flag |= WFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
962 if ((int)strlen(optarg) <= 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
963 (strtol(optarg, &char_p, 10)) < 0 ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
964 *char_p != '\0') {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
965 (void) fprintf(stderr, "%s: %s -w\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
966 prognamep, gettext(MSG_NV));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
967 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
968 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
969 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
970 attrlist_add(attributes, ATTR_WARN, optarg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
971 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
972
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
973 case 's': /* display password attributes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
974
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
975 /* if no repository the default for -s is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
976 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
977 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
978
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
979
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
980 /* display password attributes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
981 if (IS_FILES(repository) == FALSE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
982 IS_NISPLUS(repository) == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
983 (void) fprintf(stderr, gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
984 "-s only applies to files or nisplus repository\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
985 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
986 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
987 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
988 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
989
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
990 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
991 * Only privileged process can execute this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
992 * for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
993 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
994 if (IS_FILES(repository) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
995 ((retval = ckuid()) != SUCCESS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
996 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
997 if (flag && (flag != AFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
998 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
999 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1000 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1001 flag |= SFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1002 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1003
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1004 case 'a': /* display password attributes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1005
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1006 /* if no repository the default for -a is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1007 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1008 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1009
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1010 if (IS_FILES(repository) == FALSE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1011 IS_NISPLUS(repository) == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1012 (void) fprintf(stderr, gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1013 "-a only applies to files or nisplus repository\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1014 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1015 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1016 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1017 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1018
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1019 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1020 * Only privileged process can execute this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1021 * for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1022 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1023 if (IS_FILES(repository) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1024 ((retval = ckuid()) != SUCCESS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1025 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1026 if (flag && (flag != SFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1027 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1028 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1029 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1030 flag |= AFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1031 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1032
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1033 case 'f': /* expire password attributes */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1034
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1035 /* if no repository the default for -f is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1036 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1037 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1038
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1039 if (IS_FILES(repository) == FALSE &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1040 IS_NISPLUS(repository) == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1041 (void) fprintf(stderr, gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1042 "-f only applies to files or nisplus repository\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1043 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1044 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1045 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1046 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1047
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1048 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1049 * Only privileged process can execute this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1050 * for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1051 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1052 if (IS_FILES(repository) &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1053 ((retval = ckuid()) != SUCCESS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1054 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1055 if (flag & (SAFLAG|FFLAG|NONAGEFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1056 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1057 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1058 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1059 flag |= FFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1060 attrlist_add(attributes, ATTR_EXPIRE_PASSWORD, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1061 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1062
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1063 case 'D': /* domain name specified */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1064 if (IS_NISPLUS(repository) == FALSE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1065 (void) fprintf(stderr, gettext(
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1066 "-D only applies to nisplus repository\n"));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1067 rusage(); /* exit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1068 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1069 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1070 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1071
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1072 if (flag & AFLAG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1073 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1074 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1075 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1076 /* It is cleaner not to set this flag */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1077 /* flag |= OFLAG; */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1078
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1079 /* get domain from optarg */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1080 repository.scope = optarg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1081 if (repository.scope != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1082 repository.scope_len =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1083 strlen(repository.scope)+1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1084 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1085 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1086
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1087 case 'e': /* change login shell */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1088
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1089 /* if no repository the default for -e is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1090 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1091 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1092
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1093 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1094 * Only privileged process can execute this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1095 * for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1096 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1097 if (IS_FILES(repository) && (ckuid() != SUCCESS)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1098 retval = NOPERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1099 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1100 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1101 if (flag & (EFLAG|SAFLAG|AGEFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1102 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1103 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1104 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1105 flag |= EFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1106 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1108 case 'g': /* change gecos information */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1110 /* if no repository the default for -g is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1111 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1112 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1114 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1115 * Only privileged process can execute this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1116 * for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1117 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1118 if (IS_FILES(repository) && (ckuid() != SUCCESS)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1119 retval = NOPERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1120 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1121 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1122 if (flag & (GFLAG|SAFLAG|AGEFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1123 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1124 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1125 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1126 flag |= GFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1127 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1128
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1129 case 'h': /* change home dir */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1131 /* if no repository the default for -h is files */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1132 if (repository.type == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1133 repository = __REPFILES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1134 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1135 * Only privileged process can execute this
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1136 * for FILES
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1137 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1138 if (IS_FILES(repository) && (ckuid() != SUCCESS)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1139 retval = NOPERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1140 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1141 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1142 if (IS_NIS(repository)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1143 (void) fprintf(stderr, "%s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1144 gettext(MSG_NIS_HOMEDIR));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1145 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1146 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1147 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1148
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1149 if (flag & (HFLAG|SAFLAG|AGEFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1150 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1151 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1152 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1153 flag |= HFLAG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1154 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1155
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1156 case '?':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1157 rusage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1158 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1159 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1160 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1161 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1163 argc -= optind;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1164 if (argc > 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1165 rusage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1166 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1167 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1168 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1169
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1170 /* Make sure (EXPIRE comes after (MAX comes after MIN)) */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1171 attrlist_reorder(attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1173 /* If no options are specified or only the show option */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1174 /* is specified, return because no option error checking */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1175 /* is needed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1176 if (!flag || (flag == SFLAG))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1177 return (flag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1179 /* AFLAG must be used with SFLAG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1180 if (flag == AFLAG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1181 rusage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1182 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1183 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1184 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1186 if (flag != SAFLAG && argc < 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1187 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1188 * user name is not specified (argc<1), it can't be
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1189 * aging info update.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1190 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1191 if (!(flag & NONAGEFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1192 rusage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1193 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1194 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1195 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1196 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1198 /* user name(s) may not be specified when SAFLAG is used. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1199 if (flag == SAFLAG && argc >= 1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1200 rusage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1201 retval = BADSYN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1202 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1203 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1205 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1206 * If aging is being turned off (maxdate == -1), mindate may not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1207 * be specified.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1208 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1209 if ((maxdate == -1) && (flag & NFLAG)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1210 (void) fprintf(stderr, "%s: %s -n\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1211 prognamep, gettext(MSG_NV));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1212 retval = BADOPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1213 return (FAIL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1214 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1216 return (flag);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1217 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1218
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1219 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1220 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1221 * ckuid():
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1222 * This function returns SUCCESS if the caller is root, else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1223 * it returns NOPERM.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1224 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1225 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1227 static int
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
1228 ckuid(void)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1229 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1230 if (uid != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1231 return (retval = NOPERM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1232 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1233 return (SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1234 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1236
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1237 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1238 * get_attr()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1239 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1240 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1241 get_attr(char *username, pwu_repository_t *repository, attrlist **attributes)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1242 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1243 int res;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1245 attrlist_add(attributes, ATTR_PASSWD, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1246 attrlist_add(attributes, ATTR_LSTCHG, "0");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1247 attrlist_add(attributes, ATTR_MIN, "0");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1248 attrlist_add(attributes, ATTR_MAX, "0");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1249 attrlist_add(attributes, ATTR_WARN, "0");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1251 res = __get_authtoken_attr(username, repository, *attributes);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1253 if (res == PWU_SUCCESS) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1254 retval = SUCCESS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1255 return (PWU_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1256 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1257
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1258 if (res == PWU_NOT_FOUND)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1259 (void) fprintf(stderr, gettext(MSG_UNKNOWN), prognamep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1260 username);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1262 retval = NOPERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1263 passwd_exit(retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1264 /*NOTREACHED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1265 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1266
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1267 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1268 * display_attr():
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1269 * This function prints out the password attributes of a usr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1270 * onto standand output.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1271 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1272 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1273 display_attr(char *usrname, attrlist *attributes)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1274 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1275 char *status;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1276 char *passwd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1277 long lstchg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1278 int min, max, warn;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1280 while (attributes) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1281 switch (attributes->type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1282 case ATTR_PASSWD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1283 passwd = attributes->data.val_s;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1284 if (passwd == NULL || *passwd == '\0')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1285 status = "NP ";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1286 else if (strncmp(passwd, LOCKSTRING,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1287 sizeof (LOCKSTRING)-1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1288 status = "LK ";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1289 else if (strncmp(passwd, NOLOGINSTRING,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1290 sizeof (NOLOGINSTRING)-1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1291 status = "NL ";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1292 else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1293 status = "PS ";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1294 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1295 case ATTR_LSTCHG:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1296 lstchg = attributes->data.val_i * DAY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1297 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1298 case ATTR_MIN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1299 min = attributes->data.val_i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1300 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1301 case ATTR_MAX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1302 max = attributes->data.val_i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1303 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1304 case ATTR_WARN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1305 warn = attributes->data.val_i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1306 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1307 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1308 attributes = attributes->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1309 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1310 (void) fprintf(stdout, "%-8s ", usrname);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1312 if (status)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1313 (void) fprintf(stdout, "%s ", status);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1314
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1315 if (max != -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1316 if (lstchg == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1317 (void) fprintf(stdout, "00/00/00 ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1318 } else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1319 struct tm *tmp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1320 tmp = gmtime(&lstchg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1321 (void) fprintf(stdout, "%.2d/%.2d/%.2d ",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1322 tmp->tm_mon + 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1323 tmp->tm_mday,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1324 tmp->tm_year % 100);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1325 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1326 (void) fprintf(stdout, (min >= 0) ? "%4d " : " ", min);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1327 (void) fprintf(stdout, "%4d ", max);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1328 (void) fprintf(stdout, (warn > 0) ? "%4d " : " ", warn);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1329 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1330 (void) fprintf(stdout, "\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1331 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1333 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1334 free_attr(attrlist *attributes)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1335 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1336 while (attributes) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1337 if (attributes->type == ATTR_PASSWD)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1338 free(attributes->data.val_s);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1339 attributes = attributes->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1340 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1341 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1342
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1343 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1344 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1345 * get_namelist_files():
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1346 * This function gets a list of user names on the system from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1347 * the /etc/passwd file.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1348 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1349 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1350 int
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
1351 get_namelist_files(char ***namelist_p, int *num_user)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1352 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1353 FILE *pwfp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1354 struct passwd *pwd;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1355 int max_user;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1356 int nuser;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1357 char **nl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1358
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1359 nuser = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1360 errno = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1361 pwd = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1363 if ((pwfp = fopen(PASSWD, "r")) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1364 return (NOPERM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1365
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1366 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1367 * find out the actual number of entries in the PASSWD file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1368 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1369 max_user = 1; /* need one slot for terminator NULL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1370 while ((pwd = fgetpwent(pwfp)) != NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1371 max_user++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1372
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1373 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1374 * reset the file stream pointer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1375 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1376 rewind(pwfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1378 nl = (char **)calloc(max_user, (sizeof (char *)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1379 if (nl == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1380 (void) fclose(pwfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1381 return (FMERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1382 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1383
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1384 while ((pwd = fgetpwent(pwfp)) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1385 if ((nl[nuser] = strdup(pwd->pw_name)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1386 (void) fclose(pwfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1387 return (FMERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1388 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1389 nuser++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1390 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1392 nl[nuser] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1393 *num_user = nuser;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1394 *namelist_p = nl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1395 (void) fclose(pwfp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1396 return (SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1397 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1399 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1400 * get_namelist_nisplus
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1401 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1402 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1403
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1404 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1405 * Our private version of the switch frontend for getspent. We want to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1406 * search just the nisplus sp file, so we want to bypass normal nsswitch.conf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1407 * based processing. This implementation compatible with version 2 of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1408 * name service switch.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1409 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1410 #define NSS_NISPLUS_ONLY "nisplus"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1411
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1412 extern int str2spwd(const char *, int, void *, char *, int);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1413
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1414 static DEFINE_NSS_DB_ROOT(db_root);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1415 static DEFINE_NSS_GETENT(context);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1416
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1417 static void
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
1418 _np_nss_initf_shadow(nss_db_params_t *p)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1419 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1420 p->name = NSS_DBNAM_SHADOW;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1421 p->config_name = NSS_DBNAM_PASSWD; /* Use config for "passwd" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1422 p->default_config = NSS_NISPLUS_ONLY; /* Use nisplus only */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1423 p->flags = NSS_USE_DEFAULT_CONFIG;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1424 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1425
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1426 static void
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
1427 _np_setspent(void)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1428 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1429 nss_setent(&db_root, _np_nss_initf_shadow, &context);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1430 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1432 static void
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
1433 _np_endspent(void)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1434 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1435 nss_endent(&db_root, _np_nss_initf_shadow, &context);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1436 nss_delete(&db_root);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1437 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1439 static struct spwd *
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
1440 _np_getspent_r(struct spwd *result, char *buffer, int buflen)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1441 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1442 nss_XbyY_args_t arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1443 char *nam;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1444
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1445 /* In getXXent_r(), protect the unsuspecting caller from +/- entries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1446
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1447 do {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1448 NSS_XbyY_INIT(&arg, result, buffer, buflen, str2spwd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1449 /* No key to fill in */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1450 (void) nss_getent(&db_root, _np_nss_initf_shadow, &context,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1451 &arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1452 } while (arg.returnval != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1453 (nam = ((struct spwd *)arg.returnval)->sp_namp) != 0 &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1454 (*nam == '+' || *nam == '-'));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1456 return (struct spwd *)NSS_XbyY_FINI(&arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1457 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1458
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1459 static nss_XbyY_buf_t *buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1460
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1461 static struct spwd *
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
1462 _np_getspent(void)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1463 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1464 nss_XbyY_buf_t *b;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1465
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1466 b = NSS_XbyY_ALLOC(&buffer, sizeof (struct spwd), NSS_BUFLEN_SHADOW);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1468 return (b == 0 ? 0 : _np_getspent_r(b->result, b->buffer, b->buflen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1469 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1470
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1471 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1472 get_namelist_nisplus(char ***namelist_p, int *num_user)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1473 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1474 int nuser = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1475 int alloced = 100;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1476 char **nl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1477 struct spwd *p;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1478
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1479
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1480 if ((nl = calloc(alloced, sizeof (*nl))) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1481 return (FMERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1483 (void) _np_setspent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1484 while ((p = _np_getspent()) != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1485 if ((nl[nuser] = strdup(p->sp_namp)) == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1486 _np_endspent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1487 return (FMERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1488 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1489 if (++nuser == alloced) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1490 alloced += 100;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1491 nl = realloc(nl, alloced * (sizeof (*nl)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1492 if (nl == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1493 _np_endspent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1494 return (FMERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1495 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1496 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1497 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1498 (void) _np_endspent();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1499 nl[nuser] = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1501 *namelist_p = nl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1502 *num_user = nuser; /* including NULL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1504 return (SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1505 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1507 int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1508 get_namelist(pwu_repository_t repository, char ***namelist, int *num_user)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1509 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1510 if (IS_NISPLUS(repository))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1511 return (get_namelist_nisplus(namelist, num_user));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1512 else if (IS_FILES(repository))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1513 return (get_namelist_files(namelist, num_user));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1514
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1515 rusage();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1516 return (BADSYN);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1517 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1519 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1520 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1521 * passwd_exit():
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1522 * This function will call exit() with appropriate exit code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1523 * according to the input "retcode" value.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1524 * It also calls pam_end() to clean-up buffers before exit.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1525 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1526 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1528 void
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
1529 passwd_exit(int retcode)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1530 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1531
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1532 if (pamh)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1533 (void) pam_end(pamh, pam_retval);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1535 switch (retcode) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1536 case SUCCESS:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1537 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1538 case NOPERM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1539 (void) fprintf(stderr, "%s\n", gettext(MSG_NP));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1540 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1541 case BADOPT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1542 (void) fprintf(stderr, "%s\n", gettext(MSG_BS));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1543 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1544 case FMERR:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1545 (void) fprintf(stderr, "%s\n", gettext(MSG_FE));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1546 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1547 case FATAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1548 (void) fprintf(stderr, "%s\n", gettext(MSG_FF));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1549 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1550 case FBUSY:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1551 (void) fprintf(stderr, "%s\n", gettext(MSG_FB));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1552 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1553 case BADSYN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1554 (void) fprintf(stderr, "%s\n", gettext(MSG_NV));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1555 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1556 case BADAGE:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1557 (void) fprintf(stderr, "%s\n", gettext(MSG_AD));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1558 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1559 case NOMEM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1560 (void) fprintf(stderr, "%s\n", gettext(MSG_NM));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1561 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1562 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1563 (void) fprintf(stderr, "%s\n", gettext(MSG_NP));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1564 retcode = NOPERM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1565 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1566 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1567 /* write password record */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1568 if (event != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1569 if (adt_put_event(event,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1570 retcode == SUCCESS ? ADT_SUCCESS : ADT_FAILURE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1571 retcode == SUCCESS ? ADT_SUCCESS : ADT_FAIL_PAM +
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1572 pam_retval) != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1573 adt_free_event(event);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1574 (void) adt_end_session(ah);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1575 perror("adt_put_event");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1576 exit(retcode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1577 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1578 adt_free_event(event);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1579 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1580 (void) adt_end_session(ah);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1581 exit(retcode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1582 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1583
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1584 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1585 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1586 * passwd_conv():
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1587 * This is the conv (conversation) function called from
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1588 * a PAM authentication module to print error messages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1589 * or garner information from the user.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1590 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1591 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1593 /*ARGSUSED*/
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1594 static int
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
1595 passwd_conv(int num_msg, struct pam_message **msg,
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
1596 struct pam_response **response, void *appdata_ptr)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1597 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1598 struct pam_message *m;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1599 struct pam_response *r;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1600 char *temp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1601 int k, i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1602
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1603 if (num_msg <= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1604 return (PAM_CONV_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1605
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1606 *response = (struct pam_response *)calloc(num_msg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1607 sizeof (struct pam_response));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1608 if (*response == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1609 return (PAM_BUF_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1610
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1611 k = num_msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1612 m = *msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1613 r = *response;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1614 while (k--) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1615
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1616 switch (m->msg_style) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1617
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1618 case PAM_PROMPT_ECHO_OFF:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1619 temp = getpassphrase(m->msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1620 if (temp != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1621 r->resp = strdup(temp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1622 (void) memset(temp, 0, strlen(temp));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1623 if (r->resp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1624 /* free responses */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1625 r = *response;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1626 for (i = 0; i < num_msg; i++, r++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1627 if (r->resp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1628 free(r->resp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1629 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1630 free(*response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1631 *response = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1632 return (PAM_BUF_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1633 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1634 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1635 m++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1636 r++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1637 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1638
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1639 case PAM_PROMPT_ECHO_ON:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1640 if (m->msg != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1641 (void) fputs(m->msg, stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1642 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1643 r->resp = (char *)calloc(PAM_MAX_RESP_SIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1644 sizeof (char));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1645 if (r->resp == NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1646 /* free responses */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1647 r = *response;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1648 for (i = 0; i < num_msg; i++, r++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1649 if (r->resp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1650 free(r->resp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1651 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1652 free(*response);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1653 *response = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1654 return (PAM_BUF_ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1655 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1656 if (fgets(r->resp, PAM_MAX_RESP_SIZE-1, stdin)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1657 int len = strlen(r->resp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1658 if (r->resp[len-1] == '\n')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1659 r->resp[len-1] = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1660 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1661 m++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1662 r++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1663 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1664
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1665 case PAM_ERROR_MSG:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1666 if (m->msg != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1667 (void) fputs(m->msg, stderr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1668 (void) fputs("\n", stderr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1669 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1670 m++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1671 r++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1672 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1673 case PAM_TEXT_INFO:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1674 if (m->msg != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1675 (void) fputs(m->msg, stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1676 (void) fputs("\n", stdout);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1677 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1678 m++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1679 r++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1680 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1681
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1682 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1683 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1684 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1685 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1686 return (PAM_SUCCESS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1687 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1688
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1689 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1690 * Utilities Functions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1691 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1692
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1693 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1694 * int attrlist_add(attrlist **l, attrtype type, char *val)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1695 * add an item, with type "type" and value "val", at the tail of list l.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1696 * This functions exits the application on OutOfMem error.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1697 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1698 void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1699 attrlist_add(attrlist **l, attrtype type, char *val)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1700 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1701 attrlist **w;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1702
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1703 /* tail insert */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1704 for (w = l; *w != NULL; w = &(*w)->next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1705 ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1706
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1707 if ((*w = malloc(sizeof (**w))) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1708 passwd_exit(NOMEM);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1709
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1710 (*w)->type = type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1711 (*w)->next = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1712
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1713 switch (type) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1714 case ATTR_MIN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1715 case ATTR_WARN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1716 case ATTR_MAX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1717 (*w)->data.val_i = atoi(val);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1718 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1719 default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1720 (*w)->data.val_s = val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1721 break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1722 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1723 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1724
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1725 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1726 * attrlist_reorder(attrlist **l)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1727 * Make sure that
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1728 * - if EXPIRE and MAX or MIN is set, EXPIRE comes after MAX/MIN
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1729 * - if both MIN and MAX are set, MAX comes before MIN.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1730 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1731
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1732 static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1733 attrlist_reorder(attrlist **l)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1734 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1735 attrlist **w;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1736 attrlist *exp = NULL; /* ATTR_EXPIRE_PASSWORD, if found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1737 attrlist *max = NULL; /* ATTR_MAX, if found */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1738
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1739 if (*l == NULL || (*l)->next == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1740 return; /* order of list with <= one item is ok */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1742 /*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1743 * We simply walk the list, take off the EXPIRE and MAX items if
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1744 * they appear, and put them (first MAX, them EXPIRE) at the end
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1745 * of the list.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1746 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1747 w = l;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1748 while (*w != NULL) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1749 if ((*w)->type == ATTR_EXPIRE_PASSWORD) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1750 exp = *w;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1751 *w = (*w)->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1752 } else if ((*w)->type == ATTR_MAX) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1753 max = *w;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1754 *w = (*w)->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1755 } else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1756 w = &(*w)->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1757 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1758
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1759 /* 'w' points to the address of the 'next' field of the last element */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1760
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1761 if (max) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1762 *w = max;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1763 w = &max->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1764 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1765 if (exp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1766 *w = exp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1767 w = &exp->next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1768 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1769 *w = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1770 }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1772 void
108
55ad989fc90b 6271160 gcc and cmd/groups don't get along
basabi
parents: 0
diff changeset
1773 rusage(void)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1774 {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1775
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1776 #define MSG(a) (void) fprintf(stderr, gettext((a)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1777
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1778 MSG("usage:\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1779 MSG("\tpasswd [-r files | -r nis | -r nisplus | -r ldap] [name]\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1780 MSG("\tpasswd [-r files] [-egh] [name]\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1781 MSG("\tpasswd [-r files] -sa\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1782 MSG("\tpasswd [-r files] -s [name]\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1783 MSG("\tpasswd [-r files] [-d|-l|-N|-u] [-f] [-n min] [-w warn] "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1784 "[-x max] name\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1785 MSG("\tpasswd -r nis [-eg] [name]\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1786 MSG("\tpasswd -r nisplus [-egh] [-D domainname] [name]\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1787 MSG("\tpasswd -r nisplus -sa\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1788 MSG("\tpasswd -r nisplus [-D domainname] -s [name]\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1789 MSG("\tpasswd -r nisplus [-D domainname] [-l|-N|-u] [-f] [-n min] "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1790 "[-w warn]\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1791 MSG("\t\t[-x max] name\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1792 MSG("\tpasswd -r ldap [-egh] [name]\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1793 #undef MSG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
1794 }