X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=progs%2Ftoe.c;h=0d299b457dfb9d61c555cef71897f8f04325a076;hp=34216e954b8b8ec7fe1f2873a791943386798bd0;hb=0819b56c3096ed77dd36312b0c4e8f37e7d46c88;hpb=292968cf29abc10835415a6352607b38ce7c9cbd diff --git a/progs/toe.c b/progs/toe.c index 34216e95..0d299b45 100644 --- a/progs/toe.c +++ b/progs/toe.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * + * Copyright (c) 1998-2012,2013 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 * @@ -44,7 +44,7 @@ #include #endif -MODULE_ID("$Id: toe.c,v 1.64 2012/01/01 02:56:17 tom Exp $") +MODULE_ID("$Id: toe.c,v 1.74 2013/12/15 01:08:28 tom Exp $") #define isDotname(name) (!strcmp(name, ".") || !strcmp(name, "..")) @@ -99,6 +99,8 @@ new_termdata(void) if (want >= len_termdata) { len_termdata = (2 * want) + 10; ptr_termdata = typeRealloc(TERMDATA, len_termdata, ptr_termdata); + if (ptr_termdata == 0) + failed("ptr_termdata"); } return ptr_termdata + use_termdata++; @@ -230,16 +232,17 @@ make_db_name(char *dst, const char *src, unsigned limit) static const char suffix[] = DBM_SUFFIX; bool result = FALSE; - unsigned lens = sizeof(suffix) - 1; - unsigned size = strlen(src); - unsigned need = lens + size; + size_t lens = sizeof(suffix) - 1; + size_t size = strlen(src); + size_t need = lens + size; if (need <= limit) { if (size >= lens - && !strcmp(src + size - lens, suffix)) - (void) strcpy(dst, src); - else - (void) sprintf(dst, "%s%s", src, suffix); + && !strcmp(src + size - lens, suffix)) { + _nc_STRCPY(dst, src, PATH_MAX); + } else { + _nc_SPRINTF(dst, _nc_SLIMIT(PATH_MAX) "%s%s", src, suffix); + } result = TRUE; } return result; @@ -256,8 +259,11 @@ term_description(TERMTYPE *tp) { const char *desc; - if ((desc = strrchr(tp->term_names, '|')) == 0 || *++desc == '\0') + if (tp->term_names == 0 + || (desc = strrchr(tp->term_names, '|')) == 0 + || (*++desc == '\0')) { desc = "(No description)"; + } return desc; } @@ -294,10 +300,10 @@ checksum_of(TERMTYPE *tp) unsigned i; for (i = 0; i < NUM_BOOLEANS(tp); i++) { - result += (tp->Booleans[i]); + result += (unsigned long) (tp->Booleans[i]); } for (i = 0; i < NUM_NUMBERS(tp); i++) { - result += (tp->Numbers[i]); + result += (unsigned long) (tp->Numbers[i]); } for (i = 0; i < NUM_STRINGS(tp); i++) { result += string_sum(tp->Strings[i]); @@ -317,7 +323,7 @@ sorthook(int db_index, int db_limit, const char *term_name, TERMTYPE *tp) data->description = strmalloc(term_description(tp)); } -#if USE_TERMCAP +#if NCURSES_USE_TERMCAP static void show_termcap(int db_index, int db_limit, char *buffer, DescHook hook) { @@ -344,16 +350,31 @@ show_termcap(int db_index, int db_limit, char *buffer, DescHook hook) } #endif +#if NCURSES_USE_DATABASE +static char * +copy_entryname(DIRENT * src) +{ + size_t len = NAMLEN(src); + char *result = malloc(len + 1); + if (result == 0) + failed("copy entryname"); + memcpy(result, src->d_name, len); + result[len] = '\0'; + + return result; +} +#endif + static int typelist(int eargc, char *eargv[], - bool verbosity, + int verbosity, DescHook hook) /* apply a function to each entry in given terminfo directories */ { int i; for (i = 0; i < eargc; i++) { -#if USE_DATABASE +#if NCURSES_USE_DATABASE if (_nc_is_dir_path(eargv[i])) { char *cwd_buf = 0; DIR *termdir; @@ -371,23 +392,28 @@ typelist(int eargc, char *eargv[], (void) printf("#\n#%s:\n#\n", eargv[i]); while ((subdir = readdir(termdir)) != 0) { - size_t len = NAMLEN(subdir); - size_t cwd_len = len + strlen(eargv[i]) + 3; - char name_1[PATH_MAX]; + size_t cwd_len; + char *name_1; DIR *entrydir; DIRENT *entry; + name_1 = copy_entryname(subdir); + if (isDotname(name_1)) { + free(name_1); + continue; + } + + cwd_len = NAMLEN(subdir) + strlen(eargv[i]) + 3; cwd_buf = typeRealloc(char, cwd_len, cwd_buf); if (cwd_buf == 0) failed("realloc cwd_buf"); assert(cwd_buf != 0); - strncpy(name_1, subdir->d_name, len)[len] = '\0'; - if (isDotname(name_1)) - continue; + _nc_SPRINTF(cwd_buf, _nc_SLIMIT(cwd_len) + "%s/%s/", eargv[i], name_1); + free(name_1); - (void) sprintf(cwd_buf, "%s/%.*s/", eargv[i], (int) len, name_1); if (chdir(cwd_buf) != 0) continue; @@ -397,15 +423,16 @@ typelist(int eargc, char *eargv[], continue; } while ((entry = readdir(entrydir)) != 0) { - char name_2[PATH_MAX]; + char *name_2; TERMTYPE lterm; char *cn; int status; - len = NAMLEN(entry); - strncpy(name_2, entry->d_name, len)[len] = '\0'; - if (isDotname(name_2) || !_nc_is_file_path(name_2)) + name_2 = copy_entryname(entry); + if (isDotname(name_2) || !_nc_is_file_path(name_2)) { + free(name_2); continue; + } status = _nc_read_file_entry(name_2, <erm); if (status <= 0) { @@ -413,6 +440,10 @@ typelist(int eargc, char *eargv[], (void) fprintf(stderr, "%s: couldn't open terminfo file %s.\n", _nc_progname, name_2); + free(cwd_buf); + free(name_2); + closedir(entrydir); + closedir(termdir); return (EXIT_FAILURE); } @@ -423,6 +454,7 @@ typelist(int eargc, char *eargv[], hook(i, eargc, cn, <erm); } _nc_free_termtype(<erm); + free(name_2); } closedir(entrydir); } @@ -470,7 +502,7 @@ typelist(int eargc, char *eargv[], } #endif #endif -#if USE_TERMCAP +#if NCURSES_USE_TERMCAP #if HAVE_BSD_CGETENT { CGETENT_CONST char *db_array[2]; @@ -678,6 +710,8 @@ main(int argc, char *argv[]) } if (!pass) { eargv = allocArgv(count); + if (eargv == 0) + failed("eargv"); } else { code = typelist((int) count, eargv, header, hook); freeArgv(eargv); @@ -687,9 +721,11 @@ main(int argc, char *argv[]) DBDIRS state; int offset; const char *path; - char **eargv = allocArgv(2); + char **eargv = allocArgv((size_t) 2); size_t count = 0; + if (eargv == 0) + failed("eargv"); _nc_first_db(&state, &offset); if ((path = _nc_next_db(&state, &offset)) != 0) { eargv[count++] = strmalloc(path);