Sun pty problem

Guy Harris guy at auspex.UUCP
Tue Mar 28 06:19:40 AEST 1989


>What happens is that when people use a pty (via sunview or
>rlogin, and usually only ttyp0) it sometimes translates all of the
>characters into ^Ds, thus logging them out.

The pseudo-tty has gotten into "half-remote" mode; the bug that causes
this has been reported to Sun, along with a fix, and the fix will be in
a future release.  If you have source, you can fix it by having the
pseudo-tty *controller* "open" routine check whether the slave is open
(i.e., check whether there is a stream active on the slave side), and
send an M_CTL message with MC_DOCANON as its contents up that stream.

If you don't have source, the attached shell archive contains a program
that takes the pathname for the pseudo-tty *controller* (*not* slave -
e.g., hand it "/dev/ptyp0" rather than "/dev/ttyp0") and fixes it.  The
pseudo-tty controller must *not* be open (i.e., no "shelltool" or
"cmdtool" or "in.rlogind" or "in.telnetd" or... can be using it), since
pseudo-tty controllers are single-use devices.

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  fixup.c
# Wrapped by guy at auspex on Mon Mar 27 12:19:23 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'fixup.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'fixup.c'\"
else
echo shar: Extracting \"'fixup.c'\" \(980 characters\)
sed "s/^X//" >'fixup.c' <<'END_OF_FILE'
X#include <stdio.h>
X
Xextern int	fprintf();
X
X#include <fcntl.h>
X
Xextern int	open();
X
X#include <sys/termio.h>
X
Xextern int	ioctl();
X
X#include <errno.h>
X
Xextern void	perror();
Xextern void	exit();
X
Xstatic char	*strerror();
X
Xint
Xmain(argc, argv)
X	int argc;
X	char **argv;
X{
X	register int fd;
X	int zero = 0;
X
X	if (argc != 2) {
X		(void) fprintf(stderr, "Usage: fixup pseudo-tty\n");
X		return 1;
X	}
X
X	if ((fd = open(argv[1], O_RDWR)) < 0) {
X		(void) fprintf(stderr, "fixup: Can't open %s: %s\n", argv[1],
X		    strerror(errno));
X		return 1;
X	}
X
X	if (ioctl(fd, TIOCREMOTE, &zero) < 0) {
X		(void) fprintf(stderr, "fixup: Can't fix %s: %s\n", argv[1],
X		    strerror(errno));
X		return 1;
X	}
X
X	return 0;
X}
X
Xstatic char *
Xstrerror(errnum)
X	int errnum;
X{
X	extern int sys_nerr;
X	extern char *sys_errlist[];
X	static char msg[6+10+1];	/* "Error "+number+'\0' */
X
X	if (errnum < 0 || errnum > sys_nerr) {
X		(void) sprintf(msg, "Error %d", errnum);
X		return msg;
X	} else
X		return sys_errlist[errnum];
X}
END_OF_FILE
if test 980 -ne `wc -c <'fixup.c'`; then
    echo shar: \"'fixup.c'\" unpacked with wrong size!
fi
# end of 'fixup.c'
fi
echo shar: End of shell archive.
exit 0



More information about the Comp.unix.wizards mailing list