chk%alias@csri.toronto.edu (C. Harald Koch) (11/28/90)
It turns out that the patches I mentioned previously are very simple; I forgot that I had figured out an easy preliminary fix. For those of you who need to get X terminals working under XDMCP, I submit the following. This enables support for XDMCP at the expense of disabling support for the Xservers file. I am working on a proper fix, but it is low on my list of priorities. Basically, the fix is to call WaitForSomething() instead of WaitForChild() on sgi machines. Normally, the code there will also process dead children (necessary for Xservers support) but the code also relies heavily on BSD signal semantics, and fails on SysV machines. SIGCHLD is ignored to prevent zombies from building up and filling your process table; otherwise this is a problem because the children are never reaped. Use at your own risk. :-) ----------Cut-Here----------------------------- *** dm.c.orig Tue Oct 16 15:39:41 1990 --- dm.c Wed Oct 24 15:17:11 1990 *************** *** 111,117 **** ScanServers (); StartDisplays (); (void) signal (SIGHUP, RescanNotify); ! #ifndef SYSV (void) signal (SIGCHLD, ChildNotify); #endif while (AnyWellKnownSockets() || AnyDisplaysLeft ()) --- 122,130 ---- ScanServers (); StartDisplays (); (void) signal (SIGHUP, RescanNotify); ! #ifdef SYSV ! (void) signal (SIGCHLD, SIG_IGN); ! #else (void) signal (SIGCHLD, ChildNotify); #endif while (AnyWellKnownSockets() || AnyDisplaysLeft ()) *************** *** 121,127 **** RescanServers (); Rescan = 0; } ! #ifdef SYSV WaitForChild (); #else WaitForSomething (); --- 134,140 ---- RescanServers (); Rescan = 0; } ! #if defined(SYSV) && !defined(sgi) WaitForChild (); #else WaitForSomething (); -- C. Harald Koch VE3TLA Alias Research, Inc., Toronto ON Canada chk%alias@csri.utoronto.ca chk@gpu.utcs.toronto.edu chk@chk.mef.org "Open the Zamboni! We're coming out!" - Kathrin Garland and Anson James, 2299
chk%alias@csri.toronto.edu (C. Harald Koch) (12/03/90)
In <1990Nov27.213113.8766@alias.uucp> I write: >Basically, the fix is to call WaitForSomething() instead of WaitForChild() >on sgi machines. Normally, the code there will also process dead children >(necessary for Xservers support) but the code also relies heavily on BSD >signal semantics, and fails on SysV machines. Heh. I have been informed that IRIX now supports BSD signals also, if you link with the -lbsd library. To get the MIT distribution to do this, you have to change mit/config/sgi.cf to still use -lbsd as a link library under 3.3. The changes are near the top of sgi.cf, where it checks for MajorRevision == 3 and MinorRevision <= 2; add '-lbsd' to the list of libraries used under 3.3. Also, you have to change many of the occurrences of #ifdef SYSV to #if defined(SYSV) && !defined(sgi). I have included my current set of patches to XDM below; there are a couple of changes that make debugging a) easier and b) more secure hidden in there, but other than that the changes are for compiling full functionality under IRIX 3.3. As usual, these patches have been tested but not very well, since we have a limited environment here. Use at your own risk. Enjoy! ---------- Cut Here ---------- diff -r -c ../xdm.DIST/daemon.c ./daemon.c *** ../xdm.DIST/daemon.c Wed Sep 12 16:46:18 1990 --- ./daemon.c Wed Oct 24 14:55:49 1990 *************** *** 25,30 **** --- 25,31 ---- #endif extern void exit (); + extern int debugLevel; BecomeDaemon () { *************** *** 50,57 **** #endif close (0); ! close (1); ! close (2); if ((i = open ("/dev/tty", O_RDWR)) >= 0) { /* did open succeed? */ #if defined(SYSV) && defined(TIOCTTY) --- 51,60 ---- #endif close (0); ! if (debugLevel == 0) { ! close (1); ! close (2); ! } if ((i = open ("/dev/tty", O_RDWR)) >= 0) { /* did open succeed? */ #if defined(SYSV) && defined(TIOCTTY) *************** *** 67,72 **** * Set up the standard file descriptors. */ (void) open ("/", O_RDONLY); /* root inode already in core */ ! (void) dup2 (0, 1); ! (void) dup2 (0, 2); } --- 70,77 ---- * Set up the standard file descriptors. */ (void) open ("/", O_RDONLY); /* root inode already in core */ ! if (debugLevel == 0) { ! (void) dup2 (0, 1); ! (void) dup2 (0, 2); ! } } diff -r -c ../xdm.DIST/dm.c ./dm.c *** ../xdm.DIST/dm.c Tue Sep 18 10:53:43 1990 --- ./dm.c Mon Dec 3 11:52:37 1990 *************** *** 60,66 **** char **argv; { int oldpid, oldumask; ! #ifndef SYSV static SIGVAL ChildNotify (); #endif --- 60,66 ---- char **argv; { int oldpid, oldumask; ! #if !defined(SYSV) || defined(sgi) static SIGVAL ChildNotify (); #endif *************** *** 86,93 **** fprintf (stderr, "Only root wants to run %s\n", argv[0]); exit (1); } ! if (debugLevel == 0 && daemonMode) ! BecomeDaemon (); if (oldpid = StorePid ()) { if (oldpid == -1) --- 86,104 ---- fprintf (stderr, "Only root wants to run %s\n", argv[0]); exit (1); } ! if (daemonMode) { ! if (debugLevel) { ! int fd; ! if ((fd = open("/tmp/xdm.debug", O_CREAT|O_TRUNC|O_WRONLY, 0666)) == -1) { ! debugLevel = 0; ! } ! else { ! dup2(fd, 1); ! dup2(fd, 2); ! } ! } ! BecomeDaemon (); ! } if (oldpid = StorePid ()) { if (oldpid == -1) *************** *** 111,119 **** ScanServers (); StartDisplays (); (void) signal (SIGHUP, RescanNotify); - #ifndef SYSV (void) signal (SIGCHLD, ChildNotify); ! #endif while (AnyWellKnownSockets() || AnyDisplaysLeft ()) { if (Rescan) --- 122,129 ---- ScanServers (); StartDisplays (); (void) signal (SIGHUP, RescanNotify); (void) signal (SIGCHLD, ChildNotify); ! while (AnyWellKnownSockets() || AnyDisplaysLeft ()) { if (Rescan) *************** *** 121,127 **** RescanServers (); Rescan = 0; } ! #ifdef SYSV WaitForChild (); #else WaitForSomething (); --- 131,137 ---- RescanServers (); Rescan = 0; } ! #if defined(SYSV) && !defined(sgi) WaitForChild (); #else WaitForSomething (); *************** *** 135,141 **** { Debug ("Caught SIGHUP\n"); Rescan = 1; ! #ifdef SYSV signal (SIGHUP, RescanNotify); #endif } --- 145,151 ---- { Debug ("Caught SIGHUP\n"); Rescan = 1; ! #if defined(SYSV) && !defined(sgi) signal (SIGHUP, RescanNotify); #endif } *************** *** 248,254 **** Debug ("Shutting down entire manager\n"); DestroyWellKnownSockets (); ForEachDisplay (StopDisplay); ! #ifdef SYSV /* to avoid another one from killing us unceremoniously */ (void) signal (SIGTERM, StopAll); (void) signal (SIGINT, StopAll); --- 258,264 ---- Debug ("Shutting down entire manager\n"); DestroyWellKnownSockets (); ForEachDisplay (StopDisplay); ! #if defined(SYSV) && !defined(sgi) /* to avoid another one from killing us unceremoniously */ (void) signal (SIGTERM, StopAll); (void) signal (SIGINT, StopAll); *************** *** 262,272 **** int ChildReady; ! #ifndef SYSV static SIGVAL ChildNotify () { ChildReady = 1; } #endif --- 272,282 ---- int ChildReady; ! #if !defined(SYSV) || defined(sgi) static SIGVAL ChildNotify () { ChildReady = 1; } #endif *************** *** 277,283 **** waitType status; int mask; ! #ifdef SYSV /* XXX classic sysV signal race condition here with RescanNotify */ if ((pid = wait (&status)) != -1) #else --- 287,293 ---- waitType status; int mask; ! #if defined(SYSV) && !defined(sgi) /* XXX classic sysV signal race condition here with RescanNotify */ if ((pid = wait (&status)) != -1) #else diff -r -c ../xdm.DIST/dm.h ./dm.h *** ../xdm.DIST/dm.h Wed Sep 12 16:46:16 1990 --- ./dm.h Mon Dec 3 11:48:02 1990 *************** *** 35,41 **** #undef dirty /* Some bozo put a macro called dirty in sys/param.h */ #endif /* pegasus */ ! #ifdef SYSV # define waitCode(w) (((w) >> 8) & 0xff) # define waitSig(w) ((w) & 0xff) typedef int waitType; --- 35,41 ---- #undef dirty /* Some bozo put a macro called dirty in sys/param.h */ #endif /* pegasus */ ! #if defined(SYSV) && !defined(sgi) # define waitCode(w) (((w) >> 8) & 0xff) # define waitSig(w) ((w) & 0xff) typedef int waitType; diff -r -c ../xdm.DIST/server.c ./server.c *** ../xdm.DIST/server.c Tue Sep 18 10:53:44 1990 --- ./server.c Mon Dec 3 10:52:40 1990 *************** *** 36,42 **** static SIGVAL CatchUsr1 () { ! #ifdef SYSV (void) signal (SIGUSR1, CatchUsr1); #endif Debug ("display manager caught SIGUSR1\n"); --- 36,42 ---- static SIGVAL CatchUsr1 () { ! #if defined(SYSV) && !defined(sgi) (void) signal (SIGUSR1, CatchUsr1); #endif Debug ("display manager caught SIGUSR1\n"); *************** *** 138,144 **** if (!setjmp (pauseAbort)) { signal (SIGALRM, serverPauseAbort); signal (SIGUSR1, serverPauseUsr1); ! #ifdef SYSV if (receivedUsr1) alarm ((unsigned) 1); else --- 138,144 ---- if (!setjmp (pauseAbort)) { signal (SIGALRM, serverPauseAbort); signal (SIGUSR1, serverPauseUsr1); ! #if defined(SYSV) && !defined(sgi) if (receivedUsr1) alarm ((unsigned) 1); else *************** *** 150,156 **** Debug ("Already received USR1\n"); #endif for (;;) { ! #ifdef SYSV pid = wait ((waitType *) 0); #else if (!receivedUsr1) --- 150,156 ---- Debug ("Already received USR1\n"); #endif for (;;) { ! #if defined(SYSV) && !defined(sgi) pid = wait ((waitType *) 0); #else if (!receivedUsr1) *************** *** 166,172 **** serverPauseRet = 1; break; } ! #ifndef SYSV if (pid == 0) { Debug ("Server alive and kicking\n"); break; --- 166,172 ---- serverPauseRet = 1; break; } ! #if !defined(SYSV) || defined(sgi) if (pid == 0) { Debug ("Server alive and kicking\n"); break; diff -r -c ../xdm.DIST/session.c ./session.c *** ../xdm.DIST/session.c Tue Sep 18 10:53:43 1990 --- ./session.c Mon Dec 3 10:52:40 1990 *************** *** 443,449 **** char **environ; { execve (argv[0], argv, environ); ! #ifdef SYSV /* * shell scripts can't be run in SYSV directly */ --- 443,449 ---- char **environ; { execve (argv[0], argv, environ); ! #if defined(SYSV) && !defined(sgi) /* * shell scripts can't be run in SYSV directly */ diff -r -c ../xdm.DIST/verify.c ./verify.c *** ../xdm.DIST/verify.c Wed Sep 12 16:46:17 1990 --- ./verify.c Wed Oct 24 14:34:09 1990 *************** *** 49,55 **** p = getpwnam (greet->name); if (!p || strlen (greet->name) == 0) p = &joeblow; ! Debug ("Verify %s %s\n", greet->name, greet->password); if (strcmp (crypt (greet->password, p->pw_passwd), p->pw_passwd)) { Debug ("verify failed\n"); bzero(greet->password, strlen(greet->password)); --- 49,55 ---- p = getpwnam (greet->name); if (!p || strlen (greet->name) == 0) p = &joeblow; ! Debug ("Verify %s\n", greet->name, greet->password); if (strcmp (crypt (greet->password, p->pw_passwd), p->pw_passwd)) { Debug ("verify failed\n"); bzero(greet->password, strlen(greet->password)); *************** *** 94,99 **** --- 94,100 ---- env = setEnv (env, "DISPLAY", d->name); env = setEnv (env, "HOME", home); + env = setEnv (env, "LOGNAME", user); env = setEnv (env, "USER", user); env = setEnv (env, "PATH", d->userPath); env = setEnv (env, "SHELL", shell); *************** *** 109,114 **** --- 110,116 ---- env = setEnv (env, "DISPLAY", d->name); env = setEnv (env, "HOME", home); + env = setEnv (env, "LOGNAME", user); env = setEnv (env, "USER", user); env = setEnv (env, "PATH", d->systemPath); env = setEnv (env, "SHELL", d->systemShell); diff -r -c ../xdm.DIST/xdmshell.c ./xdmshell.c *** ../xdm.DIST/xdmshell.c Tue Sep 18 10:53:43 1990 --- ./xdmshell.c Mon Dec 3 11:54:07 1990 *************** *** 85,91 **** if (access (filename, X_OK) != 0) return -1; ! #ifdef SYSV status = 0; #else waitCode (status) = 0; --- 85,91 ---- if (access (filename, X_OK) != 0) return -1; ! #if defined(SYSV) && !defined(sgi) status = 0; #else waitCode (status) = 0; ---------- Cut Here ---------- -- C. Harald Koch VE3TLA Alias Research, Inc., Toronto ON Canada chk%alias@csri.utoronto.ca chk@gpu.utcs.toronto.edu chk@chk.mef.org "Open the Zamboni! We're coming out!" - Kathrin Garland and Anson James, 2299