X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Fdb_iterator.c;h=ce84fad33686c34ae06d96d4a31d786a2d320620;hp=f7e4d6064bf30f020e79cee27fc1a3a1bf6324d5;hb=a108bc76f220a81a223a5c25f59195af60452128;hpb=af4c589f0c605e1a1dd3825678a0b1a97df02d37;ds=sidebyside diff --git a/ncurses/tinfo/db_iterator.c b/ncurses/tinfo/db_iterator.c index f7e4d606..ce84fad3 100644 --- a/ncurses/tinfo/db_iterator.c +++ b/ncurses/tinfo/db_iterator.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 2006-2010,2011 Free Software Foundation, Inc. * + * Copyright (c) 2006-2011,2012 Free Software Foundation, Inc. * * * * Permission is hereby granted, free of charge, to any person obtaining a * * copy of this software and associated documentation files (the * @@ -43,23 +43,16 @@ #include #endif -MODULE_ID("$Id: db_iterator.c,v 1.18 2011/09/26 09:52:00 tom Exp $") +MODULE_ID("$Id: db_iterator.c,v 1.28 2012/01/21 23:56:17 tom Exp $") #define HaveTicDirectory _nc_globals.have_tic_directory #define KeepTicDirectory _nc_globals.keep_tic_directory #define TicDirectory _nc_globals.tic_directory - -/* - * FIXME: need a no-leaks entrypoint. - */ -static char *my_blob; /* string-heap for my_list[] */ -static char **my_list; /* distinct places to look for data */ -static int my_size; /* length of my_list[] */ -static time_t my_time; /* cache last updated */ -static struct { - const char *name; - char *value; -} my_vars[dbdLAST]; +#define my_blob _nc_globals.dbd_blob +#define my_list _nc_globals.dbd_list +#define my_size _nc_globals.dbd_size +#define my_time _nc_globals.dbd_time +#define my_vars _nc_globals.dbd_vars static void add_to_blob(const char *text) @@ -67,7 +60,7 @@ add_to_blob(const char *text) if (*text != '\0') { char *last = my_blob + strlen(my_blob); if (last != my_blob) - *last++ = ':'; + *last++ = NCURSES_PATHSEP; strcpy(last, text); } } @@ -77,19 +70,19 @@ check_existence(const char *name, struct stat *sb) { bool result = FALSE; - if (stat(name, sb) == 0 && sb->st_size) { + if (stat(name, sb) == 0 + && (S_ISDIR(sb->st_mode) || S_ISREG(sb->st_mode))) { result = TRUE; } #if USE_HASHED_DB else if (strlen(name) < PATH_MAX - sizeof(DBM_SUFFIX)) { char temp[PATH_MAX]; sprintf(temp, "%s%s", name, DBM_SUFFIX); - if (stat(temp, sb) == 0 && sb->st_size) { + if (stat(temp, sb) == 0 && S_ISREG(sb->st_mode)) { result = TRUE; } } #endif - return result; } @@ -155,7 +148,7 @@ cache_expired(void) result = TRUE; } else { DBDIRS n; - for (n = 0; n < dbdLAST; ++n) { + for (n = (DBDIRS) 0; n < dbdLAST; ++n) { if (my_vars[n].name != 0 && update_getenv(my_vars[n].name, n)) { result = TRUE; @@ -191,7 +184,7 @@ _nc_tic_dir(const char *path) return _nc_tic_dir(envp); } } - return TicDirectory; + return TicDirectory ? TicDirectory : TERMINFO; } /* @@ -287,9 +280,15 @@ _nc_first_db(DBDIRS * state, int *offset) values[dbdHome] = _nc_home_terminfo(); (void) cache_getenv("HOME", dbdHome); values[dbdEnvList] = cache_getenv("TERMINFO_DIRS", dbdEnvList); + #endif #if USE_TERMCAP values[dbdEnvOnce2] = cache_getenv("TERMCAP", dbdEnvOnce2); + /* only use $TERMCAP if it is an absolute path */ + if (values[dbdEnvOnce2] != 0 + && *values[dbdEnvOnce2] != '/') { + values[dbdEnvOnce2] = 0; + } values[dbdEnvList2] = cache_getenv("TERMPATH", dbdEnvList2); #endif /* USE_TERMCAP */ } @@ -312,7 +311,7 @@ _nc_first_db(DBDIRS * state, int *offset) */ blobsize = 2; for (j = 0; my_blob[j] != '\0'; ++j) { - if (my_blob[j] == ':') + if (my_blob[j] == NCURSES_PATHSEP) ++blobsize; } my_list = typeCalloc(char *, blobsize); @@ -321,7 +320,7 @@ _nc_first_db(DBDIRS * state, int *offset) k = 0; my_list[k++] = my_blob; for (j = 0; my_blob[j] != '\0'; ++j) { - if (my_blob[j] == ':') { + if (my_blob[j] == NCURSES_PATHSEP) { my_blob[j] = '\0'; my_list[k++] = &my_blob[j + 1]; } @@ -333,11 +332,11 @@ _nc_first_db(DBDIRS * state, int *offset) for (j = 0; my_list[j] != 0; ++j) { #ifdef TERMINFO if (*my_list[j] == '\0') - my_list[j] = TERMINFO; + my_list[j] = strdup(TERMINFO); #endif for (k = 0; k < j; ++k) { if (!strcmp(my_list[j], my_list[k])) { - k = --j; + k = j - 1; while ((my_list[j] = my_list[j + 1]) != 0) { ++j; } @@ -377,6 +376,18 @@ _nc_first_db(DBDIRS * state, int *offset) } else { FreeAndNull(my_blob); } + free(my_stat); } } } + +#if NO_LEAKS +void +_nc_db_iterator_leaks(void) +{ + if (my_blob != 0) + FreeAndNull(my_blob); + if (my_list != 0) + FreeAndNull(my_list); +} +#endif