4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright (c) 2013 Gary Mills
24 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
25 * Use is subject to license terms.
28 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
29 /* All Rights Reserved */
32 #include <sys/types.h>
33 #include <sys/param.h>
34 #include <sys/signal.h>
35 #include <sys/sysmacros.h>
46 #define ERROR1 "Too many/few fields"
47 #define ERROR2 "Bad character(s) in logname"
48 #define ERROR2a "First char in logname not alphabetic"
49 #define ERROR2b "Logname field NULL"
50 #define ERROR2c "Logname contains no lower-case letters"
51 #define ERROR3 "Logname too long/short"
52 #define ERROR4 "Invalid UID"
53 #define ERROR5 "Invalid GID"
54 #define ERROR6 "Login directory not found"
55 #define ERROR6a "Login directory null"
56 #define ERROR7 "Optional shell file not found"
58 static int eflag
, code
= 0;
62 static void error(char *);
65 main(int argc
, char **argv
)
78 (void) setlocale(LC_ALL
, "");
80 #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
81 #define TEXT_DOMAIN "SYS_TEST"
83 (void) textdomain(TEXT_DOMAIN
);
86 pw_file
= "/etc/passwd";
90 if ((fptr
= fopen(pw_file
, "r")) == NULL
) {
91 (void) fprintf(stderr
, gettext("cannot open %s\n"), pw_file
);
95 if (fstat(fileno(fptr
), &stat_buf
) < 0) {
96 (void) fprintf(stderr
, gettext("fstat failed for %s\n"),
102 if (stat_buf
.st_size
== 0) {
103 (void) fprintf(stderr
, gettext("file %s is empty\n"), pw_file
);
108 while (fgets(buf
, sizeof (buf
), fptr
) != NULL
) {
115 /* Check that entry is not a nameservice redirection */
117 if (buf
[0] == '+' || buf
[0] == '-') {
119 * Should set flag here to allow special case checking
120 * in the rest of the code,
121 * but for now, we'll just ignore this entry.
126 /* Check number of fields */
128 for (i
= 0; buf
[i
] != NULL
; i
++)
142 * Check the first char is alpha; the rest alphanumeric;
143 * and that the name does not consist solely of uppercase
148 else if (!isalpha(buf
[0]))
151 for (i
= 0; buf
[i
] != ':'; i
++) {
152 if (!isalnum(buf
[i
]) &&
157 else if (islower(buf
[i
]))
165 /* Check for valid number of characters in logname */
167 if (i
<= 0 || i
> LOGNAME_MAX
)
170 /* Check that UID is numeric and <= MAXUID */
173 str
= &buf
[delim
[1] + 1];
174 uid
= strtol(str
, &lastc
, 10);
175 if (lastc
!= str
+ (delim
[2] - delim
[1]) - 1 ||
176 uid
> MAXUID
|| errno
== ERANGE
)
179 /* Check that GID is numeric and <= MAXUID */
182 str
= &buf
[delim
[2] + 1];
183 gid
= strtol(str
, &lastc
, 10);
184 if (lastc
!= str
+ (delim
[3] - delim
[2]) - 1 ||
185 gid
> MAXUID
|| errno
== ERANGE
)
188 /* Check initial working directory */
190 for (j
= 0, i
= (delim
[4] + 1); i
< delim
[5]; j
++, i
++)
194 if (logbuf
[0] == NULL
)
196 else if ((stat(logbuf
, &obuf
)) == -1)
199 /* Check program to use as shell */
201 if ((buf
[(delim
[5] + 1)]) != '\n') {
203 for (j
= 0, i
= (delim
[5] + 1); i
< delim
[6]; j
++, i
++)
207 if (strcmp(logbuf
, "*") == 0) /* subsystem login */
210 if ((stat(logbuf
, &obuf
)) == -1)
213 for (j
= 0; j
< 512; j
++)
221 /* Error printing routine */
227 (void) fprintf(stderr
, "\n%s", buf
);
232 (void) fprintf(stderr
, "\t%s\n", gettext(msg
));
234 (void) fprintf(stderr
, "\t%d %s\n", badc
, gettext(msg
));