[comp.windows.x] Termination Problem using X11 on Sun3/50

km@emory.uucp (Ken Mandelberg) (09/24/87)

I have been having problems terminating X11 on my Sun 3/50.  I start it
from my login shell on the console with "xinit xterm", and terminate by
exiting the xterm. I get a message to the console from xinit telling me
that it is killing the server. I then see my login shell die, a getty
appear, and getty complain about not being able to read. I am unable to
log back in on the console (no input echos).

When I try a "stty everything </dev/console " from another terminal it
looks sane. If I try a "cat </dev/console", cat aborts saying that the
read would block.

Presumably what is happening is that the console is being left in a
state where "read" returns "-1" continually with an errno of
"EWOULDBLOCK". The shell dies and the getty complains because of this.

I have read the README in server/sun directory. "kbd_mode -a" does no
good. Presumably, I should not even need it since I am terminating X
normally, not abnormally. So far I have found no cure except to reboot,
although I have not tried very much yet. I am running SunOS 3.4 on a
Sun3/50 which is one of the tested configurations.

Any suggestions?
-- 
Ken Mandelberg      |  gatech!emory!km               USENET
Emory University    |  km@emory                      CSNET,BITNET
Dept of Math and CS |  km.emory@csnet-relay          ARPANET 
Atlanta, Ga 30322   |  Phone: (404) 727-7963

km@emory.uucp (Ken Mandelberg) (09/25/87)

I previously reported that "xinit xterm" for X11 on a Sun caused my
shell to die and getty to go mad, on a normal termination.  The problem
was not the kbd_mode issue involved in an abnormal terminiation.

The problem turns out to be my shell. I use ksh, but the same problem
would occur in /bin/sh. Xsun sets FNDELAY via fcntl, and no one
restored it on normal termination. This is not a problem for /bin/csh
which dup's the orginal terminal fd's up to high fd numbers, and dup's
them back when recovering the terminal.  ksh and sh don't do that.

My solution is a modification of xinit to save and restore the fcntl
status flag.  A diff follows:


*** xinit.c	Thu Sep 24 23:14:13 1987
--- xinit.c.orig	Thu Sep 24 23:10:41 1987
***************
*** 13,19 ****
  #include <sys/resource.h>
  #include <sys/wait.h>
  #include <errno.h>
- #include <fcntl.h>
  
  #define	TRUE		1
  #define	FALSE		0
--- 13,18 ----
***************
*** 36,42 ****
  int serverpid = -1;
  int clientpid = -1;
  extern int	errno;
- int flag;	/*save fcntl flag */
  
  sigCatch(sig)
  	int	sig;
--- 35,40 ----
***************
*** 45,51 ****
  	signal(SIGINT, SIG_IGN);
  	Error("signal %d\n", sig);
  	shutdown(serverpid, clientpid);
! 	exitt(1);
  }
  
  main(argc, argv)
--- 43,49 ----
  	signal(SIGINT, SIG_IGN);
  	Error("signal %d\n", sig);
  	shutdown(serverpid, clientpid);
! 	exit(1);
  }
  
  main(argc, argv)
***************
*** 93,100 ****
  		*sptr++ = *argv++;
  	*sptr = NULL;
  
- 	fcntl(2,F_GETFL,&flag);
- 
  	/*
  	 * Start the server and client.
  	 */
--- 91,96 ----
***************
*** 112,119 ****
  	shutdown(serverpid, clientpid);
  
  	if (serverpid < 0 || clientpid < 0)
! 		exitt(ERR_EXIT);
! 	exitt(OK_EXIT);
  }
  
  
--- 108,115 ----
  	shutdown(serverpid, clientpid);
  
  	if (serverpid < 0 || clientpid < 0)
! 		exit(ERR_EXIT);
! 	exit(OK_EXIT);
  }
  
  
***************
*** 187,193 ****
  	char	*fmt;
  {
  	Error(fmt, x0,x1,x2,x3,x4,x5,x6,x7,x8,x9);
! 	exitt(ERR_EXIT);
  }
  
  startServer(server)
--- 183,189 ----
  	char	*fmt;
  {
  	Error(fmt, x0,x1,x2,x3,x4,x5,x6,x7,x8,x9);
! 	exit(ERR_EXIT);
  }
  
  startServer(server)
***************
*** 290,300 ****
  	if (processTimeout(serverpid, 3, "server to die"))
  		Fatal("Can't kill server\n");
  }
- exitt(i) 
- 	int i;
- 	
- {
- 	fcntl(2, F_SETFL,flag);
- 	exit(i);
- }
- 
--- 286,288 ----
-- 
Ken Mandelberg      |  gatech!emory!km               USENET
Emory University    |  km@emory                      CSNET,BITNET
Dept of Math and CS |  km.emory@csnet-relay          ARPANET 
Atlanta, Ga 30322   |  Phone: (404) 727-7963