- char *password;
- char buf[1000];
- FILE *fp;
-
-again:
- if (argc > 1 && strcmp(argv[1], "-f") == 0) {
- fastlogin++;
- argc--, argv++;
- goto again;
- }
- if (argc > 1 && strcmp(argv[1], "-") == 0) {
- fulllogin++;
- argc--, argv++;
- goto again;
- }
- if (argc > 1 && argv[1][0] != '-') {
- user = argv[1];
- argc--, argv++;
- }
- if ((pwd = getpwuid(getuid())) == NULL) {
- fprintf(stderr, "Who are you?\n");
+ 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");