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