prettyness police
[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
cc952d1c 9static 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 28int
b6c7c20d
KB
29p_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 57int
8557219a
KB
58p_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 74int
b6c7c20d 75p_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 102int
b6c7c20d 103p_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 135int
b6c7c20d
KB
136p_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 152int
b6c7c20d
KB
153p_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 165int
b6c7c20d
KB
166p_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 178int
ef97d022 179p_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 194int
b6c7c20d
KB
195p_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 212int
b6c7c20d 213p_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}