]> ncurses.scripts.mit.edu Git - ncurses.git/blobdiff - ncurses/tinfo/db_iterator.c
ncurses 5.9 - patch 20130126
[ncurses.git] / ncurses / tinfo / db_iterator.c
index 8af267bcb8559fb504b0be2f62692744b58f4dd6..90e73d6bc5990d75160bebe28003389a1bb39389 100644 (file)
@@ -43,7 +43,7 @@
 #include <hashed_db.h>
 #endif
 
-MODULE_ID("$Id: db_iterator.c,v 1.31 2012/02/22 22:40:24 tom Exp $")
+MODULE_ID("$Id: db_iterator.c,v 1.35 2012/08/25 21:55:00 tom Exp $")
 
 #define HaveTicDirectory _nc_globals.have_tic_directory
 #define KeepTicDirectory _nc_globals.keep_tic_directory
@@ -96,10 +96,13 @@ static bool
 update_getenv(const char *name, DBDIRS which)
 {
     bool result = FALSE;
-    char *value = getenv(name);
 
     if (which < dbdLAST) {
-       if (my_vars[which].name == 0 || strcmp(my_vars[which].name, name)) {
+       char *value;
+
+       if ((value = getenv(name)) == 0 || (value = strdup(value)) == 0) {
+           ;
+       } else if (my_vars[which].name == 0 || strcmp(my_vars[which].name, name)) {
            FreeIfNeeded(my_vars[which].value);
            my_vars[which].name = name;
            my_vars[which].value = value;
@@ -112,6 +115,8 @@ update_getenv(const char *name, DBDIRS which)
            FreeIfNeeded(my_vars[which].value);
            my_vars[which].value = value;
            result = TRUE;
+       } else {
+           free(value);
        }
     }
     return result;
@@ -240,6 +245,7 @@ _nc_next_db(DBDIRS * state, int *offset)
 NCURSES_EXPORT(void)
 _nc_first_db(DBDIRS * state, int *offset)
 {
+    bool cache_has_expired = FALSE;
     *state = dbdTIC;
     *offset = 0;
 
@@ -248,12 +254,15 @@ _nc_first_db(DBDIRS * state, int *offset)
     /* build a blob containing all of the strings we will use for a lookup
      * table.
      */
-    if (my_blob == 0) {
+    if (my_blob == 0 || (cache_has_expired = cache_expired())) {
        size_t blobsize = 0;
        const char *values[dbdLAST];
        struct stat *my_stat;
        int j, k;
 
+       if (cache_has_expired)
+           free_cache();
+
        for (j = 0; j < dbdLAST; ++j)
            values[j] = 0;
 
@@ -387,9 +396,16 @@ _nc_first_db(DBDIRS * state, int *offset)
 void
 _nc_db_iterator_leaks(void)
 {
+    DBDIRS which;
+
     if (my_blob != 0)
        FreeAndNull(my_blob);
     if (my_list != 0)
        FreeAndNull(my_list);
+    for (which = 0; (int) which < dbdLAST; ++which) {
+       my_vars[which].name = 0;
+       FreeIfNeeded(my_vars[which].value);
+       my_vars[which].value = 0;
+    }
 }
 #endif