Mercurial > hg > toybox
changeset 1153:c4ac6a90963d draft
Promote su from pending to lsb.
author | Rob Landley <rob@landley.net> |
---|---|
date | Sun, 22 Dec 2013 15:48:44 -0600 |
parents | b7ca3e926250 |
children | f7b777035025 |
files | toys/lsb/su.c toys/pending/su.c |
diffstat | 2 files changed, 97 insertions(+), 97 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toys/lsb/su.c Sun Dec 22 15:48:44 2013 -0600 @@ -0,0 +1,97 @@ +/* su.c - switch user + * + * Copyright 2013 CE Strake <strake888@gmail.com> + * + * See http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/su.html + * TODO: log su attempts + +USE_SU(NEWTOY(su, "lmpc:s:", TOYFLAG_BIN|TOYFLAG_ROOTONLY)) + +config SU + bool "su" + default y + help + usage: su [-lmp] [-c CMD] [-s SHELL] [USER [ARGS...]] + + Switch to user (or root) and run shell (with optional command line). + + -s shell to use + -c command to pass to shell with -c + -l login shell + -(m|p) preserve environment +*/ + +#define FOR_su +#include "toys.h" + +GLOBALS( + char *s; + char *c; +) + +static char *snapshot_env(char *name) +{ + char *s = getenv(name); + + if (s) return xmsprintf("%s=%s", name, s); + + return 0; +} + +void su_main() +{ + char *name, *passhash = 0, **argu, **argv; + struct passwd *up; + struct spwd *shp; + + if (*toys.optargs && !strcmp("-", *toys.optargs)) { + toys.optflags |= FLAG_l; + toys.optargs++; + } + + if (*toys.optargs) name = *(toys.optargs++); + else name = "root"; + + if (!(shp = getspnam(name))) perror_exit("no '%s'", name); + if (*shp->sp_pwdp != '$') goto deny; + if (read_password(toybuf, sizeof(toybuf), "Password: ")) goto deny; + passhash = crypt(toybuf, shp->sp_pwdp); + memset(toybuf, 0, sizeof(toybuf)); + if (!passhash || strcmp(passhash, shp->sp_pwdp)) goto deny; + + up = xgetpwnam(name); + xsetuid(up->pw_uid); + + argv = argu = xmalloc(sizeof(char *)*(toys.optc + 4)); + *(argv++) = TT.s ? TT.s : up->pw_shell; + + if (toys.optflags & FLAG_l) { + int i; + char *stuff[] = {snapshot_env("TERM"), snapshot_env("DISPLAY"), + snapshot_env("COLORTERM"), snapshot_env("XAUTHORITY")}; + + clearenv(); + for (i=0; i < sizeof(stuff)/sizeof(char *); i++) putenv(stuff[i]); + *(argv++) = "-l"; + xchdir(up->pw_dir); + } else unsetenv("IFS"); + setenv("PATH", "/sbin:/bin:/usr/sbin:/usr/bin", 1); + if (!(toys.optflags & (FLAG_m|FLAG_p))) { + setenv("HOME", up->pw_dir, 1); + setenv("SHELL", up->pw_shell, 1); + setenv("USER", up->pw_name, 1); + setenv("LOGNAME", up->pw_name, 1); + } else unsetenv("IFS"); + + if (toys.optflags & FLAG_c) { + *(argv++) = "-c"; + *(argv++) = TT.c; + } + while ((*(argv++) = *(toys.optargs++))); + xexec(argu); + perror_exit("can't exec %s", *argu); + +deny: + puts("No."); + toys.exitval = 1; +}
--- a/toys/pending/su.c Sun Dec 22 15:47:48 2013 -0600 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/* su.c - switch user - * - * Copyright 2013 CE Strake <strake888@gmail.com> - * - * See http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/su.html - * TODO: log su attempts - -USE_SU(NEWTOY(su, "lmpc:s:", TOYFLAG_BIN|TOYFLAG_ROOTONLY)) - -config SU - bool "su" - default n - help - usage: su [-lmp] [-c CMD] [-s SHELL] [USER [ARGS...]] - - Switch to user (or root) and run shell (with optional command line). - - -s shell to use - -c command to pass to shell with -c - -l login shell - -(m|p) preserve environment -*/ - -#define FOR_su -#include "toys.h" - -GLOBALS( - char *s; - char *c; -) - -static char *snapshot_env(char *name) -{ - char *s = getenv(name); - - if (s) return xmsprintf("%s=%s", name, s); - - return 0; -} - -void su_main() -{ - char *name, *passhash = 0, **argu, **argv; - struct passwd *up; - struct spwd *shp; - - if (*toys.optargs && !strcmp("-", *toys.optargs)) { - toys.optflags |= FLAG_l; - toys.optargs++; - } - - if (*toys.optargs) name = *(toys.optargs++); - else name = "root"; - - if (!(shp = getspnam(name))) perror_exit("no '%s'", name); - if (*shp->sp_pwdp != '$') goto deny; - if (read_password(toybuf, sizeof(toybuf), "Password: ")) goto deny; - passhash = crypt(toybuf, shp->sp_pwdp); - memset(toybuf, 0, sizeof(toybuf)); - if (!passhash || strcmp(passhash, shp->sp_pwdp)) goto deny; - - up = xgetpwnam(name); - xsetuid(up->pw_uid); - - argv = argu = xmalloc(sizeof(char *)*(toys.optc + 4)); - *(argv++) = TT.s ? TT.s : up->pw_shell; - - if (toys.optflags & FLAG_l) { - int i; - char *stuff[] = {snapshot_env("TERM"), snapshot_env("DISPLAY"), - snapshot_env("COLORTERM"), snapshot_env("XAUTHORITY")}; - - clearenv(); - for (i=0; i < sizeof(stuff)/sizeof(char *); i++) putenv(stuff[i]); - *(argv++) = "-l"; - xchdir(up->pw_dir); - } else unsetenv("IFS"); - setenv("PATH", "/sbin:/bin:/usr/sbin:/usr/bin", 1); - if (!(toys.optflags & (FLAG_m|FLAG_p))) { - setenv("HOME", up->pw_dir, 1); - setenv("SHELL", up->pw_shell, 1); - setenv("USER", up->pw_name, 1); - setenv("LOGNAME", up->pw_name, 1); - } else unsetenv("IFS"); - - if (toys.optflags & FLAG_c) { - *(argv++) = "-c"; - *(argv++) = TT.c; - } - while ((*(argv++) = *(toys.optargs++))); - xexec(argu); - perror_exit("can't exec %s", *argu); - -deny: - puts("No."); - toys.exitval = 1; -}