+ extern char **environ;
+ extern int errno, optind;
+ register struct passwd *pwd;
+ register char *p, **g;
+ struct group *gr;
+ uid_t ruid, getuid();
+ int asme, ch, fulllogin, fastlogin, prio;
+ enum { UNSET, YES, NO } iscsh = UNSET;
+ char *user, *shell, *username, *cleanenv[2], *nargv[4], **np;
+ char namebuf[50], shellbuf[MAXPATHLEN];
+ char *crypt(), *getpass(), *getenv(), *getlogin(), *rindex(), *strcpy();
+
+ np = &nargv[3];
+ *np-- = NULL;
+ asme = fulllogin = fastlogin = 0;
+ while ((ch = getopt(argc, argv, "-flm")) != EOF)
+ switch((char)ch) {
+ case 'f':
+ fastlogin = 1;
+ break;
+ case '-':
+ case 'l':
+ fulllogin = 1;
+ break;
+ case 'm':
+ asme = 1;
+ break;
+ case '?':
+ default:
+ fprintf(stderr, "usage: su [-flm] [login]\n");
+ exit(1);
+ }
+ argv += optind;
+
+ errno = 0;
+ prio = getpriority(PRIO_PROCESS, 0);
+ if (errno)
+ prio = 0;
+ (void)setpriority(PRIO_PROCESS, 0, -2);
+
+ /* get current login name and shell */
+ if ((pwd = getpwuid(ruid = getuid())) == NULL) {
+ fprintf(stderr, "su: who are you?\n");
+ exit(1);