summary refs log tree commit diff
path: root/pkgs/development/libraries/slang/terminfo-dirs.patch
blob: 2229b759a3d488722cdefa3baa52289aaea6b768 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
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: