static char *sccsid
= "@(#)su.c 4.4 (Berkeley) 4.4";
struct passwd
*pwd
,*getpwnam();
if ((pwd
= getpwnam(nptr
)) == NULL
) {
printf("Unknown id: %s\n",nptr
);
if (pwd
->pw_passwd
[0] == '\0' || getuid() == 0)
password
= getpass("Password:");
if (strcmp(pwd
->pw_passwd
, crypt(password
, pwd
->pw_passwd
)) != 0) {
FILE *console
= fopen("/dev/console", "w");
fprintf(console
, "BADSU: %s %s\r\n",
FILE *console
= fopen("/dev/console", "w");
fprintf(console
, "SU: %s %s\r\n",
if (setgid(pwd
->pw_gid
) < 0) {
if (initgroups(nptr
, pwd
->pw_gid
)) {
fprintf(stderr
, "su: initgroups failed\n");
if (setuid(pwd
->pw_uid
) < 0) {
if (pwd
->pw_shell
&& *pwd
->pw_shell
)
register char **ep
= environ
;
static char homebuf
[128];
for (cp
= "HOME"; *cp
== *dp
&& *cp
; cp
++, dp
++)
if (*cp
== 0 && (*dp
== '=' || *dp
== 0)) {
strcpy(homebuf
, "HOME=");
register char **ep
= environ
;
static char shellbuf
[128];
for (cp
= "SHELL"; *cp
== *dp
&& *cp
; cp
++, dp
++)
if (*cp
== 0 && (*dp
== '=' || *dp
== 0)) {
strcpy(shellbuf
, "SHELL=");