/* send_admin_command (sac) */
/* Copyright 1984 Student Information Processing Board, MIT. */ 

/* Started by JR, finished by RDZ, debugged by WCS, PLJ and RDZ */
/* modified by wcs 7/24/84 for password. 			*/

  
#include <sys/wait.h>
#include <pwd.h>
#include <stdio.h>
#include <sys/time.h>
#include <sys/param.h>
#include <strings.h>			/* Strings attached... */
#include <errno.h>
#include <sys/syslog.h>

#define MAXLINE 100

#ifdef PASSWORD
#define SAC_USER "sac"
char *bad_pw_msg[] = {
	"invalid password supplied",
	NULL
  };
#endif

#ifndef MYNAME
#define MYNAME "psac"
#endif

main (argc, argv)
int argc;
char *argv[];
{
	int i = 1;
	char c;
	struct passwd *pw, *getpwnam();
	char line[MAXLINE];
	char *password, *epassword, *getpass();

#ifdef ultrix
	openlog(argv[0], 0); /*
			      * This may lose for Ultrix 4.0, but if
			      * you're running Ultrix, you're losing by
			      * definition
			      */
#else
	openlog(argv[0], LOG_CONS|LOG_PID, LOG_LOCAL2);
#endif
	if (argc == 1) {
		printf("Usage: sac command-line\n");
		exit(1);
	}
#ifdef PASSWORD
	pw = getpwnam(SAC_USER);
	password = getpass("Password:");
	if (strcmp(pw->pw_passwd, crypt(password, pw->pw_passwd))){
		fprintf(stderr, "Incorrect password\n");
		log(argv[0], bad_pw_msg);
		exit(1);
	}
#endif
	printf("Command line:\n");
	while (i < argc) printf("%s ",argv[i++]);
	printf("\n");
	printf("OK to execute? ");
	c = getchar();
	if ((c == 'y') || (c == 'Y')) {
		log (MYNAME, &argv[1]);
		closelog();
		execute(argv[1], &argv[1]);
	}
	else printf("Nothing done.\n");
}

execute(command, argv)
char *command;
char **argv;
{
	setreuid(0,0);			/* Heh heh heh */
	execvp (command, argv);
	perror("execvp error");
}
