summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjnweiger <jnweiger>2005-12-16 18:00:13 +0000
committerjnweiger <jnweiger>2005-12-16 18:00:13 +0000
commit58c7144733b65d27044a7ed69f0469420b75de26 (patch)
treef16c1e41f996a5b1f407274765316b3227a38310
parent80a04457c6a81cf26536bfa8463f6b78fd92c9a4 (diff)
downloadscreen-58c7144733b65d27044a7ed69f0469420b75de26.tar.gz
old version screen-3.7.2 May 13 1996
-rw-r--r--src/ansi.c40
-rw-r--r--src/ansi.h5
-rw-r--r--src/attacher.c4
-rw-r--r--src/config.h.in10
-rwxr-xr-xsrc/configure15
-rw-r--r--src/configure.in17
-rw-r--r--src/display.c18
-rw-r--r--src/doc/Makefile.in2
-rw-r--r--src/doc/screen.13
-rw-r--r--src/etc/screenrc129
-rwxr-xr-xsrc/etc/toolcheck6
-rw-r--r--src/os.h15
-rw-r--r--src/osdef.h.in14
-rw-r--r--src/patchlevel.h19
-rw-r--r--src/process.c19
-rw-r--r--src/screen.c13
-rw-r--r--src/socket.c12
-rw-r--r--src/term.c1
-rw-r--r--src/term.h.dist180
-rw-r--r--src/terminfo/screencap2
-rw-r--r--src/terminfo/screeninfo.src4
-rw-r--r--src/utmp.c6
-rw-r--r--src/window.c23
23 files changed, 328 insertions, 229 deletions
diff --git a/src/ansi.c b/src/ansi.c
index 7519b16..e93f96d 100644
--- a/src/ansi.c
+++ b/src/ansi.c
@@ -561,6 +561,8 @@ register int len;
#ifdef COLOR
register char *cop, co;
#endif
+ register char **xtable = 0;
+ register char *c0tab = 0;
if (c == '\177')
continue;
@@ -591,15 +593,21 @@ register int len;
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 @@ skip: if (--len == 0)
case 'k':
StartString(AKA);
break;
- case '\014':
- curr->w_state = TEK;
- RAW_PUTCHAR('\033');
- RAW_PUTCHAR(c);
- break;
default:
if (Special(c))
{
@@ -874,27 +877,6 @@ skip: if (--len == 0)
}
}
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:
if (c < ' ')
diff --git a/src/ansi.h b/src/ansi.h
index 6634e4b..c4ae0ce 100644
--- a/src/ansi.h
+++ b/src/ansi.h
@@ -56,10 +56,7 @@ enum state_t
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 --git a/src/attacher.c b/src/attacher.c
index 33ede26..480604f 100644
--- a/src/attacher.c
+++ b/src/attacher.c
@@ -745,7 +745,7 @@ screen_builtin_lck()
}
#endif
pass = ppp->pw_passwd;
- if (pass == 0)
+ if (pass == 0 || *pass == 0)
{
if ((pass = getpass("Key: ")))
{
@@ -799,7 +799,7 @@ screen_builtin_lck()
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 --git a/src/config.h.in b/src/config.h.in
index eee2a79..03bf32e 100644
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -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 --git a/src/configure b/src/configure
index 8706866..4ab7d58 100755
--- a/src/configure
+++ b/src/configure
@@ -839,6 +839,7 @@ LIBS="$LIBS -lelf"
test -n "$silent" || echo "checking for SVR4"
cat > conftest.${ac_ext} <<EOF
#include "confdefs.h"
+#include <utmpx.h>
int main() { return 0; }
int t() { ; return 0; }
@@ -1490,7 +1491,13 @@ cat > conftest.${ac_ext} <<EOF
#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 @@ rm -f conftest*
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 --git a/src/configure.in b/src/configure.in
index f743154..b4fcee4 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -149,7 +149,8 @@ AC_PROGRAM_EGREP(yes,
oldlibs="$LIBS"
LIBS="$LIBS -lelf"
-AC_COMPILE_CHECK(SVR4,,,
+AC_COMPILE_CHECK(SVR4,[#include <utmpx.h>
+],,
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 @@ dnl
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 @@ AC_PROGRAM_EGREP(yes,
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 --git a/src/display.c b/src/display.c
index 5ffef82..54d6213 100644
--- a/src/display.c
+++ b/src/display.c
@@ -1161,6 +1161,24 @@ register int new;
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 --git a/src/doc/Makefile.in b/src/doc/Makefile.in
index 3f11826..ce1930b 100644
--- a/src/doc/Makefile.in
+++ b/src/doc/Makefile.in
@@ -27,7 +27,7 @@ install: installdirs
-$(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 --git a/src/doc/screen.1 b/src/doc/screen.1
index daabf6c..558e314 100644
--- a/src/doc/screen.1
+++ b/src/doc/screen.1
@@ -1694,7 +1694,7 @@ Default is `none', this disables password checking.
.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 @@ Note that we assume `LP' for all terminal names that start with \*Qvt\*U,
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 --git a/src/etc/screenrc b/src/etc/screenrc
index d2a8d86..839ad8c 100644
--- a/src/etc/screenrc
+++ b/src/etc/screenrc
@@ -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 @@ autodetach on
# 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 @@ terminfo xterm hs@:cs=\E[%i%p1%d;%p2%dr:im=\E[4h:ei=\E[4l
#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
-# Make the output buffer large for (fast) xterms.
-termcap xterm* OL=10000
-terminfo xterm* OL=10000
+################
+#
+# 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
+
+
+################
+#
+# keybindings
+#
#remove some stupid / dangerous key bindings
bind k
@@ -61,8 +115,6 @@ bind 'I' login on
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.
@@ -70,44 +122,3 @@ 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 --git a/src/etc/toolcheck b/src/etc/toolcheck
index 7aed171..8fa214f 100755
--- a/src/etc/toolcheck
+++ b/src/etc/toolcheck
@@ -35,4 +35,10 @@ case "$reply" in
;;
*) ;;
esac
+
+if [ "$retval" != 0 ]; then
+ echo " ***********************************************************"
+ echo " Please fix the above problem before reporting a screen bug!"
+ echo " ***********************************************************"
+fi
exit $retval
diff --git a/src/os.h b/src/os.h
index 4e7292b..e7b4beb 100644
--- a/src/os.h
+++ b/src/os.h
@@ -27,7 +27,7 @@
#include <sys/param.h>
-#if defined(BSDI) || defined(__386BSD__) || defined(_CX_UX)
+#if defined(BSDI) || defined(__386BSD__) || defined(_CX_UX) || defined(hpux)
# include <signal.h>
#endif /* BSDI || __386BSD__ || _CX_UX */
@@ -183,15 +183,14 @@ extern int errno;
* 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 --git a/src/osdef.h.in b/src/osdef.h.in
index 16b9b1a..e224bdf 100644
--- a/src/osdef.h.in
+++ b/src/osdef.h.in
@@ -61,8 +61,8 @@ extern void bcopy __P((char *, char *, int));
#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 getuid __P((void));
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 @@ extern void free __P((char *));
#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 @@ extern int fvhangup __P((char *));
#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 --git a/src/patchlevel.h b/src/patchlevel.h
index 95a3795..ebe1ddf 100644
--- a/src/patchlevel.h
+++ b/src/patchlevel.h
@@ -212,13 +212,26 @@
* stripdev changed to translate
* /dev/pts<n> to /dev/pts/<n> (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 --git a/src/process.c b/src/process.c
index 8916ca5..a40a744 100644
--- a/src/process.c
+++ b/src/process.c
@@ -997,13 +997,16 @@ int key;
* 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 @@ int key;
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 @@ int key;
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 @@ int len;
}
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 --git a/src/screen.c b/src/screen.c
index ba17173..8a58607 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -345,6 +345,9 @@ char **av;
#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 @@ pw_try_again:
#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 @@ pw_try_again:
* 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 @@ pw_try_again:
continue;
tv.tv_sec = 0;
tv.tv_usec = maptimeout;
+ kmaptimeout = 1;
break;
}
#endif
@@ -1402,7 +1409,7 @@ pw_try_again:
{
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 @@ struct win *p;
(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 --git a/src/socket.c b/src/socket.c
index 8277654..b908df6 100644
--- a/src/socket.c
+++ b/src/socket.c
@@ -694,9 +694,8 @@ CheckPasswd(pwd, pid, utty)
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 @@ chsock()
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 --git a/src/term.c b/src/term.c
index 03b40b4..1cd25ff 100644
--- a/src/term.c
+++ b/src/term.c
@@ -110,6 +110,7 @@ struct term term[T_N] =
{ "ms", T_FLG },
{ "sg", T_NUM },
{ "ug", T_NUM },
+ { "sa", T_STR },
/* color */
{ "AF", T_STR },
diff --git a/src/term.h.dist b/src/term.h.dist
index d1fe1e7..73f021d 100644
--- a/src/term.h.dist
+++ b/src/term.h.dist
@@ -138,98 +138,100 @@ union tcu
#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 --git a/src/terminfo/screencap b/src/terminfo/screencap
index 90e6e93..5738532 100644
--- a/src/terminfo/screencap
+++ b/src/terminfo/screencap
@@ -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 --git a/src/terminfo/screeninfo.src b/src/terminfo/screeninfo.src
index e409b20..ab17d2d 100644
--- a/src/terminfo/screeninfo.src
+++ b/src/terminfo/screeninfo.src
@@ -6,7 +6,7 @@ screen|VT 100/ANSI X3.64 virtual terminal,
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 @@ screen-w|VT 100/ANSI X3.64 virtual terminal with 132 cols,
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 --git a/src/utmp.c b/src/utmp.c
index 916dc35..18f95d6 100644
--- a/src/utmp.c
+++ b/src/utmp.c
@@ -299,6 +299,9 @@ RemoveLoginSlot()
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 @@ struct win *wi;
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 --git a/src/window.c b/src/window.c
index 703b281..65716c2 100644
--- a/src/window.c
+++ b/src/window.c
@@ -424,6 +424,23 @@ char **namep;
#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 @@ struct win *win;
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 @@ char **av;
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;