#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/types.h>
#include <sys/stat.h>
#include <sys/syslog.h>

#define MAXLINE 100
#define NEW_UID 19

struct cmdtab {
	char *pcommand;
	char *name;
	char *command;
};

struct cmdtab commands[] = {
	"u_sql", "sql", "/usr/kits/sql/sql/bin/sql",
	"u_isql", "isql", "/usr/kits/sql/sql/bin/isql",
	"u_sysmod", "sysmod", "/usr/kits/sql/sql/bin/sysmod",
	"u_copydb", "copydb", "/usr/kits/sql/sql/bin/copydb",
	"u_unloaddb", "unloaddb", "/usr/kits/sql/sql/bin/unloaddb",
	"u_verifydb", "verifydb", "/usr/kits/sql/sql/bin/verifydb",
	"u_destroydb", "destroydb", "/usr/kits/sql/sql/bin/destroydb",
	"u_ckpdb", "ckpdb", "/usr/kits/sql/sql/bin/ckpdb",
	"u_rollforwarddb", "rollforwarddb", "/usr/kits/sql/sql/bin/rollforwarddb",
	0, 0, 0};

char *rindex();

main (argc, argv)
int argc;
char **argv;
{
	char *pcmd;
	char *name = NULL;
	char *cmd = NULL;
	int i;

#ifndef NOLOG
#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_LOCAL2);
#endif
#endif
	if ((pcmd = rindex(argv[0], '/')) == NULL) pcmd = argv[0];
	else pcmd++;
	for(i = 0; commands[i].pcommand != NULL; i++) {
		if (!strcmp(pcmd, commands[i].pcommand)) {
			name = commands[i].name;
			cmd = commands[i].command;
			break;
		}
	}
	if (cmd == NULL) {
		fprintf(stderr, "%s is not a legal privileged command\n", pcmd);
		exit(1);
	}
	argv[0] = name;		/* what we call it (ie. chown) */
#ifndef NOLOG
	log(pcmd, &argv[0]);
#endif
	argv[0] = cmd;		/* where it actually lives (ie. /etc/chown) */
	execute(cmd, argv);
}

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