diff -Nur screen-3.7.1/ansi.c screen-3.7.2/ansi.c --- screen-3.7.1/ansi.c Mon Nov 20 19:03:04 1995 +++ screen-3.7.2/ansi.c Mon Jul 1 14:17:12 1996 @@ -561,6 +561,8 @@ #ifdef COLOR register char *cop, co; #endif + register char **xtable = 0; + register char *c0tab = 0; if (c == '\177') continue; @@ -591,15 +593,21 @@ SetFont(fo); if (D_insert) InsertMode(0); + if (D_xtable) + xtable = D_xtable[(int)(unsigned char)D_rend.font]; + if (D_rend.font == '0') + c0tab = D_c0_tab; } while (currx < cols - 1) { if (display) { - if (D_xtable && D_xtable[(int)(unsigned char)D_rend.font] && D_xtable[(int)(unsigned char)D_rend.font][c]) - AddStr(D_xtable[(int)(unsigned char)D_rend.font][c]); + if (xtable && xtable[c]) + AddStr(xtable[c]); + else if (c0tab) + AddChar(c0tab[c]); else - AddChar(D_rend.font != '0' ? c : D_c0_tab[c]); + AddChar(c); } *imp++ = c; *atp++ = at; @@ -805,11 +813,6 @@ case 'k': StartString(AKA); break; - case '\014': - curr->w_state = TEK; - RAW_PUTCHAR('\033'); - RAW_PUTCHAR(c); - break; default: if (Special(c)) { @@ -873,27 +876,6 @@ goto tryagain; } } - break; - case TEK: - switch (c) - { - case '@': - if ((unsigned char)*(buf - 2) == ' ') /* XXX: Yucc! */ - curr->w_state = TEKESC; - /* FALLTHROUGH */ - default: - RAW_PUTCHAR(c); - break; - } - break; - case TEKESC: - curr->w_state = (c == '\037') ? TEKEND : TEK; - RAW_PUTCHAR(c); - break; - case TEKEND: - if (c == '\030') - curr->w_state = LIT; - RAW_PUTCHAR(c); break; case LIT: default: diff -Nur screen-3.7.1/ansi.h screen-3.7.2/ansi.h --- screen-3.7.1/ansi.h Mon Nov 20 19:03:04 1995 +++ screen-3.7.2/ansi.h Tue Jan 9 19:16:35 1996 @@ -56,10 +56,7 @@ PRIN, /* Printer mode */ PRINESC, /* ESC seen in printer mode */ PRINCSI, /* CSI seen in printer mode */ - PRIN4, /* CSI 4 seen in printer mode */ - TEK, /* Tektronix mode */ - TEKESC, /* Tektronix escape */ - TEKEND /* Tektronix ending sequence */ + PRIN4 /* CSI 4 seen in printer mode */ }; enum string_t diff -Nur screen-3.7.1/attacher.c screen-3.7.2/attacher.c --- screen-3.7.1/attacher.c Mon Nov 20 19:03:04 1995 +++ screen-3.7.2/attacher.c Mon Jul 1 11:59:32 1996 @@ -745,7 +745,7 @@ } #endif pass = ppp->pw_passwd; - if (pass == 0) + if (pass == 0 || *pass == 0) { if ((pass = getpass("Key: "))) { @@ -799,7 +799,7 @@ debug3("getpass(%d): %x == %s\n", errno, (unsigned int)cp1, cp1); if (pass) { - if (!strcmp(crypt(cp1, pass), pass)) + if (!strncmp(crypt(cp1, pass), pass, strlen(pass))) break; } else diff -Nur screen-3.7.1/config.h.in screen-3.7.2/config.h.in --- screen-3.7.1/config.h.in Mon Nov 20 19:08:42 1995 +++ screen-3.7.2/config.h.in Sun Sep 1 23:54:24 1996 @@ -171,6 +171,16 @@ #undef USRLIMIT +/* + * Some terminals, e.g. Wyse 120, use a bitfield to select attributes. + * This doesn't work with the standard so/ul/m? terminal entries, + * because they will cancel each other out. + * On TERMINFO machines, "sa" (sgr) may work. If you want screen + * to switch attributes only with sgr, define USE_SGR. + * This is *not* recomended, do this only if you must. + */ +#undef USE_SGR + /********************************************************************** * diff -Nur screen-3.7.1/configure screen-3.7.2/configure --- screen-3.7.1/configure Mon Nov 20 19:03:04 1995 +++ screen-3.7.2/configure Sun Sep 1 23:54:18 1996 @@ -839,6 +839,7 @@ test -n "$silent" || echo "checking for SVR4" cat > conftest.${ac_ext} < int main() { return 0; } int t() { ; return 0; } @@ -1490,7 +1491,13 @@ #include "confdefs.h" int main() { return 0; } -int t() { tgetent((char *)0, (char *)0);; return 0; } +int t() { +#ifdef __hpux +__sorry_hpux_libcurses_is_totally_broken_in_10_10(); +#else +tgetent((char *)0, (char *)0); +#endif +; return 0; } EOF if eval $ac_compile; then : @@ -1912,12 +1919,12 @@ fi if test -z "$load" ; then test -n "$silent" || echo "checking for kernelfile" -for core in /unix /vmunix /dynix /hp-ux /xelos /386bsd /kernel/unix /unicos /mach /stand/vmunix; do - if test -f $core ; then +for core in /unix /vmunix /dynix /hp-ux /xelos /dev/ksyms /kernel/unix /kernel/genunix /unicos /mach /netbsd /386bsd /dgux /bsd /stand/vmunix; do + if test -f $core || test -c $core; then break fi done -if test ! -f $core ; then +if test ! -f $core && test ! -c $core ; then test -n "$silent" || echo "- no kernelfile found" else test -n "$silent" || echo "- using kernelfile '$core'" diff -Nur screen-3.7.1/configure.in screen-3.7.2/configure.in --- screen-3.7.1/configure.in Mon Nov 20 19:03:04 1995 +++ screen-3.7.2/configure.in Sun Sep 1 23:54:05 1996 @@ -149,7 +149,8 @@ oldlibs="$LIBS" LIBS="$LIBS -lelf" -AC_COMPILE_CHECK(SVR4,,, +AC_COMPILE_CHECK(SVR4,[#include +],, AC_HEADER_CHECK(dwarf.h, AC_DEFINE(SVR4) AC_DEFINE(BUGGYGETLOGIN), AC_HEADER_CHECK(elf.h, AC_DEFINE(SVR4) AC_DEFINE(BUGGYGETLOGIN))) ,LIBS="$oldlibs") @@ -540,7 +541,13 @@ AC_CHECKING(for tgetent) olibs="$LIBS" LIBS="-lcurses $olibs" -AC_COMPILE_CHECK(libcurses,,tgetent((char *)0, (char *)0);,, +AC_COMPILE_CHECK(libcurses,,[ +#ifdef __hpux +__sorry_hpux_libcurses_is_totally_broken_in_10_10(); +#else +tgetent((char *)0, (char *)0); +#endif +],, LIBS="-ltermcap $olibs" AC_COMPILE_CHECK(libtermcap,,tgetent((char *)0, (char *)0);,, LIBS="-ltermlib $olibs" @@ -694,12 +701,12 @@ fi if test -z "$load" ; then AC_CHECKING(for kernelfile) -for core in /unix /vmunix /dynix /hp-ux /xelos /386bsd /kernel/unix /unicos /mach /stand/vmunix; do - if test -f $core ; then +for core in /unix /vmunix /dynix /hp-ux /xelos /dev/ksyms /kernel/unix /kernel/genunix /unicos /mach /netbsd /386bsd /dgux /bsd /stand/vmunix; do + if test -f $core || test -c $core; then break fi done -if test ! -f $core ; then +if test ! -f $core && test ! -c $core ; then AC_NOTE(- no kernelfile found) else AC_NOTE(- using kernelfile '$core') diff -Nur screen-3.7.1/display.c screen-3.7.2/display.c --- screen-3.7.1/display.c Mon Nov 20 19:03:04 1995 +++ screen-3.7.2/display.c Tue Dec 19 12:28:29 1995 @@ -1161,6 +1161,24 @@ if (!display || (old = D_rend.attr) == new) return; +#if defined(TERMINFO) && defined(USE_SGR) + debug1("USE_SGR defined, sa is %s\n", D_SA ? D_SA : "undefined"); + if (D_SA) + { + char *tparm(); + SetFont(ASCII); + tputs(tparm(D_SA, new & A_SO, new & A_US, new & A_RV, new & A_BL, + new & A_DI, new & A_BD, 0 , 0 , + 0), 1, PutChar); + D_rend.attr = new; + D_atyp = 0; +# ifdef COLOR + if (D_CAF || D_CAB) + D_rend.color = 0; +# endif + return; + } +#endif typ = D_atyp; if ((new & old) != old) { diff -Nur screen-3.7.1/doc/Makefile.in screen-3.7.2/doc/Makefile.in --- screen-3.7.1/doc/Makefile.in Mon Nov 20 19:08:45 1995 +++ screen-3.7.2/doc/Makefile.in Sun Sep 1 23:54:27 1996 @@ -27,7 +27,7 @@ -$(MAKE) screen.info -if test -f screen.info; then d=.; else d=$(srcdir); fi; \ if test -f $$d/screen.info; then \ - for f in $$d/screen.info*; do $(INSTALL_DATA) $$f $(infodir)/$$f;done; \ + for f in $$d/screen.info*; do $(INSTALL_DATA) $$f $(infodir);done; \ if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \ install-info --infodir=$(infodir) $$d/screen.info; \ else true; fi; \ diff -Nur screen-3.7.1/doc/screen.1 screen-3.7.2/doc/screen.1 --- screen-3.7.1/doc/screen.1 Mon Nov 20 19:03:15 1995 +++ screen-3.7.2/doc/screen.1 Thu Dec 14 12:29:37 1995 @@ -1694,7 +1694,7 @@ .sp .ne 3 .BR paste -.RI [ registers [ dest_reg ]] +.RI [ registers " [" dest_reg ]] .PP Write the (concatenated) contents of the specified registers to the stdin queue of the current window. The register '.' is treated as the @@ -2078,6 +2078,7 @@ but only if you don't specify a termcap command for that terminal. .IP termcap vt* LP +.br termcap vt102|vt220 Z0=\eE[?3h:Z1=\eE[?3l .PP Specifies the firm-margined `LP' capability for all terminals that begin with diff -Nur screen-3.7.1/etc/screenrc screen-3.7.2/etc/screenrc --- screen-3.7.1/etc/screenrc Mon Nov 20 19:08:44 1995 +++ screen-3.7.2/etc/screenrc Sun Sep 1 23:54:26 1996 @@ -3,7 +3,7 @@ # # This is how one can set a reattach password: -#password ODSJQf.4IJN7E # "1234" +# password ODSJQf.4IJN7E # "1234" # no annoying audible bell, please vbell on @@ -14,9 +14,29 @@ # don't display the copyright page startup_message off -# Extend the vt100 desciption with some sequences. -termcap vt100* ms:AL=\E[%dL:DL=\E[%dM:UP=\E[%dA:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC -terminfo vt100* ms:AL=\E[%p1%dL:DL=\E[%p1%dM:UP=\E[%p1%dA:DO=\E[%p1%dB:LE=\E[%p1%dD:RI=\E[%p1%dC +# emulate .logout message +pow_detach_msg "Screen session of \$LOGNAME \$:cr:\$:nl:ended." + +# advertise hardstatus support to $TERMCAP +# termcapinfo * '' 'hs:ts=\E_:fs=\E\\:ds=\E_\E\\' + +# make the shell in every window a login shell +#shell -$SHELL + +# autoaka testing +# shellaka '> |tcsh' +# shellaka '$ |sh' + +# set every new windows hardstatus line to somenthing descriptive +# defhstatus "screen: ^E (^Et)" + +defscrollback 1000 + + +################ +# +# xterm tweaks +# #xterm understands both im/ic and doesn't have a status line. #Note: Do not specify im and ic in the real termcap/info file as @@ -26,25 +46,59 @@ #80/132 column switching must be enabled for ^AW to work #change init sequence to not switch width -termcap xterm Z0=\E[?3h:Z1=\E[?3l:is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l -terminfo xterm Z0=\E[?3h:Z1=\E[?3l:is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l +termcapinfo xterm Z0=\E[?3h:Z1=\E[?3l:is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l -#make hp700 termcap/info better -termcap hp700 'Z0=\E[?3h:Z1=\E[?3l:hs:ts=\E[62"p\E[0$~\E[2$~\E[1$}:fs=\E[0}\E[61"p:ds=\E[62"p\E[1$~\E[61"p:ic@' -terminfo hp700 'Z0=\E[?3h:Z1=\E[?3l:hs:ts=\E[62"p\E[0$~\E[2$~\E[1$}:fs=\E[0}\E[61"p:ds=\E[62"p\E[1$~\E[61"p:ic@' +# Make the output buffer large for (fast) xterms. +termcapinfo xterm* OL=10000 + +# tell screen that xterm can switch to dark background and has function +# keys. +termcapinfo xterm 'VR=\E[?5h:VN=\E[?5l' +termcapinfo xterm 'k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~' +termcapinfo xterm 'kh=\E[1~:kI=\E[2~:kD=\E[3~:kH=\E[4~:kP=\E[5~:kN=\E[6~' + +# special xterm hardstatus: use the window title. +termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]0;screen\007' + +# our xterm has colors! (rxvt, too) +termcap xterm 'AF=\E[3%dm:AB=\E[4%dm' +terminfo xterm 'AF=\E[3%p1%dm:AB=\E[4%p1%dm' + +#terminfo xterm 'vb=\E[?5h$<200/>\E[?5l' +termcapinfo xterm 'vi=\E[?25l:ve=\E[34h\E[?25h:vs=\E[34l' + +# emulate part of the 'K' charset +termcapinfo xterm 'XC=K%,%\E(B,[\304,\\\\\326,]\334,{\344,|\366,}\374,~\337' + +################ +# +# wyse terminals +# #wyse-75-42 must have flow control (xo = "terminal uses xon/xoff") #essential to have it here, as this is a slow terminal. -termcap wy75-42 xo -terminfo wy75-42 xo +termcapinfo wy75-42 xo:hs@ # New termcap sequences for cursor application mode. -termcap wy* CS=\E[?1h:CE=\E[?1l:vi=\E[?25l:ve=\E[?25h:VR=\E[?5h:VN=\E[?5l:cb=\E[1K:CD=\E[1J -terminfo wy* CS=\E[?1h:CE=\E[?1l:vi=\E[?25l:ve=\E[?25h:VR=\E[?5h:VN=\E[?5l:cb=\E[1K:CD=\E[1J +termcapinfo wy* CS=\E[?1h:CE=\E[?1l:vi=\E[?25l:ve=\E[?25h:VR=\E[?5h:VN=\E[?5l:cb=\E[1K:CD=\E[1J + +################ +# +# other terminals +# + +#make hp700 termcap/info better +termcapinfo hp700 'Z0=\E[?3h:Z1=\E[?3l:hs:ts=\E[62"p\E[0$~\E[2$~\E[1$}:fs=\E[0}\E[61"p:ds=\E[62"p\E[1$~\E[61"p:ic@' + +# Extend the vt100 desciption by some sequences. +termcap vt100* ms:AL=\E[%dL:DL=\E[%dM:UP=\E[%dA:DO=\E[%dB:LE=\E[%dD:RI=\E[%dC +terminfo vt100* ms:AL=\E[%p1%dL:DL=\E[%p1%dM:UP=\E[%p1%dA:DO=\E[%p1%dB:LE=\E[%p1%dD:RI=\E[%p1%dC -# Make the output buffer large for (fast) xterms. -termcap xterm* OL=10000 -terminfo xterm* OL=10000 + +################ +# +# keybindings +# #remove some stupid / dangerous key bindings bind k @@ -61,53 +115,10 @@ bind 'O' login off bind '}' history -pow_detach_msg "Screen session of \$LOGNAME \$:cr:\$:nl:ended." - # Yet another hack: # Prepend/append register [/] to the paste if ^a^] is pressed. # This lets me have autoindent mode in vi. register [ "\033:se noai\015a" register ] "\033:se ai\015a" bind ^] paste [.] - -# tell screen that xterm can switch to dark background and has function -# keys. -terminfo xterm 'VR=\E[?5h:VN=\E[?5l:k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~' -termcap xterm 'VR=\E[?5h:VN=\E[?5l:k1=\E[11~:k2=\E[12~:k3=\E[13~:k4=\E[14~' -termcap xterm 'kh=\E[1~:kI=\E[2~:kD=\E[3~:kH=\E[4~:kP=\E[5~:kN=\E[6~' -terminfo xterm 'kh=\E[1~:kI=\E[2~:kD=\E[3~:kH=\E[4~:kP=\E[5~:kN=\E[6~' - -# special xterm hardstatus: use the window title. -termcap xterm 'hs:ts=\E]2;:fs=\007:ds=\E]0;Screen\007' -terminfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]0;Screen\007' - -# advertise hardstatus support to $TERMCAP -termcap * '' 'hs:ts=\E_:fs=\E\\:ds=\E_\E\\' -terminfo * '' 'hs:ts=\E_:fs=\E\\:ds=\E_\E\\' - -# make the shell in every window a login shell -#shell -$SHELL - -# shellaka '> |tcsh' -# shellaka '$ |sh' - -terminfo wy75-42 'G0:S0=\E(K:E0=\E(B:C0=\104\133\126\134\134\135\144\173\166\174\174\175\137\176' - -terminfo wy75-42 'hs@' - -# our xterm has colors! (rxvt, too) -termcap xterm 'AF=\E[3%dm:AB=\E[4%dm' -terminfo xterm 'AF=\E[3%p1%dm:AB=\E[4%p1%dm' - -# set every new windows hardstatus line to somenthing descriptive -defhstatus "Screen: window \5 (\5t)" - -defscrollback 100 - -#terminfo xterm 'vb=\E[?5h$<200/>\E[?5l' -#termcap xterm 'vi=\E[?25l:ve=\E[34h\E[?25h:vs=\E[34l' - -# emulate part of the 'K' charset -termcap xterm 'XC=K%,%\E(B,[\304,\\\\\326,]\334,{\344,|\366,}\374,~\337' -terminfo xterm 'XC=K%,%\E(B,[\304,\\\\\326,]\334,{\344,|\366,}\374,~\337' diff -Nur screen-3.7.1/etc/toolcheck screen-3.7.2/etc/toolcheck --- screen-3.7.1/etc/toolcheck Mon Nov 20 19:03:15 1995 +++ screen-3.7.2/etc/toolcheck Sun Sep 1 20:29:07 1996 @@ -35,4 +35,10 @@ ;; *) ;; esac + +if [ "$retval" != 0 ]; then + echo " ***********************************************************" + echo " Please fix the above problem before reporting a screen bug!" + echo " ***********************************************************" +fi exit $retval diff -Nur screen-3.7.1/os.h screen-3.7.2/os.h --- screen-3.7.1/os.h Mon Nov 20 19:03:04 1995 +++ screen-3.7.2/os.h Sun Sep 1 23:17:55 1996 @@ -27,7 +27,7 @@ #include -#if defined(BSDI) || defined(__386BSD__) || defined(_CX_UX) +#if defined(BSDI) || defined(__386BSD__) || defined(_CX_UX) || defined(hpux) # include #endif /* BSDI || __386BSD__ || _CX_UX */ @@ -183,15 +183,14 @@ * TIOCPKT mode causes data loss if our buffer is too small (IOSIZE) * to hold the whole packet at first read(). * (Marc Boucher) - */ -#ifdef sgi -# undef TIOCPKT -#endif - -/* matthew green: + * + * matthew green: * TIOCPKT is broken on dgux 5.4.1 generic AViiON mc88100 + * + * Joe Traister: On AIX4, programs like irc won't work if screen + * uses TIOCPKT (select fails to return on pty read). */ -#ifdef DGUX +#if defined(sgi) || defined(DGUX) || defined(_IBMR2) # undef TIOCPKT #endif diff -Nur screen-3.7.1/osdef.h.in screen-3.7.2/osdef.h.in --- screen-3.7.1/osdef.h.in Mon Nov 20 19:03:04 1995 +++ screen-3.7.2/osdef.h.in Thu Apr 18 00:12:34 1996 @@ -61,8 +61,8 @@ #endif #ifdef BSDWAIT -struct rusage; -union wait; +struct rusage; /* for wait3 __P */ +union wait; /* for wait3 __P */ extern int wait3 __P((union wait *, int, struct rusage *)); #else extern int waitpid __P((int, int *, int)); @@ -107,7 +107,7 @@ extern int geteuid __P((void)); extern int getgid __P((void)); extern int getegid __P((void)); -struct passwd; +struct passwd; /* for getpwuid __P */ extern struct passwd *getpwuid __P((int)); extern struct passwd *getpwnam __P((char *)); extern int isatty __P((int)); @@ -137,7 +137,7 @@ #ifdef NAMEDPIPE extern int mknod __P((char *, int, int)); #else -struct sockaddr; +struct sockaddr; /* for connect __P */ extern int socket __P((int, int, int)); extern int connect __P((int, struct sockaddr *, int)); extern int bind __P((int, struct sockaddr *, int)); @@ -159,19 +159,19 @@ #ifdef USEVARARGS extern int vsprintf __P((char *, char *, va_list)); #endif -struct timeval; +struct timeval; /* for select __P */ extern int select __P((int, fd_set *, fd_set *, fd_set *, struct timeval *)); extern void unsetenv __P((char *)); # if defined(GETTTYENT) && !defined(GETUTENT) && !defined(UTNOKEEP) -struct ttyent; +struct ttyent; /* for getttyent __P */ extern void setttyent __P((void)); extern struct ttyent *getttyent __P((void)); # endif #ifdef SVR4 -struct rlimit; +struct rlimit; /* for getrlimit __P */ extern int getrlimit __P((int, struct rlimit *)); #endif diff -Nur screen-3.7.1/patchlevel.h screen-3.7.2/patchlevel.h --- screen-3.7.1/patchlevel.h Mon Nov 20 19:05:56 1995 +++ screen-3.7.2/patchlevel.h Sun Sep 1 23:19:51 1996 @@ -212,13 +212,26 @@ * stripdev changed to translate * /dev/pts to /dev/pts/ (unixware) * -lgen added to GETUTENT configure test. - * 20.11.95 -- 3.07.01 corrected vbell null ptr reference + * 20.11.95 -- 3.07.01 corrected vbell null ptr reference. + * -- DISTRIBUTED + * 1.09.96 -- 3.07.02 added #ifdef MAPKEYS for CheckEscape. + * etc/toolcheck is now shouting louder. + * Touching socket when detach/attach. + * Linux tcflush hack. Linux md5 password suport. + * USE_SGR support for dumb (wyse) terminals. + * "at" and "reset" commands improved. + * Now sensitive to broken AIX4 TIOCPKT. + * tek patch unapplied. + * linux utmp patch: set slot to DEAD_PROCESS. + * include signal.h for killpg if hpux10.10. + * linux: elf, but no SVR4, check for utmpx. + * hpux10.10 libcurses breaks select()! * -- DISTRIBUTED */ #define ORIGIN "FAU" #define REV 3 #define VERS 7 -#define PATCHLEVEL 1 -#define DATE "20-Nov-95" +#define PATCHLEVEL 2 +#define DATE "1-Sep-96" #define STATE "" diff -Nur screen-3.7.1/process.c screen-3.7.2/process.c --- screen-3.7.1/process.c Mon Nov 20 19:03:04 1995 +++ screen-3.7.2/process.c Mon Jul 1 11:54:32 1996 @@ -997,13 +997,16 @@ * set up loops inside of loops, but often allows to do * what you mean, even when you adress your context wrong. */ - i++; + i = 0; if (fore->w_display) display = fore->w_display; DoCommand(args + 1); /* may destroy our display */ - if ((display = fore->w_display)) - Msg(0, "command from %s: %s %s", - s, args[1], args[2] ? args[2] : ""); + if ((fore->w_display)) + { + display = fore->w_display; + Msg(0, "command from %s: %s %s", + s, args[1], args[2] ? args[2] : ""); + } } display = NULL; fore = NULL; @@ -1323,8 +1326,8 @@ WriteString(fore, "\033[H\033[J", 6); break; case RC_RESET: - if (fore->w_state == LIT) - WriteString(fore, "\033c", 2); + fore->w_state = LIT; + WriteString(fore, "\033c", 2); break; case RC_MONITOR: n = fore->w_monitor == MON_ON; @@ -1571,7 +1574,9 @@ Msg(0, "%s: two characters required after defescape.", rc_name); break; } +#ifdef MAPKEYS CheckEscape(); +#endif break; case RC_CHDIR: s = *args ? *args : home; @@ -3685,7 +3690,7 @@ } for (st = 0; st < 2; st++) salt[st] = 'A' + (int)((time(0) >> 6 * st) % 26); - strncpy(Password, crypt(Password, salt), sizeof(Password)); + strncpy(Password, crypt(Password, salt), sizeof(Password) - 1); if (CheckPassword) { #ifdef COPY_PASTE diff -Nur screen-3.7.1/screen.c screen-3.7.2/screen.c --- screen-3.7.1/screen.c Mon Nov 20 19:03:05 1995 +++ screen-3.7.2/screen.c Wed Jul 10 09:55:48 1996 @@ -345,6 +345,9 @@ #ifdef MULTIUSER char *sockp; #endif +#ifdef MAPKEYS + int kmaptimeout; +#endif #if (defined(AUX) || defined(_AUX_SOURCE)) && defined(POSIX) setcompat(COMPAT_POSIX|COMPAT_BSDPROT); /* turn on seteuid support */ @@ -822,8 +825,10 @@ #endif if (n < 13) ppp->pw_passwd = 0; - if (ppp->pw_passwd && strlen(ppp->pw_passwd) > 13) +#ifdef linux + if (ppp->pw_passwd && strlen(ppp->pw_passwd) == 13 + 11) ppp->pw_passwd[13] = 0; /* beware of linux's long passwords */ +#endif home = getenv("HOME"); #if !defined(SOCKDIR) && defined(MULTIUSER) @@ -1328,6 +1333,7 @@ * check to see if a mapping timeout should happen */ #ifdef MAPKEYS + kmaptimeout = 0; tv.tv_usec = 0; for (display = displays; display; display = display->d_next) if (D_seql) @@ -1346,6 +1352,7 @@ continue; tv.tv_sec = 0; tv.tv_usec = maptimeout; + kmaptimeout = 1; break; } #endif @@ -1402,7 +1409,7 @@ { if (D_seql == 0) continue; - if ((nsel == 0 && tv.tv_sec == 0 && tv.tv_usec) || D_seqruns++ * 50000 > maptimeout) + if ((nsel == 0 && kmaptimeout) || D_seqruns++ * 50000 > maptimeout) { debug1("Flushing map sequence (%d runs)\n", D_seqruns); fore = D_fore; @@ -1828,6 +1835,8 @@ (void) chown(p->w_tty, 0, 0); close(p->w_ptyfd); p->w_ptyfd = -1; + /* zap saved utmp as the slot may change */ + bzero((char *)&p->w_savut, sizeof(p->w_savut)); p->w_pid = 0; ResetWindow(p); p->w_y = p->w_bot; diff -Nur screen-3.7.1/socket.c screen-3.7.2/socket.c --- screen-3.7.1/socket.c Mon Nov 20 19:03:05 1995 +++ screen-3.7.2/socket.c Mon Jul 1 13:58:58 1996 @@ -694,9 +694,8 @@ int pid; char *pwd, *utty; { - if (CheckPassword && - strcmp(crypt(pwd, (strlen(Password) > 1) ? Password : "JW"), - Password)) + if (CheckPassword && *Password && + strncmp(crypt(pwd, (strlen(Password) > 1) ? Password : "JW"), Password, strlen(Password))) { if (*pwd) { @@ -1156,6 +1155,13 @@ return UserStatus(); } r = chmod(SockPath, SOCKMODE); + /* + * Sockets usually reside in the /tmp/ area, where sysadmin scripts + * may be happy to remove old files. We manually prevent the socket + * from becoming old. (chmod does not touch mtime). + */ + (void)utime(SockPath, NULL); + if (euid != real_uid) UserReturn(r); return r; diff -Nur screen-3.7.1/term.c screen-3.7.2/term.c --- screen-3.7.1/term.c Mon Nov 20 19:03:05 1995 +++ screen-3.7.2/term.c Tue Dec 5 15:54:54 1995 @@ -110,6 +110,7 @@ { "ms", T_FLG }, { "sg", T_NUM }, { "ug", T_NUM }, + { "sa", T_STR }, /* color */ { "AF", T_STR }, diff -Nur screen-3.7.1/term.h.dist screen-3.7.2/term.h.dist --- screen-3.7.1/term.h.dist Mon Nov 20 19:03:39 1995 +++ screen-3.7.2/term.h.dist Wed Jul 10 09:49:50 1996 @@ -138,98 +138,100 @@ #define D_SG (D_tcs[57].num) #define d_UG d_tcs[58].num #define D_UG (D_tcs[58].num) -#define d_CAF d_tcs[59].str -#define D_CAF (D_tcs[59].str) -#define d_CAB d_tcs[60].str -#define D_CAB (D_tcs[60].str) -#define d_CSF d_tcs[61].str -#define D_CSF (D_tcs[61].str) -#define d_CSB d_tcs[62].str -#define D_CSB (D_tcs[62].str) -#define d_CAX d_tcs[63].flg -#define D_CAX (D_tcs[63].flg) -#define d_KS d_tcs[64].str -#define D_KS (D_tcs[64].str) -#define d_KE d_tcs[65].str -#define D_KE (D_tcs[65].str) -#define d_CCS d_tcs[66].str -#define D_CCS (D_tcs[66].str) -#define d_CCE d_tcs[67].str -#define D_CCE (D_tcs[67].str) -#define d_PO d_tcs[68].str -#define D_PO (D_tcs[68].str) -#define d_PF d_tcs[69].str -#define D_PF (D_tcs[69].str) -#define d_HS d_tcs[70].flg -#define D_HS (D_tcs[70].flg) -#define d_WS d_tcs[71].num -#define D_WS (D_tcs[71].num) -#define d_TS d_tcs[72].str -#define D_TS (D_tcs[72].str) -#define d_FS d_tcs[73].str -#define D_FS (D_tcs[73].str) -#define d_DS d_tcs[74].str -#define D_DS (D_tcs[74].str) -#define d_VI d_tcs[75].str -#define D_VI (D_tcs[75].str) -#define d_VS d_tcs[76].str -#define D_VS (D_tcs[76].str) -#define d_VE d_tcs[77].str -#define D_VE (D_tcs[77].str) -#define d_AM d_tcs[78].flg -#define D_AM (D_tcs[78].flg) -#define d_XV d_tcs[79].flg -#define D_XV (D_tcs[79].flg) -#define d_XN d_tcs[80].flg -#define D_XN (D_tcs[80].flg) -#define d_COP d_tcs[81].flg -#define D_COP (D_tcs[81].flg) -#define d_CLP d_tcs[82].flg -#define D_CLP (D_tcs[82].flg) -#define d_CNF d_tcs[83].flg -#define D_CNF (D_tcs[83].flg) -#define d_NX d_tcs[84].flg -#define D_NX (D_tcs[84].flg) -#define d_CAN d_tcs[85].flg -#define D_CAN (D_tcs[85].flg) -#define d_COL d_tcs[86].num -#define D_COL (D_tcs[86].num) -#define d_CKJ d_tcs[87].str -#define D_CKJ (D_tcs[87].str) -#define d_CVR d_tcs[88].str -#define D_CVR (D_tcs[88].str) -#define d_CVN d_tcs[89].str -#define D_CVN (D_tcs[89].str) -#define d_CG0 d_tcs[90].flg -#define D_CG0 (D_tcs[90].flg) -#define d_CS0 d_tcs[91].str -#define D_CS0 (D_tcs[91].str) -#define d_CE0 d_tcs[92].str -#define D_CE0 (D_tcs[92].str) -#define d_CC0 d_tcs[93].str -#define D_CC0 (D_tcs[93].str) -#define d_AS d_tcs[94].str -#define D_AS (D_tcs[94].str) -#define d_AE d_tcs[95].str -#define D_AE (D_tcs[95].str) -#define d_AC d_tcs[96].str -#define D_AC (D_tcs[96].str) -#define d_EA d_tcs[97].str -#define D_EA (D_tcs[97].str) -#define d_CXC d_tcs[98].str -#define D_CXC (D_tcs[98].str) -#define T_CAPS 99 -#define T_CURSOR 138 -#define T_KEYPAD 142 -#define T_OCAPS 160 -#define T_ECAPS 173 -#define T_N 173 +#define d_SA d_tcs[59].str +#define D_SA (D_tcs[59].str) +#define d_CAF d_tcs[60].str +#define D_CAF (D_tcs[60].str) +#define d_CAB d_tcs[61].str +#define D_CAB (D_tcs[61].str) +#define d_CSF d_tcs[62].str +#define D_CSF (D_tcs[62].str) +#define d_CSB d_tcs[63].str +#define D_CSB (D_tcs[63].str) +#define d_CAX d_tcs[64].flg +#define D_CAX (D_tcs[64].flg) +#define d_KS d_tcs[65].str +#define D_KS (D_tcs[65].str) +#define d_KE d_tcs[66].str +#define D_KE (D_tcs[66].str) +#define d_CCS d_tcs[67].str +#define D_CCS (D_tcs[67].str) +#define d_CCE d_tcs[68].str +#define D_CCE (D_tcs[68].str) +#define d_PO d_tcs[69].str +#define D_PO (D_tcs[69].str) +#define d_PF d_tcs[70].str +#define D_PF (D_tcs[70].str) +#define d_HS d_tcs[71].flg +#define D_HS (D_tcs[71].flg) +#define d_WS d_tcs[72].num +#define D_WS (D_tcs[72].num) +#define d_TS d_tcs[73].str +#define D_TS (D_tcs[73].str) +#define d_FS d_tcs[74].str +#define D_FS (D_tcs[74].str) +#define d_DS d_tcs[75].str +#define D_DS (D_tcs[75].str) +#define d_VI d_tcs[76].str +#define D_VI (D_tcs[76].str) +#define d_VS d_tcs[77].str +#define D_VS (D_tcs[77].str) +#define d_VE d_tcs[78].str +#define D_VE (D_tcs[78].str) +#define d_AM d_tcs[79].flg +#define D_AM (D_tcs[79].flg) +#define d_XV d_tcs[80].flg +#define D_XV (D_tcs[80].flg) +#define d_XN d_tcs[81].flg +#define D_XN (D_tcs[81].flg) +#define d_COP d_tcs[82].flg +#define D_COP (D_tcs[82].flg) +#define d_CLP d_tcs[83].flg +#define D_CLP (D_tcs[83].flg) +#define d_CNF d_tcs[84].flg +#define D_CNF (D_tcs[84].flg) +#define d_NX d_tcs[85].flg +#define D_NX (D_tcs[85].flg) +#define d_CAN d_tcs[86].flg +#define D_CAN (D_tcs[86].flg) +#define d_COL d_tcs[87].num +#define D_COL (D_tcs[87].num) +#define d_CKJ d_tcs[88].str +#define D_CKJ (D_tcs[88].str) +#define d_CVR d_tcs[89].str +#define D_CVR (D_tcs[89].str) +#define d_CVN d_tcs[90].str +#define D_CVN (D_tcs[90].str) +#define d_CG0 d_tcs[91].flg +#define D_CG0 (D_tcs[91].flg) +#define d_CS0 d_tcs[92].str +#define D_CS0 (D_tcs[92].str) +#define d_CE0 d_tcs[93].str +#define D_CE0 (D_tcs[93].str) +#define d_CC0 d_tcs[94].str +#define D_CC0 (D_tcs[94].str) +#define d_AS d_tcs[95].str +#define D_AS (D_tcs[95].str) +#define d_AE d_tcs[96].str +#define D_AE (D_tcs[96].str) +#define d_AC d_tcs[97].str +#define D_AC (D_tcs[97].str) +#define d_EA d_tcs[98].str +#define D_EA (D_tcs[98].str) +#define d_CXC d_tcs[99].str +#define D_CXC (D_tcs[99].str) +#define T_CAPS 100 +#define T_CURSOR 139 +#define T_KEYPAD 143 +#define T_OCAPS 161 +#define T_ECAPS 174 +#define T_N 174 #ifdef MAPKEYS -# define KMAPDEFSTART 99 +# define KMAPDEFSTART 100 # define NKMAPDEF 61 -# define KMAPADEFSTART 138 +# define KMAPADEFSTART 139 # define NKMAPADEF 22 -# define KMAPMDEFSTART 113 +# define KMAPMDEFSTART 114 # define NKMAPMDEF 29 #endif diff -Nur screen-3.7.1/terminfo/screencap screen-3.7.2/terminfo/screencap --- screen-3.7.1/terminfo/screencap Mon Nov 20 19:03:15 1995 +++ screen-3.7.2/terminfo/screencap Sat Jan 6 23:06:24 1996 @@ -1,7 +1,7 @@ SC|screen|VT 100/ANSI X3.64 virtual terminal:\ :am:xn:ms:mi:G0:km:\ :DO=\E[%dB:LE=\E[%dD:RI=\E[%dC:UP=\E[%dA:bs:bt=\E[Z:\ - :cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:ct=\E[3g:\ + :cb=\E[1K:cd=\E[J:ce=\E[K:cl=\E[H\E[J:cm=\E[%i%d;%dH:ct=\E[3g:\ :do=^J:nd=\E[C:pt:rc=\E8:rs=\Ec:sc=\E7:st=\EH:up=\EM:\ :le=^H:bl=^G:cr=^M:it#8:ho=\E[H:nw=\EE:ta=^I:is=\E)0:\ :li#24:co#80:us=\E[4m:ue=\E[24m:so=\E[3m:se=\E[23m:\ diff -Nur screen-3.7.1/terminfo/screeninfo.src screen-3.7.2/terminfo/screeninfo.src --- screen-3.7.1/terminfo/screeninfo.src Mon Nov 20 19:03:15 1995 +++ screen-3.7.2/terminfo/screeninfo.src Sat Jan 6 23:07:50 1996 @@ -6,7 +6,7 @@ cub=\E[%p1%dD, cub1=\b, cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM, dch=\E[%p1%dP, dch1=\E[P, - dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, + dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0, home=\E[H, ht=\t, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n, is2=\E)0, kbs=\b, kcub1=\EOD, kcud1=\EOB, @@ -30,7 +30,7 @@ cub=\E[%p1%dD, cub1=\b, cud=\E[%p1%dB, cud1=\n, cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\EM, dch=\E[%p1%dP, dch1=\E[P, - dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, + dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, el=\E[K, el1=\E[1K, enacs=\E(B\E)0, home=\E[H, ht=\t, hts=\EH, ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=\n, is2=\E)0, kbs=\b, kcub1=\EOD, kcud1=\EOB, diff -Nur screen-3.7.1/utmp.c screen-3.7.2/utmp.c --- screen-3.7.1/utmp.c Mon Nov 20 19:03:05 1995 +++ screen-3.7.2/utmp.c Fri Aug 23 13:57:44 1996 @@ -299,6 +299,9 @@ bcopy((char *)&D_utmp_logintty, (char *)&u, sizeof(u)); bzero(u.ut_name, sizeof(u.ut_name)); bzero(u.ut_host, sizeof(u.ut_host)); +# ifdef linux + u.ut_type = DEAD_PROCESS; +# endif # endif /* UT_UNSORTED */ (void) lseek(utmpfd, (off_t) (D_loginslot * sizeof(u)), 0); if (write(utmpfd, (char *) &u, sizeof(u)) != sizeof(u)) @@ -622,6 +625,9 @@ bcopy((char *)&wi->w_savut, (char *)&u, sizeof(u)); bzero(u.ut_name, sizeof(u.ut_name)); bzero(u.ut_host, sizeof(u.ut_host)); +# ifdef linux + u.ut_type = DEAD_PROCESS; +# endif # endif /* UT_UNSORTED */ (void) lseek(utmpfd, (off_t) (slot * sizeof(u)), 0); if (write(utmpfd, (char *) &u, sizeof(u)) != sizeof(u)) diff -Nur screen-3.7.1/window.c screen-3.7.2/window.c --- screen-3.7.1/window.c Mon Nov 20 19:03:05 1995 +++ screen-3.7.2/window.c Mon May 13 22:54:44 1996 @@ -424,6 +424,23 @@ #endif /* TIOCPKT */ } (void) fcntl(f, F_SETFL, FNBLOCK); +#ifdef linux + /* + * Tenebreux (zeus@ns.acadiacom.net) has Linux 1.3.70 where select gets + * confused in the following condition: + * Open a pty-master side, request a flush on it, then set packet mode. + * and call select(). Select will return a possible read, where the + * one byte response to the flush can be found. Select will thereafter + * return a possible read, which yields I/O error. + * + * If we request another flush *after* switching into packet mode, this + * I/O error does not occur. We receive a single response byte although we + * send two flush requests now. Maybe we should not flush at all. + * + * 10.5.96 jw. + */ + tcflush(f, TCIOFLUSH); +#endif #ifdef PTYGROUP (void) chown(*namep, real_uid, PTYGROUP); #else @@ -700,10 +717,12 @@ if (*proc == '-') proc++; + if (!*proc) + proc = DefaultShell; debug1("calling execvpe %s\n", proc); execvpe(proc, args, NewEnv); debug1("exec error: %d\n", errno); - SendErrorMsg("Cannot exec %s: %s", proc, strerror(errno)); + SendErrorMsg("Cannot exec '%s': %s", proc, strerror(errno)); exit(1); default: break; @@ -1017,7 +1036,7 @@ debug("\n"); #endif execvpe(*av, av, environ); - SendErrorMsg("Cannot exec %s: %s", *av, strerror(errno)); + SendErrorMsg("Cannot exec '%s': %s", *av, strerror(errno)); exit(1); default: break;