- 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) {
- /*
- * Read the "/.suok" file for list of people who can su.
- */
- if ((pwd = getpwuid(getuid())) == NULL) {
- fprintf(stderr, "Who are you?\n");
- exit(1);
- }
- if ((fp = fopen("/.suok", "r")) != NULL) {
- while ((fgets(buf, sizeof(buf), fp)) != NULL) {
- /* blast newline */
- buf[strlen(buf) - 1] = '\0';
- if (strcmp(pwd->pw_name, buf) == 0) {
- fclose(fp);
- goto userok;
- }
- }
- fclose(fp);
- 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");