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