#include <stdio.h>
#include "dm.h"
#include <errno.h>
#ifdef macII
#define ON_CONSOLE_ONLY
#endif
#ifdef ON_CONSOLE_ONLY
#include <sys/ioctl.h>
#endif
#ifndef BINDIR
#define BINDIR "/usr/bin/X11"
#endif
#ifdef HAVE_WORKING_VFORK
# define HAS_VFORK
#endif
#ifndef HAS_VFORK
#define vfork() fork()
#endif
char *ProgramName;
static int exec_args (
char *filename,
char **args)
{
pid_t pid;
waitType status;
if (!filename) return -1;
if (filename[0] != '/') {
fprintf (stderr,
"%s: attempt to execute program with relative pathname: %s\n",
ProgramName, filename);
return -1;
}
if (access (filename, X_OK) != 0) return -1;
switch (pid = vfork ()) {
case -1:
return -1;
case 0:
execv (filename, args);
_exit (1);
default:
while (wait (&status) != pid) ;
}
return waitCode (status);
}
#if defined(macII) || defined(sun)
static int exec_one_arg (
char *filename,
char *arg)
{
char *argv[3];
argv[0] = filename;
argv[1] = arg;
argv[2] = NULL;
return exec_args (filename, argv);
}
#endif
int
main (
int argc,
char *argv[])
{
int ttyfd;
char cmdbuf[256];
char *args[10];
#ifdef ON_CONSOLE_ONLY
int consfd;
int ttypgrp, conspgrp;
char *ttyName;
extern char *ttyname();
#endif
ProgramName = argv[0];
if (argc > 1) {
fprintf (stderr, "usage: %s\r\n", ProgramName);
exit (1);
}
ttyfd = open ("/dev/tty", O_RDWR, 0);
if (ttyfd < 3) {
fprintf (stderr,
"%s: must be run directly from the console.\r\n",
ProgramName);
exit (1);
}
#ifdef ON_CONSOLE_ONLY
if (ioctl (ttyfd, TIOCGPGRP, (char *)&ttypgrp) != 0) {
fprintf (stderr, "%s: unable to get process group of /dev/tty\r\n",
ProgramName);
(void) close (ttyfd);
exit (1);
}
#endif
(void) close (ttyfd);
#ifdef ON_CONSOLE_ONLY
ttyName = ttyname (0);
if (!ttyName || strcmp (ttyName, "/dev/console") != 0) {
fprintf (stderr, "%s: must login on /dev/console instead of %s\r\n",
ProgramName, ttyName ? ttyName : "non-terminal device");
exit (1);
}
consfd = open ("/dev/console", O_RDWR, 0);
if (consfd < 3) {
fprintf (stderr, "%s: unable to open /dev/console\r\n",
ProgramName);
exit (1);
}
if (ioctl (consfd, TIOCGPGRP, (char *)&conspgrp) != 0) {
fprintf (stderr,
"%s: unable to get process group of /dev/console\r\n",
ProgramName);
(void) close (consfd);
exit (1);
}
(void) close (consfd);
if (ttypgrp != conspgrp) {
fprintf (stderr, "%s: must be run from /dev/console\r\n",
ProgramName);
exit (1);
}
#endif
if (setuid (geteuid()) == -1) {
fprintf(stderr, "%s: cannot setuid (error %d, %s)\r\n",
ProgramName, errno, strerror(errno));
exit(1);
}
strcpy (cmdbuf, BINDIR);
strcat (cmdbuf, "/xdm");
args[0] = cmdbuf;
args[1] = "-nodaemon";
args[2] = "-udpPort";
args[3] = "0";
args[4] = NULL;
if (exec_args (cmdbuf, args) == -1) {
fprintf (stderr, "%s: unable to execute %s (error %d, %s)\r\n",
ProgramName, cmdbuf, errno, strerror(errno));
exit (1);
}
#ifdef macII
strcpy (cmdbuf, BINDIR);
strcat (cmdbuf, "/Xrepair");
(void) exec_one_arg (cmdbuf, NULL);
(void) exec_one_arg ("/usr/bin/screenrestore", NULL);
#endif
#ifdef sun
strcpy (cmdbuf, BINDIR);
strcat (cmdbuf, "/kbd_mode");
(void) exec_one_arg (cmdbuf, "-a");
#endif
exit (0);
}