1629baa8cSmrg/*
2629baa8cSmrg * xdmshell - simple program for running xdm from login
3629baa8cSmrg *
4629baa8cSmrg *
5629baa8cSmrgCopyright 1988, 1998  The Open Group
6629baa8cSmrg
7629baa8cSmrgPermission to use, copy, modify, distribute, and sell this software and its
8629baa8cSmrgdocumentation for any purpose is hereby granted without fee, provided that
9629baa8cSmrgthe above copyright notice appear in all copies and that both that
10629baa8cSmrgcopyright notice and this permission notice appear in supporting
11629baa8cSmrgdocumentation.
12629baa8cSmrg
13629baa8cSmrgThe above copyright notice and this permission notice shall be included in
14629baa8cSmrgall copies or substantial portions of the Software.
15629baa8cSmrg
16629baa8cSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17629baa8cSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18629baa8cSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
19629baa8cSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20629baa8cSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21629baa8cSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22629baa8cSmrg
23629baa8cSmrgExcept as contained in this notice, the name of The Open Group shall not be
24629baa8cSmrgused in advertising or otherwise to promote the sale, use or other dealings
25629baa8cSmrgin this Software without prior written authorization from The Open Group.
26629baa8cSmrg * *
27629baa8cSmrg * Author:  Jim Fulton, MIT X Consortium
28629baa8cSmrg *
29629baa8cSmrg * This program should probably be setuid to root.
30629baa8cSmrg *
31629baa8cSmrg * WARNING:  Make sure that you tailor your Xresources file to have a
32629baa8cSmrg * way of invoking the abort-display() action.  Otherwise, you won't be able
33629baa8cSmrg * bring down X when you are finished.
34629baa8cSmrg */
35629baa8cSmrg
36629baa8cSmrg
37629baa8cSmrg#include <stdio.h>
38629baa8cSmrg#include "dm.h"
39629baa8cSmrg#include <errno.h>
40629baa8cSmrg#include <unistd.h>
41629baa8cSmrg
42629baa8cSmrg#ifndef BINDIR
43629baa8cSmrg# define BINDIR "/usr/bin/X11"
44629baa8cSmrg#endif
45629baa8cSmrg
46629baa8cSmrg/*
47629baa8cSmrg * HP-UX does have vfork, but A/UX doesn't
48629baa8cSmrg */
49629baa8cSmrg#ifdef HAVE_WORKING_VFORK /* autoconf's preferred name */
50629baa8cSmrg# define HAS_VFORK
51629baa8cSmrg#endif
52629baa8cSmrg
53629baa8cSmrg#ifndef HAS_VFORK
54629baa8cSmrg# define vfork() fork()
55629baa8cSmrg#endif
56629baa8cSmrg
57629baa8cSmrgstatic char *ProgramName;
58629baa8cSmrg
59629baa8cSmrgstatic int exec_args (
60629baa8cSmrg    char *filename,
61629baa8cSmrg    char **args)
62629baa8cSmrg{
63629baa8cSmrg    pid_t pid;
64629baa8cSmrg    waitType status;
65629baa8cSmrg
66629baa8cSmrg    if (!filename) return -1;
67629baa8cSmrg
68629baa8cSmrg    if (filename[0] != '/') {
69629baa8cSmrg	fprintf (stderr,
70629baa8cSmrg	       "%s:  attempt to execute program with relative pathname:  %s\n",
71629baa8cSmrg		 ProgramName, filename);
72629baa8cSmrg	return -1;
73629baa8cSmrg    }
74629baa8cSmrg
75629baa8cSmrg    if (access (filename, X_OK) != 0) return -1;
76629baa8cSmrg
77629baa8cSmrg    switch (pid = vfork ()) {
78629baa8cSmrg      case -1:						/* error */
79629baa8cSmrg	return -1;
80629baa8cSmrg      case 0:    					/* child */
81629baa8cSmrg	execv (filename, args);
82629baa8cSmrg	_exit (1);
83629baa8cSmrg	/* NOTREACHED */
84629baa8cSmrg      default:						/* parent */
85629baa8cSmrg	while (wait (&status) != pid) ;
86629baa8cSmrg    }
87629baa8cSmrg    return waitCode (status);
88629baa8cSmrg}
89629baa8cSmrg
90629baa8cSmrg#if defined(sun)
91629baa8cSmrgstatic int exec_one_arg (
92629baa8cSmrg    char    *filename,
93629baa8cSmrg    char    *arg)
94629baa8cSmrg{
95629baa8cSmrg    char    *argv[3];
96629baa8cSmrg
97629baa8cSmrg    argv[0] = filename;
98629baa8cSmrg    argv[1] = arg;
99629baa8cSmrg    argv[2] = NULL;
100629baa8cSmrg    return exec_args (filename, argv);
101629baa8cSmrg}
102629baa8cSmrg#endif
103629baa8cSmrg
104629baa8cSmrgint
105629baa8cSmrgmain (
106629baa8cSmrg    int argc,
107629baa8cSmrg    char *argv[])
108629baa8cSmrg{
109629baa8cSmrg    int ttyfd;
110629baa8cSmrg    char cmdbuf[256];
111629baa8cSmrg    char *args[10];
112629baa8cSmrg
113629baa8cSmrg    ProgramName = argv[0];
114629baa8cSmrg
115629baa8cSmrg    if (argc > 1) {
116629baa8cSmrg	fprintf (stderr, "usage:  %s\r\n", ProgramName);
117629baa8cSmrg	exit (1);
118629baa8cSmrg    }
119629baa8cSmrg
120629baa8cSmrg    ttyfd = open ("/dev/tty", O_RDWR, 0);
121629baa8cSmrg    if (ttyfd < 3) {			/* stdin = 0, stdout = 1, stderr = 2 */
122629baa8cSmrg	fprintf (stderr,
123629baa8cSmrg		 "%s:  must be run directly from the console.\r\n",
124629baa8cSmrg		 ProgramName);
125629baa8cSmrg	exit (1);
126629baa8cSmrg    }
127629baa8cSmrg    (void) close (ttyfd);
128629baa8cSmrg
129629baa8cSmrg    /* make xdm run in a non-setuid environment */
130629baa8cSmrg    if (setuid (geteuid()) == -1) {
131629baa8cSmrg	fprintf(stderr, "%s: cannot setuid (error %d, %s)\r\n",
132629baa8cSmrg		ProgramName, errno, strerror(errno));
133629baa8cSmrg	exit(1);
134629baa8cSmrg    }
135629baa8cSmrg
136629baa8cSmrg    /*
137629baa8cSmrg     * exec /usr/bin/X11/xdm -nodaemon -udpPort 0
138629baa8cSmrg     */
139629baa8cSmrg    strcpy (cmdbuf, BINDIR);
140629baa8cSmrg    strcat (cmdbuf, "/xdm");
141629baa8cSmrg    args[0] = cmdbuf;
142629baa8cSmrg    args[1] = "-nodaemon";
143629baa8cSmrg    args[2] = "-udpPort";
144629baa8cSmrg    args[3] = "0";
145629baa8cSmrg    args[4] = NULL;
146629baa8cSmrg    if (exec_args (cmdbuf, args) == -1) {
147629baa8cSmrg	fprintf (stderr, "%s:  unable to execute %s (error %d, %s)\r\n",
148629baa8cSmrg		 ProgramName, cmdbuf, errno, strerror(errno));
149629baa8cSmrg	exit (1);
150629baa8cSmrg    }
151629baa8cSmrg
152629baa8cSmrg#ifdef sun
153629baa8cSmrg    strcpy (cmdbuf, BINDIR);
154629baa8cSmrg    strcat (cmdbuf, "/kbd_mode");
155629baa8cSmrg    (void) exec_one_arg (cmdbuf, "-a");
156629baa8cSmrg#endif
157629baa8cSmrg
158629baa8cSmrg    exit (0);
159629baa8cSmrg    /*NOTREACHED*/
160629baa8cSmrg}
161