[Asterisk-cvs] asterisk term.c,1.6,1.7

markster at lists.digium.com markster at lists.digium.com
Thu Sep 30 23:09:41 CDT 2004


Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv25345

Modified Files:
	term.c 
Log Message:
Merge Tilghman's color detection patch (bug #2495)


Index: term.c
===================================================================
RCS file: /usr/cvsroot/asterisk/term.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- term.c	22 Sep 2004 05:10:50 -0000	1.6
+++ term.c	1 Oct 2004 03:11:52 -0000	1.7
@@ -17,6 +17,9 @@
 #include <sys/time.h>
 #include <signal.h>
 #include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 #include <unistd.h>
 #include <asterisk/term.h>
 #include <asterisk/options.h>
@@ -29,23 +32,95 @@
 static char enddata[80] = "";
 static char quitdata[80] = "";
 
+static const char *termpath[] = {
+	"/usr/share/terminfo",
+	"/usr/local/share/misc/terminfo",
+	"/usr/lib/terminfo",
+	NULL
+	};
+
+/* Ripped off from Ross Ridge, but it's public domain code (libmytinfo) */
+static short convshort(char *s)
+{
+	register int a,b;
+
+	a = (int) s[0] & 0377;
+	b = (int) s[1] & 0377;
+
+	if (a == 0377 && b == 0377)
+		return -1;
+	if (a == 0376 && b == 0377)
+		return -2;
+
+	return a + b * 256;
+}
+
 int term_init(void)
 {
 	char *term = getenv("TERM");
+	char termfile[256] = "";
+	char buffer[512] = "";
+	int termfd = -1, parseokay = 0, i;
+
 	if (!term)
 		return 0;
 	if (!option_console || option_nocolor || !option_nofork)
 		return 0;
-	if (!strncasecmp(term, "linux", 5)) 
-		vt100compat = 1; else
-	if (!strncasecmp(term, "xterm", 5))
-		vt100compat = 1; else
-	if (!strncasecmp(term, "Eterm", 5))
-		vt100compat = 1; else
-	if (!strncasecmp(term, "crt", 3))
-		vt100compat = 1; else
-	if (!strncasecmp(term, "vt", 2))
-		vt100compat = 1;
+
+	for (i=0 ;; i++) {
+		if (termpath[i] == NULL) {
+			break;
+		}
+		snprintf(termfile, sizeof(termfile), "%s/%c/%s", termpath[i], *term, term);
+		termfd = open(termfile, O_RDONLY);
+		if (termfd > -1) {
+			break;
+		}
+	}
+	if (termfd > -1) {
+		int actsize = read(termfd, buffer, sizeof(buffer) - 1);
+		short sz_names = convshort(buffer + 2);
+		short sz_bools = convshort(buffer + 4);
+		short n_nums   = convshort(buffer + 6);
+
+		/* if ((sz_names + sz_bools) & 1)
+			sz_bools++; */
+
+		if (sz_names + sz_bools + n_nums < actsize) {
+			/* Offset 13 is defined in /usr/include/term.h, though we do not
+			 * include it here, as it conflicts with include/asterisk/term.h */
+			short max_colors = convshort(buffer + 12 + sz_names + sz_bools + 13 * 2);
+			if (max_colors > 0) {
+				vt100compat = 1;
+			}
+			parseokay = 1;
+		}
+		close(termfd);
+	}
+
+	if (!parseokay) {
+		/* These comparisons should not be substrings nor case-insensitive, as
+		 * terminal types are very particular about how they treat suffixes and
+		 * capitalization.  For example, terminal type 'linux-m' does NOT
+		 * support color, while 'linux' does.  Not even all vt100* terminals
+		 * support color, either (e.g. 'vt100+fnkeys'). */
+		if (!strcmp(term, "linux")) {
+			vt100compat = 1;
+		} else if (!strcmp(term, "xterm")) {
+			vt100compat = 1;
+		} else if (!strcmp(term, "xterm-color")) {
+			vt100compat = 1;
+		} else if (!strncmp(term, "Eterm", 5)) {
+			/* Both entries which start with Eterm support color */
+			vt100compat = 1;
+		} else if (!strcmp(term, "vt100")) {
+			vt100compat = 1;
+		} else if (!strncmp(term, "crt", 3)) {
+			/* Both crt terminals support color */
+			vt100compat = 1;
+		}
+	}
+
 	if (vt100compat) {
 		/* Make commands show up in nice colors */
 		snprintf(prepdata, sizeof(prepdata), "%c[%d;%d;%dm", ESC, ATTR_BRIGHT, COLOR_BROWN, COLOR_BLACK + 10);




More information about the svn-commits mailing list