summary refs log blame commit diff
path: root/pkgs/development/libraries/slang/terminfo-dirs.patch
blob: 2229b759a3d488722cdefa3baa52289aaea6b768 (plain) (tree)











































































































































































                                                                                           
commit c7aa0c07b6522fbbb47ef47bd22f47f1611e7423
Author: John E. Davis <jed@jedsoft.org>
Date:   Wed Nov 28 00:46:28 2018 -0500

    pre2.3.3-5: Added support for TERMINFO_DIRS env var

Modified: removed changes to changelog and version number.

diff --git a/src/sltermin.c b/src/sltermin.c
index a06d0e4..65d3bbc 100644
--- a/src/sltermin.c
+++ b/src/sltermin.c
@@ -133,6 +133,9 @@ static FILE *open_terminfo (char *file, SLterminfo_Type *h)
    unsigned char buf[12];
    int magic;
 
+#ifdef SLANG_UNTIC
+   (void) fprintf (stdout,"# Trying %s\n", file);
+#endif
    /* Alan Cox reported a security problem here if the application using the
     * library is setuid.  So, I need to make sure open the file as a normal
     * user.  Unfortunately, there does not appear to be a portable way of
@@ -269,10 +272,73 @@ static char *read_string_table (FILE *fp, SLterminfo_Type *t)
  * are implemented by multiple links to the same compiled file.
  */
 
+static FILE *try_open_tidir (SLterminfo_Type *ti, const char *tidir, const char *term)
+{
+   char file[1024];
+
+   if (sizeof (file) > strlen (tidir) + 5 + strlen (term))
+     {
+	FILE *fp;
+
+	sprintf (file, "%s/%c/%s", tidir, *term, term);
+	if (NULL != (fp = open_terminfo (file, ti)))
+	  return fp;
+
+	sprintf (file, "%s/%02x/%s", tidir, (unsigned char)*term, term);
+	if (NULL != (fp = open_terminfo (file, ti)))
+	  return fp;
+     }
+
+   return NULL;
+}
+
+static FILE *try_open_env (SLterminfo_Type *ti, const char *term, const char *envvar)
+{
+   char *tidir;
+
+   if (NULL == (tidir = _pSLsecure_getenv (envvar)))
+     return NULL;
+
+   return try_open_tidir (ti, tidir, term);
+}
+
+static FILE *try_open_home (SLterminfo_Type *ti, const char *term)
+{
+   char home_ti[1024];
+   char *env;
+
+   if (NULL == (env = _pSLsecure_getenv ("HOME")))
+     return NULL;
+
+   strncpy (home_ti, env, sizeof (home_ti) - 11);
+   home_ti [sizeof(home_ti) - 11] = 0;
+   strcat (home_ti, "/.terminfo");
+
+   return try_open_tidir (ti, home_ti, term);
+}
+
+static FILE *try_open_env_path (SLterminfo_Type *ti, const char *term, const char *envvar)
+{
+   char tidir[1024];
+   char *env;
+   unsigned int i;
+
+   if (NULL == (env = _pSLsecure_getenv (envvar)))
+     return NULL;
+
+   i = 0;
+   while (-1 != SLextract_list_element (env, i, ':', tidir, sizeof(tidir)))
+     {
+	FILE *fp = try_open_tidir (ti, tidir, term);
+	if (fp != NULL) return fp;
+	i++;
+     }
+
+   return NULL;
+}
+
 static SLCONST char *Terminfo_Dirs [] =
 {
-   "", /* $TERMINFO */
-   "", /* $HOME/.terminfo */
 #ifdef MISC_TERMINFO_DIRS
    MISC_TERMINFO_DIRS,
 #endif
@@ -287,6 +353,23 @@ static SLCONST char *Terminfo_Dirs [] =
    NULL,
 };
 
+static FILE *try_open_hardcoded (SLterminfo_Type *ti, const char *term)
+{
+   const char *tidir, **tidirs;
+
+   tidirs = Terminfo_Dirs;
+   while (NULL != (tidir = *tidirs++))
+     {
+	FILE *fp;
+
+	if ((*tidir != 0)
+	    && (NULL != (fp = try_open_tidir (ti, tidir, term))))
+	  return fp;
+     }
+
+   return NULL;
+}
+
 void _pSLtt_tifreeent (SLterminfo_Type *t)
 {
    if (t == NULL)
@@ -305,11 +388,7 @@ void _pSLtt_tifreeent (SLterminfo_Type *t)
 
 SLterminfo_Type *_pSLtt_tigetent (SLCONST char *term)
 {
-   SLCONST char **tidirs, *tidir;
    FILE *fp = NULL;
-   char file[1024];
-   static char home_ti [1024];
-   char *env;
    SLterminfo_Type *ti;
 
    if (
@@ -341,33 +420,10 @@ SLterminfo_Type *_pSLtt_tigetent (SLCONST char *term)
    /* If we are on a termcap based system, use termcap */
    if (0 == tcap_getent (term, ti)) return ti;
 
-   if (NULL != (env = _pSLsecure_getenv ("TERMINFO")))
-     Terminfo_Dirs[0] = env;
-
-   if (NULL != (env = _pSLsecure_getenv ("HOME")))
-     {
-	strncpy (home_ti, env, sizeof (home_ti) - 11);
-	home_ti [sizeof(home_ti) - 11] = 0;
-	strcat (home_ti, "/.terminfo");
-	Terminfo_Dirs [1] = home_ti;
-     }
-
-   tidirs = Terminfo_Dirs;
-   while (NULL != (tidir = *tidirs++))
-     {
-	if (*tidir == 0)
-	  continue;
-
-	if (sizeof (file) > strlen (tidir) + 5 + strlen (term))
-	  {
-	     sprintf (file, "%s/%c/%s", tidir, *term, term);
-	     if (NULL != (fp = open_terminfo (file, ti)))
-	       break;
-	     sprintf (file, "%s/%02x/%s", tidir, (unsigned char)*term, term);
-	     if (NULL != (fp = open_terminfo (file, ti)))
-	       break;
-	  }
-     }
+   fp = try_open_env_path (ti, term, "TERMINFO_DIRS");
+   if (fp == NULL) fp = try_open_env (ti, term, "TERMINFO");
+   if (fp == NULL) fp = try_open_home (ti, term);
+   if (fp == NULL) fp = try_open_hardcoded (ti, term);
 
 #ifdef SLANG_UNTIC
    fp_open_label: