Index: term.c =================================================================== RCS file: /usr/cvsroot/asterisk/term.c,v retrieving revision 1.6 diff -u -r1.6 term.c --- term.c 22 Sep 2004 05:10:50 -0000 1.6 +++ term.c 28 Sep 2004 07:15:23 -0000 @@ -17,6 +17,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -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);