about summary refs log tree commit diff
path: root/locale/programs/locfile.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2002-04-18 08:08:23 +0000
committerUlrich Drepper <drepper@redhat.com>2002-04-18 08:08:23 +0000
commita7b65cdc9aae6ccbb5f652fcbcb7f32129bd8299 (patch)
treefe4d18c845102a586d924eb933092cc83c5b90de /locale/programs/locfile.c
parentc77694049a23389267f9bb22135b393d824ba24c (diff)
downloadglibc-a7b65cdc9aae6ccbb5f652fcbcb7f32129bd8299.tar.gz
glibc-a7b65cdc9aae6ccbb5f652fcbcb7f32129bd8299.tar.xz
glibc-a7b65cdc9aae6ccbb5f652fcbcb7f32129bd8299.zip
Update.
2002-04-18  Ulrich Drepper  <drepper@redhat.com>

	* locale/programs/locfile.c (to_archive): New variable.  To collect
	data which has to be added to the locale archive.
	(write_all_categories): Take new third parameter with locale name.
	Unless no_archive flag set add new locale data to the archive
	(write_locale_data): Unless no-archive flag set store generated data
	in to_archive data structure instead of generation output file.
	Add new parameter with locale category index.
	* locale/programs/locfile.h: Add new parameters in declaractions of
	write_all_categories and write_locale_data.
	* locale/programs/localedef.c: Recognize --no-archive, --list-archive,
	--add-to-archive, and --delete-from-archive options.  Pass extra
	parameter to write_all_categories.
	* locale/programs/localedef.h: Add prototypes for functions in
	locarchive.c.
	* locale/locarchive.h: New file.
	* locale/programs/locarchive.c: New file.
	* locale/Makefile (distribute): Add programs/locarchive.c and
	locarchive.h.
	(localedef-modules): Add md5 and locarchive.
	Add vpath to crypt subdir for md5.c.

	* locale/programs/ld-address.c: Pass locale category ID as new second
	parameter to write_locale_data.
	* locale/programs/ld-collate.c: Likewise.
	* locale/programs/ld-ctype.c: Likewise.
	* locale/programs/ld-identification.c: Likewise.
	* locale/programs/ld-measurement.c: Likewise.
	* locale/programs/ld-messages.c: Likewise.
	* locale/programs/ld-monetary.c: Likewise.
	* locale/programs/ld-name.c: Likewise.
	* locale/programs/ld-numeric.c: Likewise.
	* locale/programs/ld-paper.c: Likewise.
	* locale/programs/ld-telephone.c: Likewise.
	* locale/programs/ld-time.c: Likewise.

	* locale/simple-hash.c: Move compute_hashval function from here...
	* locale/hashval.h: ...to here.  New file.
	* locale/simple-hash.h: Add prototype for compute_hashval.

	* include/libintl.h: Minor cleanups.

	* elf/reldep7.c: New file.
	* elf/reldep7mod1.c: New file.
	* elf/reldep7mod2.c: New file.
	* elf/Makefile: Add rules to build and run reldep7.
Diffstat (limited to 'locale/programs/locfile.c')
-rw-r--r--locale/programs/locfile.c61
1 files changed, 57 insertions, 4 deletions
diff --git a/locale/programs/locfile.c b/locale/programs/locfile.c
index 07a65bbb54..4d978d12a1 100644
--- a/locale/programs/locfile.c
+++ b/locale/programs/locfile.c
@@ -30,12 +30,18 @@
 #include <sys/param.h>
 #include <sys/stat.h>
 
+#include "../../crypt/md5.h"
 #include "localedef.h"
 #include "locfile.h"
+#include "simple-hash.h"
 
 #include "locfile-kw.h"
 
 
+/* Temporary storage of the locale data before writing it to the archive.  */
+static locale_data_t to_archive;
+
+
 int
 locfile_read (struct localedef_t *result, const struct charmap_t *charmap)
 {
@@ -312,9 +318,10 @@ static void (*const write_funcs[]) (struct localedef_t *,
   [LC_IDENTIFICATION] = identification_output
 };
 
+
 void
 write_all_categories (struct localedef_t *definitions,
-		      const struct charmap_t *charmap,
+		      const struct charmap_t *charmap, const char *locname,
 		      const char *output_path)
 {
   int cnt;
@@ -322,8 +329,25 @@ write_all_categories (struct localedef_t *definitions,
   for (cnt = 0; cnt < sizeof (write_funcs) / sizeof (write_funcs[0]); ++cnt)
     if (write_funcs[cnt] != NULL)
       write_funcs[cnt] (definitions, charmap, output_path);
+
+  if (! no_archive)
+    {
+      /* The data has to be added to the archive.  Do this now.  */
+      struct locarhandle ah;
+
+      /* Open the archive.  This call never returns if we cannot
+	 successfully open the archive.  */
+      open_archive (&ah);
+
+      if (add_locale_to_archive (&ah, locname, to_archive, true) != 0)
+	error (EXIT_FAILURE, errno, _("cannot add to locale archive"));
+
+      /* We are done.  */
+      close_archive (&ah);
+    }
 }
 
+
 /* Return a NULL terminated list of the directories next to output_path
    that have the same owner, group, permissions and device as output_path.  */
 static const char **
@@ -408,6 +432,7 @@ siblings_uncached (const char *output_path)
   return elems;
 }
 
+
 /* Return a NULL terminated list of the directories next to output_path
    that have the same owner, group, permissions and device as output_path.
    Cache the result for future calls.  */
@@ -434,6 +459,7 @@ siblings (const char *output_path)
   return last_result;
 }
 
+
 /* Read as many bytes from a file descriptor as possible.  */
 static ssize_t
 full_read (int fd, void *bufarea, size_t nbyte)
@@ -457,6 +483,7 @@ full_read (int fd, void *bufarea, size_t nbyte)
   return buf - (char *) bufarea;
 }
 
+
 /* Compare the contents of two regular files of the same size.  Return 0
    if they are equal, 1 if they are different, or -1 if an error occurs.  */
 static int
@@ -506,9 +533,10 @@ compare_files (const char *filename1, const char *filename2, size_t size,
   return ret;
 }
 
+
 /* Write a locale file, with contents given by N_ELEM and VEC.  */
 void
-write_locale_data (const char *output_path, const char *category,
+write_locale_data (const char *output_path, int catidx, const char *category,
 		   size_t n_elem, struct iovec *vec)
 {
   size_t cnt, step, maxiov;
@@ -516,6 +544,32 @@ write_locale_data (const char *output_path, const char *category,
   char *fname;
   const char **other_paths;
 
+  if (! no_archive)
+    {
+      /* The data will be added to the archive.  For now we simply
+	 generate the image which will be written.  First determine
+	 the size.  */
+      int cnt;
+      void *endp;
+
+      to_archive[catidx].size = 0;
+      for (cnt = 0; cnt < n_elem; ++cnt)
+	to_archive[catidx].size += vec[cnt].iov_len;
+
+      /* Allocate the memory for it.  */
+      to_archive[catidx].addr = xmalloc (to_archive[catidx].size);
+
+      /* Fill it in.  */
+      for (cnt = 0, endp = to_archive[catidx].addr; cnt < n_elem; ++cnt)
+	endp = mempcpy (endp, vec[cnt].iov_base, vec[cnt].iov_len);
+
+      /* Compute the MD5 sum for the data.  */
+      __md5_buffer (to_archive[catidx].addr, to_archive[catidx].size,
+		    to_archive[catidx].sum);
+
+      return;
+    }
+
   fname = xmalloc (strlen (output_path) + 2 * strlen (category) + 7);
 
   /* Normally we write to the directory pointed to by the OUTPUT_PATH.
@@ -680,8 +734,7 @@ failure while writing data for category `%s'"), category));
 			  char * tmp_fname =
 			    (char *) xmalloc (strlen (fname) + 4 + 1);
 
-			  strcpy (tmp_fname, fname);
-			  strcat (tmp_fname, ".tmp");
+			  strcpy (stpcpy (tmp_fname, fname), ".tmp");
 
 			  if (link (other_fname, tmp_fname) >= 0)
 			    {