summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2001-07-25 21:30:39 +0000
committerUlrich Drepper <drepper@redhat.com>2001-07-25 21:30:39 +0000
commit9fcddc2b42e379b0b409cf743962a35e887a963f (patch)
tree18f27376c0b70307c181d471f2cffae2aabddd24
parentba915a38078a0765ad1e895fa7e6ca38e86ac3f8 (diff)
Update.
(write_output): Don't overwrite old cache file until we know we have a new one. * iconv/Makefile (install-sbin): Add iconvconfig. * iconv/gconv_int.h: Add prototype for __gconv_release_cache.
-rw-r--r--ChangeLog6
-rw-r--r--iconv/Makefile2
-rw-r--r--iconv/iconvconfig.c17
3 files changed, 17 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index bb4c383b2e..b3117dbb2a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,8 +2,10 @@
* iconv/iconvconfig.c (main): Don't write an output file if we
have seen an error.
+ (write_output): Don't overwrite old cache file until we know we
+ have a new one.
- * iconv/Makefile (install-bin): Add iconvconfig.
+ * iconv/Makefile (install-sbin): Add iconvconfig.
2001-07-25 Jakub Jelinek <jakub@redhat.com>
@@ -43,7 +45,7 @@
__gconv_release_cache after the steps are handled.
* iconv/gconv_dl.c (__gconv_find_shlib): Allocate file name in the
record as well.
- * iconv/gconv_int.h: Add prototype fpr __gconv_release_cache.
+ * iconv/gconv_int.h: Add prototype for __gconv_release_cache.
* iconv/gconv_cache.c (__gconv_lookup_cache): Catch one more
boundary case and reject it.
diff --git a/iconv/Makefile b/iconv/Makefile
index 9945d98a50..28ba18dfab 100644
--- a/iconv/Makefile
+++ b/iconv/Makefile
@@ -54,7 +54,7 @@ distribute = gconv_builtin.h gconv_int.h loop.c skeleton.c iconv_prog.h \
others = iconv_prog iconvconfig
install-others = $(inst_bindir)/iconv
-install-bin = iconvconfig
+install-sbin = iconvconfig
CFLAGS-gconv_cache.c = -DGCONV_DIR='"$(gconvdir)"'
CFLAGS-gconv_conf.c = -DGCONV_PATH='"$(gconvdir)"'
diff --git a/iconv/iconvconfig.c b/iconv/iconvconfig.c
index 379a3bf945..6959d947f8 100644
--- a/iconv/iconvconfig.c
+++ b/iconv/iconvconfig.c
@@ -305,7 +305,7 @@ main (int argc, char *argv[])
if (status == 0)
status = write_output ();
else
- fputs ("No output written!\n", stderr);
+ error (1, 0, _("no output file produced because warning were issued"));
return status;
}
@@ -966,6 +966,7 @@ write_output (void)
struct iovec iov[6];
static const gidx_t null_word;
size_t total;
+ char tmpfname[sizeof (GCONV_MODULES_CACHE) + strlen (".XXXXXX")];
/* Function to insert the names. */
static void name_insert (const void *nodep, VISIT value, int level)
@@ -992,7 +993,8 @@ write_output (void)
}
/* Open the output file. */
- fd = open (GCONV_MODULES_CACHE, O_TRUNC | O_CREAT | O_RDWR, 0644);
+ strcpy (stpcpy (tmpfname, GCONV_MODULES_CACHE), ".XXXXXX");
+ fd = mkstemp (tmpfname);
if (fd == -1)
return 1;
@@ -1144,12 +1146,17 @@ write_output (void)
total += iov[idx].iov_len;
++idx;
- if (TEMP_FAILURE_RETRY (writev (fd, iov, idx)) != total)
+ if (TEMP_FAILURE_RETRY (writev (fd, iov, idx)) != total
+ /* The file was created with mode 0600. Make it world-readable. */
+ || fchmod (fd, 0644) != 0
+ /* Rename the file, possibly replacing an old one. */
+ || rename (tmpfname, GCONV_MODULES_CACHE) != 0)
{
int save_errno = errno;
close (fd);
- unlink (GCONV_MODULES_CACHE);
- error (EXIT_FAILURE, save_errno, gettext ("cannot write output file"));
+ unlink (tmpfname);
+ error (EXIT_FAILURE, save_errno,
+ gettext ("cannot generate output file"));
}
close (fd);