[BACK]Return to term.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libterminfo

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libterminfo/term.c between version 1.13.4.1 and 1.14

version 1.13.4.1, 2012/06/23 22:54:57 version 1.14, 2012/06/01 12:02:36
Line 33  __RCSID("$NetBSD$");
Line 33  __RCSID("$NetBSD$");
 #include <sys/stat.h>  #include <sys/stat.h>
   
 #include <assert.h>  #include <assert.h>
 #include <cdbr.h>  
 #include <ctype.h>  #include <ctype.h>
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <limits.h>  #include <limits.h>
   #include <ndbm.h>
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
Line 62  _ti_readterm(TERMINAL *term, const char 
Line 62  _ti_readterm(TERMINAL *term, const char 
         TERMUSERDEF *ud;          TERMUSERDEF *ud;
   
         ver = *cap++;          ver = *cap++;
         /* Only read version 1 structures */          /* Only read version 1 and 2 structures */
         if (ver != 1) {          if (ver != 1 && ver != 2) {
                 errno = EINVAL;                  errno = EINVAL;
                 return -1;                  return -1;
         }          }
Line 89  _ti_readterm(TERMINAL *term, const char 
Line 89  _ti_readterm(TERMINAL *term, const char 
         cap += sizeof(uint16_t);          cap += sizeof(uint16_t);
         term->name = cap;          term->name = cap;
         cap += len;          cap += len;
         len = le16dec(cap);          if (ver == 1)
         cap += sizeof(uint16_t);  
         if (len == 0)  
                 term->_alias = NULL;                  term->_alias = NULL;
         else {          else {
                 term->_alias = cap;                  len = le16dec(cap);
                 cap += len;                  cap += sizeof(uint16_t);
                   if (len == 0)
                           term->_alias = NULL;
                   else {
                           term->_alias = cap;
                           cap += len;
                   }
         }          }
         len = le16dec(cap);          len = le16dec(cap);
         cap += sizeof(uint16_t);          cap += sizeof(uint16_t);
Line 211  _ti_readterm(TERMINAL *term, const char 
Line 215  _ti_readterm(TERMINAL *term, const char 
 static int  static int
 _ti_dbgetterm(TERMINAL *term, const char *path, const char *name, int flags)  _ti_dbgetterm(TERMINAL *term, const char *path, const char *name, int flags)
 {  {
         struct cdbr *db;          DBM *db;
         const void *data;          datum dt;
         char *db_name;          char *p;
         const uint8_t *data8;  
         size_t len, klen;  
         int r;          int r;
   
         if (asprintf(&db_name, "%s.cdb", path) < 0)          db = dbm_open(path, O_RDONLY, 0644);
                 return -1;  
   
         db = cdbr_open(db_name, CDBR_DEFAULT);  
         free(db_name);  
         if (db == NULL)          if (db == NULL)
                 return -1;                  return -1;
   
         klen = strlen(name) + 1;  
         if (cdbr_find(db, name, klen, &data, &len) == -1)  
                 goto fail;  
         data8 = data;  
         if (len == 0)  
                 goto fail;  
         /* Check for alias first, fall through to processing normal entries. */  
         if (data8[0] == 2) {  
                 if (klen + 7 > len || le16dec(data8 + 5) != klen)  
                         goto fail;  
                 if (memcmp(data8 + 7, name, klen))  
                         goto fail;  
                 if (cdbr_get(db, le32dec(data8 + 1), &data, &len))  
                         goto fail;  
                 data8 = data;  
                 if (data8[0] != 1)  
                         goto fail;  
         } else  if (data8[0] != 1)  
                 goto fail;  
         else if (klen + 3 >= len || le16dec(data8 + 1) != klen)  
                 goto fail;  
         else if (memcmp(data8 + 3, name, klen))  
                 goto fail;  
   
         strlcpy(database, path, sizeof(database));          strlcpy(database, path, sizeof(database));
         _ti_database = database;          _ti_database = database;
           dt.dptr = (void *)__UNCONST(name);
           dt.dsize = strlen(name);
           dt = dbm_fetch(db, dt);
           if (dt.dptr == NULL) {
                   dbm_close(db);
                   return 0;
           }
   
         r = _ti_readterm(term, data, len, flags);          for (;;) {
         cdbr_close(db);                  p = (char *)dt.dptr;
                   if (*p++ != 0) /* not alias */
                           break;
                   dt.dsize = le16dec(p) - 1;
                   p += sizeof(uint16_t);
                   dt.dptr = p;
                   dt = dbm_fetch(db, dt);
                   if (dt.dptr == NULL) {
                           dbm_close(db);
                           return 0;
                   }
           }
   
           r = _ti_readterm(term, (char *)dt.dptr, dt.dsize, flags);
           dbm_close(db);
         return r;          return r;
   
  fail:  
         cdbr_close(db);  
         return 0;  
 }  }
   
 static int  static int

Legend:
Removed from v.1.13.4.1  
changed lines
  Added in v.1.14

CVSweb <webmaster@jp.NetBSD.org>