at 22.05-pre 172 lines 4.6 kB view raw
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: