Bug in tgetent (3X) when TERMCAP=/foo/bar/termcap
Badger BA 64810
bbadger at x102c.harris-atd.com
Wed Aug 16 05:06:55 AEST 1989
SYMPTOM:
tcsh wouldn't find my personalized termcap entries, even when TERMCAP
was setenv'd to the correct file path.
PROBLEM:
tgetent expects the file descriptor returned from
tf = open(cp, 0);
to be non-zero. This isn't true when stdin is closed!
SOLUTION:
Use (-1) as the default flag value. This then indicates that either 1) No
attempt to open was made, or 2) the open failed.
DISCUSSION:
This was probably overlooked in testing because most programs are already
using file descriptor 0, and hence a successful open would return a
file descriptor other than zero. In my case stdin (fd 0) was closed, so
the successful open returned 0. This was mistakenly used by the program
to indicate that an open was not attempted.
The new code uses the standard
error return value of (-1) which is returned by a failed open.
**** I'm not absolutely certain that this is the correct behavior! ****
What it does is revert to the standard TERMCAP file if the open fails.
This certainly seems to be the right thing to do, but possibly not.
I *think* that the bug would also cause the standard termcap file to be
ignored in the case that the user provides an inaccessible TERMCAP file path.
In that case, tf is set to -1, and the standard file is not opened.
(My program didn't do this, so I'm giving my own interpretation of this
possibility.)
ALTERNATIVE:
GNU emacs comes with a version of termcap.c which does not seem to have
this problem. There are probably other public domain termcap.c
implementations to choose from.
PATCH:
--------- >8 --- cut here --- 8< ---------
diff -c V3.2.1/usr/src/lib/lxtermlib/termcap.c termcap.c
*** V3.2.1/usr/src/lib/lxtermlib/termcap.c Tue May 17 17:50:55 1988
--- termcap.c Tue Aug 15 09:21:24 1989
***************
*** 101,109 ****
char ibuf[BUFSIZ];
char *cp2;
int tf;
!
tbuf = bp;
! tf = 0;
#ifndef V6
cp = getenv("TERMCAP");
/*
--- 101,109 ----
char ibuf[BUFSIZ];
char *cp2;
int tf;
! #define OPEN_ERR (-1)
tbuf = bp;
! tf = OPEN_ERR;
#ifndef V6
cp = getenv("TERMCAP");
/*
***************
*** 126,137 ****
} else
tf = open(cp, 0);
}
! if (tf==0)
tf = open(E_TERMCAP, 0);
#else
tf = open(E_TERMCAP, 0);
#endif
! if (tf < 0)
return (-1);
for (;;) {
cp = bp;
--- 126,137 ----
} else
tf = open(cp, 0);
}
! if (tf==OPEN_ERR)
tf = open(E_TERMCAP, 0);
#else
tf = open(E_TERMCAP, 0);
#endif
! if (tf == OPEN_ERR)
return (-1);
for (;;) {
cp = bp;
--------- >8 --- cut here --- 8< ---------
Bernard A. Badger Jr. 407/984-6385 |``Use the Source, Luke!''
Secure Computer Products |``Get a LIFE!'' -- J.H. Conway
Harris GISD, Melbourne, FL 32902 |Buddy, can you paradigm?
Internet: bbadger%x102c at trantor.harris-atd.com|'s/./&&/g' Tom sed expansively.
More information about the Comp.bugs.sys5
mailing list