field.c revision 1.1.1.1 1 /*
2 * Copyright (c) 1988 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34 #ifndef lint
35 static char sccsid[] = "@(#)field.c 5.13 (Berkeley) 2/12/91";
36 #endif /* not lint */
37
38 #include <sys/param.h>
39 #include <pwd.h>
40 #include <grp.h>
41 #include <string.h>
42 #include <stdio.h>
43 #include <ctype.h>
44 #include "chpass.h"
45 #include "pathnames.h"
46
47 /* ARGSUSED */
48 p_login(p, pw, ep)
49 char *p;
50 struct passwd *pw;
51 ENTRY *ep;
52 {
53 if (!*p) {
54 (void)fprintf(stderr, "chpass: empty login field.\n");
55 return(1);
56 }
57 if (*p == '-') {
58 (void)fprintf(stderr,
59 "chpass: login names may not begin with a hyphen.\n");
60 return(1);
61 }
62 if (!(pw->pw_name = strdup(p))) {
63 (void)fprintf(stderr, "chpass: can't save entry.\n");
64 return(1);
65 }
66 if (index(p, '.'))
67 (void)fprintf(stderr,
68 "chpass: \'.\' is dangerous in a login name.\n");
69 for (; *p; ++p)
70 if (isupper(*p)) {
71 (void)fprintf(stderr,
72 "chpass: upper-case letters are dangerous in a login name.\n");
73 break;
74 }
75 return(0);
76 }
77
78 /* ARGSUSED */
79 p_passwd(p, pw, ep)
80 char *p;
81 struct passwd *pw;
82 ENTRY *ep;
83 {
84 if (!*p)
85 pw->pw_passwd = ""; /* "NOLOGIN"; */
86 else if (!(pw->pw_passwd = strdup(p))) {
87 (void)fprintf(stderr, "chpass: can't save password entry.\n");
88 return(1);
89 }
90
91 return(0);
92 }
93
94 /* ARGSUSED */
95 p_uid(p, pw, ep)
96 register char *p;
97 struct passwd *pw;
98 ENTRY *ep;
99 {
100 int id;
101
102 if (!*p) {
103 (void)fprintf(stderr, "chpass: empty uid field.\n");
104 return(1);
105 }
106 if (!isdigit(*p)) {
107 (void)fprintf(stderr, "chpass: illegal uid.\n");
108 return(1);
109 }
110 id = atoi(p);
111 if ((u_int)id > USHRT_MAX) {
112 (void)fprintf(stderr, "chpass: %d > max uid value (%d).\n",
113 id, USHRT_MAX);
114 return(1);
115 }
116 pw->pw_uid = id;
117 return(0);
118 }
119
120 /* ARGSUSED */
121 p_gid(p, pw, ep)
122 register char *p;
123 struct passwd *pw;
124 ENTRY *ep;
125 {
126 struct group *gr;
127 int id;
128
129 if (!*p) {
130 (void)fprintf(stderr, "chpass: empty gid field.\n");
131 return(1);
132 }
133 if (!isdigit(*p)) {
134 if (!(gr = getgrnam(p))) {
135 (void)fprintf(stderr,
136 "chpass: unknown group %s.\n", p);
137 return(1);
138 }
139 pw->pw_gid = gr->gr_gid;
140 return(0);
141 }
142 id = atoi(p);
143 if ((u_int)id > USHRT_MAX) {
144 (void)fprintf(stderr, "chpass: %d > max gid value (%d).\n",
145 id, USHRT_MAX);
146 return(1);
147 }
148 pw->pw_gid = id;
149 return(0);
150 }
151
152 /* ARGSUSED */
153 p_class(p, pw, ep)
154 char *p;
155 struct passwd *pw;
156 ENTRY *ep;
157 {
158 if (!*p)
159 pw->pw_class = "";
160 else if (!(pw->pw_class = strdup(p))) {
161 (void)fprintf(stderr, "chpass: can't save entry.\n");
162 return(1);
163 }
164
165 return(0);
166 }
167
168 /* ARGSUSED */
169 p_change(p, pw, ep)
170 char *p;
171 struct passwd *pw;
172 ENTRY *ep;
173 {
174 if (!atot(p, &pw->pw_change))
175 return(0);
176 (void)fprintf(stderr, "chpass: illegal date for change field.\n");
177 return(1);
178 }
179
180 /* ARGSUSED */
181 p_expire(p, pw, ep)
182 char *p;
183 struct passwd *pw;
184 ENTRY *ep;
185 {
186 if (!atot(p, &pw->pw_expire))
187 return(0);
188 (void)fprintf(stderr, "chpass: illegal date for expire field.\n");
189 return(1);
190 }
191
192 /* ARGSUSED */
193 p_gecos(p, pw, ep)
194 char *p;
195 struct passwd *pw;
196 ENTRY *ep;
197 {
198 if (!*p)
199 ep->save = "";
200 else if (!(ep->save = strdup(p))) {
201 (void)fprintf(stderr, "chpass: can't save entry.\n");
202 return(1);
203 }
204 return(0);
205 }
206
207 /* ARGSUSED */
208 p_hdir(p, pw, ep)
209 char *p;
210 struct passwd *pw;
211 ENTRY *ep;
212 {
213 if (!*p) {
214 (void)fprintf(stderr, "chpass: empty home directory field.\n");
215 return(1);
216 }
217 if (!(pw->pw_dir = strdup(p))) {
218 (void)fprintf(stderr, "chpass: can't save entry.\n");
219 return(1);
220 }
221 return(0);
222 }
223
224 /* ARGSUSED */
225 p_shell(p, pw, ep)
226 register char *p;
227 struct passwd *pw;
228 ENTRY *ep;
229 {
230 char *t, *ok_shell();
231
232 if (!*p) {
233 pw->pw_shell = _PATH_BSHELL;
234 return(0);
235 }
236 /* only admin can change from or to "restricted" shells */
237 if (uid && pw->pw_shell && !ok_shell(pw->pw_shell)) {
238 (void)fprintf(stderr,
239 "chpass: %s: current shell non-standard.\n", pw->pw_shell);
240 return(1);
241 }
242 if (!(t = ok_shell(p))) {
243 if (uid) {
244 (void)fprintf(stderr,
245 "chpass: %s: non-standard shell.\n", p);
246 return(1);
247 }
248 }
249 else
250 p = t;
251 if (!(pw->pw_shell = strdup(p))) {
252 (void)fprintf(stderr, "chpass: can't save entry.\n");
253 return(1);
254 }
255 return(0);
256 }
257