1commit c7aa0c07b6522fbbb47ef47bd22f47f1611e7423
2Author: John E. Davis <jed@jedsoft.org>
3Date: Wed Nov 28 00:46:28 2018 -0500
4
5 pre2.3.3-5: Added support for TERMINFO_DIRS env var
6
7Modified: removed changes to changelog and version number.
8
9diff --git a/src/sltermin.c b/src/sltermin.c
10index a06d0e4..65d3bbc 100644
11--- a/src/sltermin.c
12+++ b/src/sltermin.c
13@@ -133,6 +133,9 @@ static FILE *open_terminfo (char *file, SLterminfo_Type *h)
14 unsigned char buf[12];
15 int magic;
16
17+#ifdef SLANG_UNTIC
18+ (void) fprintf (stdout,"# Trying %s\n", file);
19+#endif
20 /* Alan Cox reported a security problem here if the application using the
21 * library is setuid. So, I need to make sure open the file as a normal
22 * user. Unfortunately, there does not appear to be a portable way of
23@@ -269,10 +272,73 @@ static char *read_string_table (FILE *fp, SLterminfo_Type *t)
24 * are implemented by multiple links to the same compiled file.
25 */
26
27+static FILE *try_open_tidir (SLterminfo_Type *ti, const char *tidir, const char *term)
28+{
29+ char file[1024];
30+
31+ if (sizeof (file) > strlen (tidir) + 5 + strlen (term))
32+ {
33+ FILE *fp;
34+
35+ sprintf (file, "%s/%c/%s", tidir, *term, term);
36+ if (NULL != (fp = open_terminfo (file, ti)))
37+ return fp;
38+
39+ sprintf (file, "%s/%02x/%s", tidir, (unsigned char)*term, term);
40+ if (NULL != (fp = open_terminfo (file, ti)))
41+ return fp;
42+ }
43+
44+ return NULL;
45+}
46+
47+static FILE *try_open_env (SLterminfo_Type *ti, const char *term, const char *envvar)
48+{
49+ char *tidir;
50+
51+ if (NULL == (tidir = _pSLsecure_getenv (envvar)))
52+ return NULL;
53+
54+ return try_open_tidir (ti, tidir, term);
55+}
56+
57+static FILE *try_open_home (SLterminfo_Type *ti, const char *term)
58+{
59+ char home_ti[1024];
60+ char *env;
61+
62+ if (NULL == (env = _pSLsecure_getenv ("HOME")))
63+ return NULL;
64+
65+ strncpy (home_ti, env, sizeof (home_ti) - 11);
66+ home_ti [sizeof(home_ti) - 11] = 0;
67+ strcat (home_ti, "/.terminfo");
68+
69+ return try_open_tidir (ti, home_ti, term);
70+}
71+
72+static FILE *try_open_env_path (SLterminfo_Type *ti, const char *term, const char *envvar)
73+{
74+ char tidir[1024];
75+ char *env;
76+ unsigned int i;
77+
78+ if (NULL == (env = _pSLsecure_getenv (envvar)))
79+ return NULL;
80+
81+ i = 0;
82+ while (-1 != SLextract_list_element (env, i, ':', tidir, sizeof(tidir)))
83+ {
84+ FILE *fp = try_open_tidir (ti, tidir, term);
85+ if (fp != NULL) return fp;
86+ i++;
87+ }
88+
89+ return NULL;
90+}
91+
92 static SLCONST char *Terminfo_Dirs [] =
93 {
94- "", /* $TERMINFO */
95- "", /* $HOME/.terminfo */
96 #ifdef MISC_TERMINFO_DIRS
97 MISC_TERMINFO_DIRS,
98 #endif
99@@ -287,6 +353,23 @@ static SLCONST char *Terminfo_Dirs [] =
100 NULL,
101 };
102
103+static FILE *try_open_hardcoded (SLterminfo_Type *ti, const char *term)
104+{
105+ const char *tidir, **tidirs;
106+
107+ tidirs = Terminfo_Dirs;
108+ while (NULL != (tidir = *tidirs++))
109+ {
110+ FILE *fp;
111+
112+ if ((*tidir != 0)
113+ && (NULL != (fp = try_open_tidir (ti, tidir, term))))
114+ return fp;
115+ }
116+
117+ return NULL;
118+}
119+
120 void _pSLtt_tifreeent (SLterminfo_Type *t)
121 {
122 if (t == NULL)
123@@ -305,11 +388,7 @@ void _pSLtt_tifreeent (SLterminfo_Type *t)
124
125 SLterminfo_Type *_pSLtt_tigetent (SLCONST char *term)
126 {
127- SLCONST char **tidirs, *tidir;
128 FILE *fp = NULL;
129- char file[1024];
130- static char home_ti [1024];
131- char *env;
132 SLterminfo_Type *ti;
133
134 if (
135@@ -341,33 +420,10 @@ SLterminfo_Type *_pSLtt_tigetent (SLCONST char *term)
136 /* If we are on a termcap based system, use termcap */
137 if (0 == tcap_getent (term, ti)) return ti;
138
139- if (NULL != (env = _pSLsecure_getenv ("TERMINFO")))
140- Terminfo_Dirs[0] = env;
141-
142- if (NULL != (env = _pSLsecure_getenv ("HOME")))
143- {
144- strncpy (home_ti, env, sizeof (home_ti) - 11);
145- home_ti [sizeof(home_ti) - 11] = 0;
146- strcat (home_ti, "/.terminfo");
147- Terminfo_Dirs [1] = home_ti;
148- }
149-
150- tidirs = Terminfo_Dirs;
151- while (NULL != (tidir = *tidirs++))
152- {
153- if (*tidir == 0)
154- continue;
155-
156- if (sizeof (file) > strlen (tidir) + 5 + strlen (term))
157- {
158- sprintf (file, "%s/%c/%s", tidir, *term, term);
159- if (NULL != (fp = open_terminfo (file, ti)))
160- break;
161- sprintf (file, "%s/%02x/%s", tidir, (unsigned char)*term, term);
162- if (NULL != (fp = open_terminfo (file, ti)))
163- break;
164- }
165- }
166+ fp = try_open_env_path (ti, term, "TERMINFO_DIRS");
167+ if (fp == NULL) fp = try_open_env (ti, term, "TERMINFO");
168+ if (fp == NULL) fp = try_open_home (ti, term);
169+ if (fp == NULL) fp = try_open_hardcoded (ti, term);
170
171 #ifdef SLANG_UNTIC
172 fp_open_label: