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]
23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
28 /* All Rights Reserved */
30 #pragma ident "%Z%%M% %I% %E% SMI"
33 * newgrp [-l | -] [group]
36 * if no arg, group id in password file is used
37 * else if group id == id in password file
38 * else if login name is in member list
39 * else if password is present and user knows it
43 #include <sys/types.h>
53 #define SHELL "/usr/bin/sh"
55 #define PATH "PATH=:/usr/bin:"
56 #define SUPATH "PATH=:/usr/sbin:/usr/bin"
59 char PW
[] = "newgrp: Password: ";
60 char NG
[] = "newgrp: Sorry";
61 char PD
[] = "newgrp: Permission denied";
62 char UG
[] = "newgrp: Unknown group";
63 char NS
[] = "newgrp: You have no shell";
69 extern char **environ
;
71 char *supath
= SUPATH
;
73 void error(char *s
) __NORETURN
;
74 static void warn(char *s
);
78 main(int argc
, char *argv
[])
85 char *shell
, *dir
, *name
;
92 (void) setlocale(LC_ALL
, "");
93 #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */
94 #define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */
96 (void) textdomain(TEXT_DOMAIN
);
98 if ((p
= getpwuid(getuid())) == NULL
)
102 while ((flag
= getopt(argc
, argv
, "l")) != EOF
) {
115 argv
= &argv
[optind
];
117 if (argc
> 0 && *argv
[0] == '-') {
126 p
->pw_gid
= chkgrp(argv
[0], p
);
130 len
= strlen(p
->pw_dir
) + 1;
131 if ((dir
= (char *)malloc(len
)) == NULL
)
132 error("newgrp: Memory request failed");
133 (void) strncpy(dir
, p
->pw_dir
, len
);
134 len
= strlen(p
->pw_name
) + 1;
135 if ((name
= (char *)malloc(len
)) == NULL
)
136 error("newgrp: Memory request failed");
137 (void) strncpy(name
, p
->pw_name
, len
);
139 if (setgid(p
->pw_gid
) < 0 || setuid(getuid()) < 0)
143 if ((shell
= getenv("SHELL")) != NULL
) {
153 len
= strlen(dir
) + 6;
154 if ((homedir
= (char *)malloc(len
)) == NULL
)
155 error("newgrp: Memory request failed");
156 (void) snprintf(homedir
, len
, "HOME=%s", dir
);
157 len
= strlen(name
) + 9;
158 if ((logname
= (char *)malloc(len
)) == NULL
)
159 error("newgrp: Memory request failed");
160 (void) snprintf(logname
, len
, "LOGNAME=%s", name
);
163 envinit
[2] = logname
;
165 envinit
[0] = homedir
;
173 len
= strlen(p
->pw_shell
) + 2;
174 if ((shell
= (char *)malloc(len
)) == NULL
)
175 error("newgrp: Memory request failed");
176 (void) snprintf(shell
, len
, "-%s", p
->pw_shell
);
177 simple
= strrchr(shell
, '/');
180 shell
= strcat(shell
, ++simple
);
186 (void) execl(p
->pw_shell
, shell
, NULL
);
194 (void) fprintf(stderr
, "%s\n", gettext(s
));
218 if (p
->pw_gid
== g
->gr_gid
|| getuid() == 0) {
221 for (t
= g
->gr_mem
; *t
; ++t
) {
222 if (strcmp(p
->pw_name
, *t
) == 0) {
227 if (!isatty(fileno(stdin
))) {
230 if (strcmp(g
->gr_passwd
,
231 crypt(getpassphrase(PW
), g
->gr_passwd
)) == 0) {
242 (void) fprintf(stderr
, gettext(
243 "usage: newgrp [-l | -] [group]\n"));