386BSD 0.1 development
[unix-history] / usr / src / usr.bin / chpass / field.c
CommitLineData
c61fa9d9
WJ
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
35static 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 */
48p_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 */
79p_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 */
95p_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 */
121p_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 */
153p_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 */
169p_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 */
181p_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 */
193p_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 */
208p_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 */
225p_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}