- 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 (strcmp(user, "root") == 0) {
- struct group *gr;
- int i;
-
- /*
- * Only allow those in group zero to su.
- */
- if ((pwd = getpwuid(getuid())) == NULL) {
- fprintf(stderr, "Who are you?\n");
- exit(1);
- }
- if ((gr = getgrgid(0)) != NULL) {
- for (i = 0; gr->gr_mem[i] != NULL; i++)
- if (strcmp(pwd->pw_name, gr->gr_mem[i]) == 0)
- goto userok;
- fprintf(stderr, "You do not have permission to su root\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");