X-Git-Url: https://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Fread_termcap.c;h=29656e2b9364e75806533427de35146d7612cee1;hp=f92ed5d4f83cb9c1bf4fc005dc77345fac411b71;hb=a8e3f06ac309504143cd56ac9ec55889bfdf4914;hpb=d4d1d81ab6fc1ad681ff120d925099f947fefcf3 diff --git a/ncurses/tinfo/read_termcap.c b/ncurses/tinfo/read_termcap.c index f92ed5d4..29656e2b 100644 --- a/ncurses/tinfo/read_termcap.c +++ b/ncurses/tinfo/read_termcap.c @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright (c) 1998-2010,2011 Free Software Foundation, Inc. * + * Copyright (c) 1998-2016,2017 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 * @@ -56,7 +56,7 @@ #include #include -MODULE_ID("$Id: read_termcap.c,v 1.81 2011/08/07 18:56:35 tom Exp $") +MODULE_ID("$Id: read_termcap.c,v 1.93 2017/04/22 16:11:03 tom Exp $") #if !PURE_TERMINFO @@ -73,7 +73,7 @@ get_termpath(void) if (!use_terminfo_vars() || (result = getenv("TERMPATH")) == 0) result = TERMPATH; - T(("TERMPATH is %s", result)); + TR(TRACE_DATABASE, ("TERMPATH is %s", result)); return result; } @@ -161,7 +161,7 @@ _nc_cgetset(const char *ent) return (-1); } gottoprec = 0; - (void) strcpy(toprec, ent); + _nc_STRCPY(toprec, ent, topreclen); return (0); } @@ -294,7 +294,7 @@ _nc_getent( errno = ENOMEM; return (TC_SYS_ERR); } - (void) strcpy(record, toprec); + _nc_STRCPY(record, toprec, topreclen + BFRAG); rp = record + topreclen + 1; r_end = rp + BFRAG; current = in_array; @@ -383,7 +383,14 @@ _nc_getent( c = *bp++; if (c == '\n') { lineno++; - if (rp == record || *(rp - 1) != '\\') + /* + * Unlike BSD 4.3, this ignores a backslash at the + * end of a comment-line. That makes it consistent + * with the rest of ncurses -TD + */ + if (rp == record + || *record == '#' + || *(rp - 1) != '\\') break; } *rp++ = c; @@ -702,8 +709,6 @@ _nc_nfcmp(const char *nf, char *rec) #define PVECSIZ 32 /* max number of names in path */ #define TBUFSIZ (2048*2) -static char *tbuf; - /* * On entry, srcp points to a non ':' character which is the beginning of the * token, if any. We'll try to return a string that doesn't end with a ':'. @@ -765,7 +770,7 @@ copy_tc_token(char *dst, const char *src, size_t len) dst = 0; break; } - *dst++ = ch; + *dst++ = (char) ch; } return dst; } @@ -781,19 +786,16 @@ _nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name) register char *p; register char *cp; char *dummy = NULL; - const char **fname; + CGETENT_CONST char **fname; char *home; int i; char pathbuf[PBUFSIZ]; /* holds raw path of filenames */ CGETENT_CONST char *pathvec[PVECSIZ]; /* point to names in pathbuf */ - CGETENT_CONST char **pvec; /* holds usable tail of path vector */ NCURSES_CONST char *termpath; string_desc desc; *lineno = 1; fname = pathvec; - pvec = pathvec; - tbuf = bp; p = pathbuf; cp = use_terminfo_vars()? getenv("TERMCAP") : NULL; @@ -818,10 +820,11 @@ _nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name) if ((home = getenv("HOME")) != 0 && *home != '\0' && strchr(home, ' ') == 0 && strlen(home) < sizeof(temp) - 10) { /* setup path */ - sprintf(temp, "%s/", home); /* $HOME first */ + _nc_SPRINTF(temp, _nc_SLIMIT(sizeof(temp)) + "%s/", home); /* $HOME first */ } /* if no $HOME look in current directory */ - strcat(temp, ".termcap"); + _nc_STRCAT(temp, ".termcap", sizeof(temp)); _nc_safe_strcat(&desc, temp); _nc_safe_strcat(&desc, " "); _nc_safe_strcat(&desc, get_termpath()); @@ -862,6 +865,7 @@ _nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name) * empty fields, and mistakenly use the last valid cap entry instead of * the first (breaks tc= includes) */ + *bp = '\0'; if (i >= 0) { char *pd, *ps, *tok; int endflag = FALSE; @@ -883,7 +887,7 @@ _nc_tgetent(char *bp, char **sourcename, int *lineno, const char *name) } if (ignore != TRUE) { list[count++] = tok; - pd = copy_tc_token(pd, tok, TBUFSIZ - (2 + pd - bp)); + pd = copy_tc_token(pd, tok, (size_t) (TBUFSIZ - (2 + pd - bp))); if (pd == 0) { i = -1; break; @@ -941,7 +945,7 @@ add_tc(char *termpaths[], char *path, int count) if (count < MAXPATHS && _nc_access(path, R_OK) == 0) { termpaths[count++] = path; - T(("Adding termpath %s", path)); + TR(TRACE_DATABASE, ("Adding termpath %s", path)); } termpaths[count] = 0; if (save != 0) @@ -952,7 +956,7 @@ add_tc(char *termpaths[], char *path, int count) #endif /* !USE_GETCAP */ NCURSES_EXPORT(int) -_nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) +_nc_read_termcap_entry(const char *const tn, TERMTYPE2 *const tp) { int found = TGETENT_NO; ENTRY *ep; @@ -961,25 +965,26 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) #endif #if USE_GETCAP char *p, tc[TBUFSIZ]; +#define MY_SIZE sizeof(tc) - 1 int status; static char *source; static int lineno; - T(("read termcap entry for %s", tn)); + TR(TRACE_DATABASE, ("read termcap entry for %s", tn)); if (strlen(tn) == 0 || strcmp(tn, ".") == 0 || strcmp(tn, "..") == 0 || _nc_pathlast(tn) != 0) { - T(("illegal or missing entry name '%s'", tn)); + TR(TRACE_DATABASE, ("illegal or missing entry name '%s'", tn)); return TGETENT_NO; } if (use_terminfo_vars() && (p = getenv("TERMCAP")) != 0 && !_nc_is_abs_path(p) && _nc_name_match(p, tn, "|:")) { /* TERMCAP holds a termcap entry */ - strncpy(tc, p, sizeof(tc) - 1); - tc[sizeof(tc) - 1] = '\0'; + _nc_STRNCPY(tc, p, MY_SIZE); + tc[MY_SIZE] = '\0'; _nc_set_source("TERMCAP"); } else { /* we're using getcap(3) */ @@ -1036,7 +1041,9 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) normal = FALSE; } else if (_nc_name_match(tc, tn, "|:")) { /* treat as a capability file */ use_buffer = TRUE; - (void) sprintf(tc_buf, "%.*s\n", (int) sizeof(tc_buf) - 2, tc); + _nc_SPRINTF(tc_buf, + _nc_SLIMIT(sizeof(tc_buf)) + "%.*s\n", (int) sizeof(tc_buf) - 2, tc); normal = FALSE; } } @@ -1058,8 +1065,9 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) if (use_terminfo_vars() && (h = getenv("HOME")) != NULL && *h != '\0' && (strlen(h) + sizeof(PRIVATE_CAP)) < PATH_MAX) { /* user's .termcap, if any, should override it */ - (void) strcpy(envhome, h); - (void) sprintf(pathbuf, PRIVATE_CAP, envhome); + _nc_STRCPY(envhome, h, sizeof(envhome)); + _nc_SPRINTF(pathbuf, _nc_SLIMIT(sizeof(pathbuf)) + PRIVATE_CAP, envhome); ADD_TC(pathbuf, filecount); } } @@ -1084,7 +1092,7 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) } } if (omit) { - T(("Path %s is a duplicate", termpaths[j])); + TR(TRACE_DATABASE, ("Path %s is a duplicate", termpaths[j])); for (k = j + 1; k < filecount; k++) { termpaths[k - 1] = termpaths[k]; test_stat[k - 1] = test_stat[k]; @@ -1109,7 +1117,7 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) for (i = 0; i < filecount; i++) { - T(("Looking for %s in %s", tn, termpaths[i])); + TR(TRACE_DATABASE, ("Looking for %s in %s", tn, termpaths[i])); if (_nc_access(termpaths[i], R_OK) == 0 && (fp = fopen(termpaths[i], "r")) != (FILE *) 0) { _nc_set_source(termpaths[i]); @@ -1147,8 +1155,7 @@ _nc_read_termcap_entry(const char *const tn, TERMTYPE *const tp) * from the list. */ *tp = ep->tterm; - _nc_delink_entry(_nc_head, &(ep->tterm)); - free(ep); + _nc_free_entry(_nc_head, &(ep->tterm)); /* * OK, now try to write the type to user's terminfo directory.