Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/lib/libterminfo/term.c,v rcsdiff: /ftp/cvs/cvsroot/src/lib/libterminfo/term.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.2 retrieving revision 1.5 diff -u -p -r1.2 -r1.5 --- src/lib/libterminfo/term.c 2010/02/05 09:42:21 1.2 +++ src/lib/libterminfo/term.c 2010/02/11 00:27:09 1.5 @@ -1,7 +1,7 @@ -/* $NetBSD: term.c,v 1.2 2010/02/05 09:42:21 roy Exp $ */ +/* $NetBSD: term.c,v 1.5 2010/02/11 00:27:09 roy Exp $ */ /* - * Copyright (c) 2009 The NetBSD Foundation, Inc. + * Copyright (c) 2009, 2010 The NetBSD Foundation, Inc. * * This code is derived from software contributed to The NetBSD Foundation * by Roy Marples. @@ -28,7 +28,7 @@ */ #include -__RCSID("$NetBSD: term.c,v 1.2 2010/02/05 09:42:21 roy Exp $"); +__RCSID("$NetBSD: term.c,v 1.5 2010/02/11 00:27:09 roy Exp $"); #include @@ -44,21 +44,35 @@ __RCSID("$NetBSD: term.c,v 1.2 2010/02/0 #include #include -#define TERMINFO_DIRS "/usr/share/misc/terminfo:/etc/terminfo:/rescue/terminfo" +#define TERMINFO_DIRS "/usr/share/misc/terminfo" static char database[PATH_MAX]; static char pathbuf[PATH_MAX]; const char *_ti_database; +/* rescue.c is generated from /usr/src/share/terminfo/terminfo + * at build time as an array of strings. + * static const char *rescue_terms[] = { + * "ansi", + * "\002\005\000\141\156\163\151\000\000\000\043\000\141\156\163\151\057", + * NULL, + * NULL + * }; + */ + +#include "rescue.c" + static int -_ti_readterm(TERMINAL *term, char *cap, size_t caplen, int flags) +_ti_readterm(TERMINAL *term, const char *cap, size_t caplen, int flags) { + uint8_t ver; uint16_t ind, num; size_t len; TERMUSERDEF *ud; - /* Only read version 1 structures */ - if (*cap++ != 1) { + ver = *cap++; + /* Only read version 1 and 2 structures */ + if (ver != 1 && ver != 2) { errno = EINVAL; return -1; } @@ -73,16 +87,29 @@ _ti_readterm(TERMINAL *term, char *cap, term->strs = calloc(TISTRMAX + 1, sizeof(char *)); if (term->strs == NULL) goto err; - term->_area = malloc(caplen); + term->_arealen = caplen; + term->_area = malloc(term->_arealen); if (term->_area == NULL) goto err; - memcpy(term->_area, cap, caplen); + memcpy(term->_area, cap, term->_arealen); cap = term->_area; len = le16dec(cap); cap += sizeof(uint16_t); term->name = cap; cap += len; + if (ver == 1) + term->_alias = NULL; + else { + len = le16dec(cap); + cap += sizeof(uint16_t); + if (len == 0) + term->_alias = NULL; + else { + term->_alias = cap; + cap += len; + } + } len = le16dec(cap); cap += sizeof(uint16_t); term->desc = cap; @@ -265,11 +292,14 @@ _ti_getterm(TERMINAL *term, const char * { int r; char *e, h[PATH_MAX]; + const char **p; _DIAGASSERT(term != NULL); _DIAGASSERT(name != NULL); + database[0] = '\0'; _ti_database = NULL; + e = getenv("TERMINFO"); if (e != NULL) return _ti_dbgetterm(term, e, name, flags); @@ -281,8 +311,18 @@ _ti_getterm(TERMINAL *term, const char * if (r == 1) return 1; } - - return _ti_dbgettermp(term, TERMINFO_DIRS, name, flags); + + r = _ti_dbgettermp(term, TERMINFO_DIRS, name, flags); + if (r == 1) + return 1; + + for (p = rescue_terms; *p != NULL; p++, p++) + if (strcmp(name, *p) == 0) { + r = _ti_readterm(term, *(p + 1), 4096, flags); + break; + } + + return r; } void