Commit | Line | Data |
---|---|---|
b6c7c20d | 1 | /* |
8964deec KB |
2 | * Copyright (c) 1988, 1993 |
3 | * The Regents of the University of California. All rights reserved. | |
b6c7c20d | 4 | * |
f15db449 | 5 | * %sccs.include.redist.c% |
b6c7c20d KB |
6 | */ |
7 | ||
8 | #ifndef lint | |
cc952d1c | 9 | static char sccsid[] = "@(#)field.c 8.3 (Berkeley) %G%"; |
b6c7c20d KB |
10 | #endif /* not lint */ |
11 | ||
12 | #include <sys/param.h> | |
cc952d1c JSP |
13 | |
14 | #include <ctype.h> | |
15 | #include <err.h> | |
16 | #include <errno.h> | |
b6c7c20d | 17 | #include <grp.h> |
cc952d1c | 18 | #include <pwd.h> |
b6c7c20d | 19 | #include <stdio.h> |
cc952d1c JSP |
20 | #include <stdlib.h> |
21 | #include <string.h> | |
22 | #include <unistd.h> | |
23 | ||
435e8dff | 24 | #include "chpass.h" |
cac8e61f | 25 | #include "pathnames.h" |
b6c7c20d KB |
26 | |
27 | /* ARGSUSED */ | |
cc952d1c | 28 | int |
b6c7c20d KB |
29 | p_login(p, pw, ep) |
30 | char *p; | |
31 | struct passwd *pw; | |
bc3d7b01 | 32 | ENTRY *ep; |
b6c7c20d KB |
33 | { |
34 | if (!*p) { | |
cc952d1c JSP |
35 | warnx("empty login field"); |
36 | return (1); | |
b6c7c20d | 37 | } |
e4387aeb | 38 | if (*p == '-') { |
cc952d1c JSP |
39 | warnx("login names may not begin with a hyphen"); |
40 | return (1); | |
e4387aeb | 41 | } |
b6c7c20d | 42 | if (!(pw->pw_name = strdup(p))) { |
cc952d1c JSP |
43 | warnx("can't save entry"); |
44 | return (1); | |
b6c7c20d | 45 | } |
cc952d1c JSP |
46 | if (strchr(p, '.')) |
47 | warnx("\'.\' is dangerous in a login name"); | |
d7cc8700 KB |
48 | for (; *p; ++p) |
49 | if (isupper(*p)) { | |
cc952d1c | 50 | warnx("upper-case letters are dangerous in a login name"); |
d7cc8700 KB |
51 | break; |
52 | } | |
cc952d1c | 53 | return (0); |
b6c7c20d KB |
54 | } |
55 | ||
8557219a | 56 | /* ARGSUSED */ |
cc952d1c | 57 | int |
8557219a KB |
58 | p_passwd(p, pw, ep) |
59 | char *p; | |
60 | struct passwd *pw; | |
bc3d7b01 | 61 | ENTRY *ep; |
8557219a KB |
62 | { |
63 | if (!*p) | |
64 | pw->pw_passwd = ""; /* "NOLOGIN"; */ | |
65 | else if (!(pw->pw_passwd = strdup(p))) { | |
cc952d1c JSP |
66 | warnx("can't save password entry"); |
67 | return (1); | |
8557219a KB |
68 | } |
69 | ||
cc952d1c | 70 | return (0); |
8557219a KB |
71 | } |
72 | ||
b6c7c20d | 73 | /* ARGSUSED */ |
cc952d1c | 74 | int |
b6c7c20d | 75 | p_uid(p, pw, ep) |
cc952d1c | 76 | char *p; |
b6c7c20d | 77 | struct passwd *pw; |
bc3d7b01 | 78 | ENTRY *ep; |
b6c7c20d | 79 | { |
20eea8b5 JSP |
80 | uid_t id; |
81 | char *np; | |
b6c7c20d KB |
82 | |
83 | if (!*p) { | |
cc952d1c JSP |
84 | warnx("empty uid field"); |
85 | return (1); | |
b6c7c20d KB |
86 | } |
87 | if (!isdigit(*p)) { | |
cc952d1c JSP |
88 | warnx("illegal uid"); |
89 | return (1); | |
b6c7c20d | 90 | } |
20eea8b5 JSP |
91 | errno = 0; |
92 | id = strtoul(p, &np, 10); | |
93 | if (*np || (id == ULONG_MAX && errno == ERANGE)) { | |
cc952d1c JSP |
94 | warnx("illegal uid"); |
95 | return (1); | |
b6c7c20d KB |
96 | } |
97 | pw->pw_uid = id; | |
cc952d1c | 98 | return (0); |
b6c7c20d KB |
99 | } |
100 | ||
101 | /* ARGSUSED */ | |
cc952d1c | 102 | int |
b6c7c20d | 103 | p_gid(p, pw, ep) |
cc952d1c | 104 | char *p; |
b6c7c20d | 105 | struct passwd *pw; |
bc3d7b01 | 106 | ENTRY *ep; |
b6c7c20d KB |
107 | { |
108 | struct group *gr; | |
20eea8b5 JSP |
109 | gid_t id; |
110 | char *np; | |
b6c7c20d KB |
111 | |
112 | if (!*p) { | |
cc952d1c JSP |
113 | warnx("empty gid field"); |
114 | return (1); | |
b6c7c20d KB |
115 | } |
116 | if (!isdigit(*p)) { | |
117 | if (!(gr = getgrnam(p))) { | |
cc952d1c JSP |
118 | warnx("unknown group %s", p); |
119 | return (1); | |
b6c7c20d KB |
120 | } |
121 | pw->pw_gid = gr->gr_gid; | |
cc952d1c | 122 | return (0); |
b6c7c20d | 123 | } |
20eea8b5 JSP |
124 | errno = 0; |
125 | id = strtoul(p, &np, 10); | |
126 | if (*np || (id == ULONG_MAX && errno == ERANGE)) { | |
cc952d1c JSP |
127 | warnx("illegal gid"); |
128 | return (1); | |
b6c7c20d KB |
129 | } |
130 | pw->pw_gid = id; | |
cc952d1c | 131 | return (0); |
b6c7c20d KB |
132 | } |
133 | ||
134 | /* ARGSUSED */ | |
cc952d1c | 135 | int |
b6c7c20d KB |
136 | p_class(p, pw, ep) |
137 | char *p; | |
138 | struct passwd *pw; | |
bc3d7b01 | 139 | ENTRY *ep; |
b6c7c20d | 140 | { |
ef97d022 KB |
141 | if (!*p) |
142 | pw->pw_class = ""; | |
143 | else if (!(pw->pw_class = strdup(p))) { | |
cc952d1c JSP |
144 | warnx("can't save entry"); |
145 | return (1); | |
b6c7c20d | 146 | } |
ef97d022 | 147 | |
cc952d1c | 148 | return (0); |
b6c7c20d KB |
149 | } |
150 | ||
151 | /* ARGSUSED */ | |
cc952d1c | 152 | int |
b6c7c20d KB |
153 | p_change(p, pw, ep) |
154 | char *p; | |
155 | struct passwd *pw; | |
bc3d7b01 | 156 | ENTRY *ep; |
b6c7c20d KB |
157 | { |
158 | if (!atot(p, &pw->pw_change)) | |
cc952d1c JSP |
159 | return (0); |
160 | warnx("illegal date for change field"); | |
161 | return (1); | |
b6c7c20d KB |
162 | } |
163 | ||
164 | /* ARGSUSED */ | |
cc952d1c | 165 | int |
b6c7c20d KB |
166 | p_expire(p, pw, ep) |
167 | char *p; | |
168 | struct passwd *pw; | |
bc3d7b01 | 169 | ENTRY *ep; |
b6c7c20d KB |
170 | { |
171 | if (!atot(p, &pw->pw_expire)) | |
cc952d1c JSP |
172 | return (0); |
173 | warnx("illegal date for expire field"); | |
174 | return (1); | |
b6c7c20d KB |
175 | } |
176 | ||
177 | /* ARGSUSED */ | |
cc952d1c | 178 | int |
ef97d022 | 179 | p_gecos(p, pw, ep) |
b6c7c20d KB |
180 | char *p; |
181 | struct passwd *pw; | |
bc3d7b01 | 182 | ENTRY *ep; |
b6c7c20d | 183 | { |
ef97d022 KB |
184 | if (!*p) |
185 | ep->save = ""; | |
186 | else if (!(ep->save = strdup(p))) { | |
cc952d1c JSP |
187 | warnx("can't save entry"); |
188 | return (1); | |
b6c7c20d | 189 | } |
cc952d1c | 190 | return (0); |
b6c7c20d KB |
191 | } |
192 | ||
193 | /* ARGSUSED */ | |
cc952d1c | 194 | int |
b6c7c20d KB |
195 | p_hdir(p, pw, ep) |
196 | char *p; | |
197 | struct passwd *pw; | |
bc3d7b01 | 198 | ENTRY *ep; |
b6c7c20d KB |
199 | { |
200 | if (!*p) { | |
cc952d1c JSP |
201 | warnx("empty home directory field"); |
202 | return (1); | |
b6c7c20d KB |
203 | } |
204 | if (!(pw->pw_dir = strdup(p))) { | |
cc952d1c JSP |
205 | warnx("can't save entry"); |
206 | return (1); | |
b6c7c20d | 207 | } |
cc952d1c | 208 | return (0); |
b6c7c20d KB |
209 | } |
210 | ||
211 | /* ARGSUSED */ | |
cc952d1c | 212 | int |
b6c7c20d | 213 | p_shell(p, pw, ep) |
cc952d1c | 214 | char *p; |
b6c7c20d | 215 | struct passwd *pw; |
bc3d7b01 | 216 | ENTRY *ep; |
b6c7c20d | 217 | { |
34dda72c | 218 | char *t, *ok_shell(); |
b6c7c20d KB |
219 | |
220 | if (!*p) { | |
cac8e61f | 221 | pw->pw_shell = _PATH_BSHELL; |
cc952d1c | 222 | return (0); |
b6c7c20d | 223 | } |
34dda72c KB |
224 | /* only admin can change from or to "restricted" shells */ |
225 | if (uid && pw->pw_shell && !ok_shell(pw->pw_shell)) { | |
cc952d1c JSP |
226 | warnx("%s: current shell non-standard", pw->pw_shell); |
227 | return (1); | |
34dda72c KB |
228 | } |
229 | if (!(t = ok_shell(p))) { | |
230 | if (uid) { | |
cc952d1c JSP |
231 | warnx("%s: non-standard shell", p); |
232 | return (1); | |
b6c7c20d | 233 | } |
b6c7c20d | 234 | } |
34dda72c KB |
235 | else |
236 | p = t; | |
b6c7c20d | 237 | if (!(pw->pw_shell = strdup(p))) { |
cc952d1c JSP |
238 | warnx("can't save entry"); |
239 | return (1); | |
b6c7c20d | 240 | } |
cc952d1c | 241 | return (0); |
b6c7c20d | 242 | } |