/****************************************************************************
- * 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 *
#include <hashed_db.h>
#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.31 2012/02/22 22:40:24 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)
+add_to_blob(const char *text, size_t limit)
{
+ (void) limit;
+
if (*text != '\0') {
char *last = my_blob + strlen(my_blob);
if (last != my_blob)
- *last++ = ':';
- strcpy(last, text);
+ *last++ = NCURSES_PATHSEP;
+ _nc_STRCPY(last, text, limit);
}
}
{
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) {
+ _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) "%s%s", name, DBM_SUFFIX);
+ if (stat(temp, sb) == 0 && S_ISREG(sb->st_mode)) {
result = TRUE;
}
}
#endif
-
return result;
}
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;
return _nc_tic_dir(envp);
}
}
- return TicDirectory;
+ return TicDirectory ? TicDirectory : TERMINFO;
}
/*
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 */
}
if (my_blob != 0) {
*my_blob = '\0';
for (j = 0; j < dbdLAST; ++j) {
- add_to_blob(values[j]);
+ add_to_blob(values[j], blobsize);
}
/* Now, build an array which will be pointers to the distinct
*/
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);
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];
}
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;
}
} 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