Minix1.5/commands/su.c

Compare this file to the similar file:
Show the results in this format:

/* su - become super-user		Author: Patrick van Kleef */

#include <sys/types.h>
#include <sgtty.h>
#include <pwd.h>

main(argc, argv)
int argc;
char *argv[];
{
  register char *name;
  char *crypt();
  char *shell = "/bin/sh";
  char *shell2 = "/usr/bin/sh";
  int nr;
  char password[14];
  struct sgttyb args;
  register struct passwd *pwd;
  struct passwd *getpwnam();

  if (argc > 1)
	name = argv[1];
  else
	name = "root";

  if ((pwd = getpwnam(name)) == 0) {
	std_err("Unknown id: ");
	std_err(name);
	std_err("\n");
	exit(1);
  }
  if (pwd->pw_passwd[0] != '\0' && getuid() != 0) {
	std_err("Password: ");
	ioctl(0, TIOCGETP, &args);	/* get parameters */
	args.sg_flags = args.sg_flags & (~ECHO);
	ioctl(0, TIOCSETP, &args);
	nr = read(0, password, 14);
	password[nr - 1] = 0;
	std_err("\n");
	args.sg_flags = args.sg_flags | ECHO;
	ioctl(0, TIOCSETP, &args);
	if (strcmp(pwd->pw_passwd, crypt(password, pwd->pw_passwd))) {
		std_err("Sorry\n");
		exit(2);
	}
  }
  setgid(pwd->pw_gid);
  setuid(pwd->pw_uid);
  if (pwd->pw_shell[0]) shell = pwd->pw_shell;
  execl(shell, shell, "-i", (char *) 0);
  execl(shell2, shell2, "-i", (char *) 0);
  std_err("No shell\n");
  exit(3);
}