2006-11-25 13:07:29 -07:00
|
|
|
/*
|
|
|
|
* xdmshell - simple program for running xdm from login
|
|
|
|
*
|
2010-03-28 03:33:02 -06:00
|
|
|
*
|
2006-11-25 13:07:29 -07:00
|
|
|
Copyright 1988, 1998 The Open Group
|
|
|
|
|
|
|
|
Permission to use, copy, modify, distribute, and sell this software and its
|
|
|
|
documentation for any purpose is hereby granted without fee, provided that
|
|
|
|
the above copyright notice appear in all copies and that both that
|
|
|
|
copyright notice and this permission notice appear in supporting
|
|
|
|
documentation.
|
|
|
|
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
|
|
all copies or substantial portions of the Software.
|
|
|
|
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
|
|
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
|
|
|
|
Except as contained in this notice, the name of The Open Group shall not be
|
|
|
|
used in advertising or otherwise to promote the sale, use or other dealings
|
|
|
|
in this Software without prior written authorization from The Open Group.
|
|
|
|
* *
|
|
|
|
* Author: Jim Fulton, MIT X Consortium
|
|
|
|
*
|
2010-03-28 03:33:02 -06:00
|
|
|
* This program should probably be setuid to root.
|
2006-11-25 13:07:29 -07:00
|
|
|
*
|
|
|
|
* WARNING: Make sure that you tailor your Xresources file to have a
|
|
|
|
* way of invoking the abort-display() action. Otherwise, you won't be able
|
|
|
|
* bring down X when you are finished.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "dm.h"
|
|
|
|
#include <errno.h>
|
2010-03-28 03:33:02 -06:00
|
|
|
#include <unistd.h>
|
2006-11-25 13:07:29 -07:00
|
|
|
|
|
|
|
#ifndef BINDIR
|
2010-03-28 03:33:02 -06:00
|
|
|
# define BINDIR "/usr/bin/X11"
|
2006-11-25 13:07:29 -07:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* HP-UX does have vfork, but A/UX doesn't
|
|
|
|
*/
|
|
|
|
#ifdef HAVE_WORKING_VFORK /* autoconf's preferred name */
|
|
|
|
# define HAS_VFORK
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef HAS_VFORK
|
2010-03-28 03:33:02 -06:00
|
|
|
# define vfork() fork()
|
2006-11-25 13:07:29 -07:00
|
|
|
#endif
|
|
|
|
|
2010-03-28 03:33:02 -06:00
|
|
|
static char *ProgramName;
|
2006-11-25 13:07:29 -07:00
|
|
|
|
|
|
|
static int exec_args (
|
|
|
|
char *filename,
|
|
|
|
char **args)
|
|
|
|
{
|
2007-08-05 13:00:25 -06:00
|
|
|
pid_t pid;
|
2006-11-25 13:07:29 -07:00
|
|
|
waitType status;
|
|
|
|
|
|
|
|
if (!filename) return -1;
|
|
|
|
|
|
|
|
if (filename[0] != '/') {
|
2010-03-28 03:33:02 -06:00
|
|
|
fprintf (stderr,
|
2006-11-25 13:07:29 -07:00
|
|
|
"%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: /* error */
|
|
|
|
return -1;
|
|
|
|
case 0: /* child */
|
|
|
|
execv (filename, args);
|
|
|
|
_exit (1);
|
|
|
|
/* NOTREACHED */
|
|
|
|
default: /* parent */
|
|
|
|
while (wait (&status) != pid) ;
|
|
|
|
}
|
|
|
|
return waitCode (status);
|
|
|
|
}
|
|
|
|
|
2010-03-28 03:33:02 -06:00
|
|
|
#if defined(sun)
|
2006-11-25 13:07:29 -07:00
|
|
|
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];
|
|
|
|
|
|
|
|
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) { /* stdin = 0, stdout = 1, stderr = 2 */
|
2010-03-28 03:33:02 -06:00
|
|
|
fprintf (stderr,
|
2006-11-25 13:07:29 -07:00
|
|
|
"%s: must be run directly from the console.\r\n",
|
|
|
|
ProgramName);
|
|
|
|
exit (1);
|
|
|
|
}
|
|
|
|
(void) close (ttyfd);
|
|
|
|
|
|
|
|
/* make xdm run in a non-setuid environment */
|
2007-08-05 13:00:25 -06:00
|
|
|
if (setuid (geteuid()) == -1) {
|
|
|
|
fprintf(stderr, "%s: cannot setuid (error %d, %s)\r\n",
|
|
|
|
ProgramName, errno, strerror(errno));
|
|
|
|
exit(1);
|
|
|
|
}
|
2006-11-25 13:07:29 -07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* exec /usr/bin/X11/xdm -nodaemon -udpPort 0
|
|
|
|
*/
|
|
|
|
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 sun
|
|
|
|
strcpy (cmdbuf, BINDIR);
|
|
|
|
strcat (cmdbuf, "/kbd_mode");
|
|
|
|
(void) exec_one_arg (cmdbuf, "-a");
|
|
|
|
#endif
|
|
|
|
|
|
|
|
exit (0);
|
|
|
|
/*NOTREACHED*/
|
|
|
|
}
|