/****************************************************************************
- * Copyright (c) 1998-2011,2012 Free Software Foundation, Inc. *
+ * Copyright (c) 1998-2013,2014 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 *
#define TRACE_OUT(p) /*nothing */
#endif
-MODULE_ID("$Id: write_entry.c,v 1.84 2012/02/22 22:40:24 tom Exp $")
+MODULE_ID("$Id: write_entry.c,v 1.92 2014/11/01 14:47:00 tom Exp $")
static int total_written;
char dir[sizeof(LEAF_FMT)];
char *s = 0;
- if (code == 0 || (s = strchr(dirnames, code)) == 0)
+ if (code == 0 || (s = (strchr) (dirnames, code)) == 0)
_nc_err_abort("Illegal terminfo subdirectory \"" LEAF_FMT "\"", code);
if (verified[s - dirnames])
* Set the write directory for compiled entries.
*/
NCURSES_EXPORT(void)
-_nc_set_writedir(char *dir)
+_nc_set_writedir(const char *dir)
{
const char *destination;
char actual[PATH_MAX];
if (dir == 0
- && use_terminfo_vars())
+#ifndef USE_ROOT_ENVIRON
+ && use_terminfo_vars()
+#endif
+ )
dir = getenv("TERMINFO");
if (dir != 0)
char name_list[MAX_TERMINFO_LENGTH];
char *first_name, *other_names;
char *ptr;
+ char *term_names = tp->term_names;
+ size_t name_size = strlen(term_names);
- assert(strlen(tp->term_names) != 0);
- assert(strlen(tp->term_names) < sizeof(name_list));
+ if (name_size == 0) {
+ _nc_syserr_abort("no terminal name found.");
+ } else if (name_size >= sizeof(name_list) - 1) {
+ _nc_syserr_abort("terminal name too long: %s", term_names);
+ }
- _nc_STRCPY(name_list, tp->term_names, sizeof(name_list));
+ _nc_STRCPY(name_list, term_names, sizeof(name_list));
DEBUG(7, ("Name list = '%s'", name_list));
first_name = name_list;
- ptr = &name_list[strlen(name_list) - 1];
+ ptr = &name_list[name_size - 1];
other_names = ptr + 1;
while (ptr > name_list && *ptr != '|')
buffer[0] = 0;
memset(&key, 0, sizeof(key));
- key.data = tp->term_names;
- key.size = strlen(tp->term_names);
+ key.data = term_names;
+ key.size = name_size;
memset(&data, 0, sizeof(data));
data.data = buffer;
key.size = strlen(name_list);
_nc_STRCPY(buffer + 1,
- tp->term_names,
+ term_names,
sizeof(buffer) - 1);
- data.size = strlen(tp->term_names) + 1;
+ data.size = name_size + 1;
_nc_db_put(capdb, &key, &data);
if (start_time > 0 &&
stat(filename, &statbuf) >= 0
&& statbuf.st_mtime >= start_time) {
+#if HAVE_LINK && !USE_SYMLINKS
+ /*
+ * If the file has more than one link, the reason for the previous
+ * write could be that the current primary name used to be an alias for
+ * the previous entry. In that case, unlink the file so that we will
+ * not modify the previous entry as we write this one.
+ */
+ if (statbuf.st_nlink > 1) {
+ _nc_warning("name redefined.");
+ unlink(filename);
+ } else {
+ _nc_warning("name multiply defined.");
+ }
+#else
_nc_warning("name multiply defined.");
+#endif
}
check_writeable(first_name[0]);