(to_archive): New variable. To collect
authordrepper <drepper>
Thu, 18 Apr 2002 08:00:51 +0000 (08:00 +0000)
committerdrepper <drepper>
Thu, 18 Apr 2002 08:00:51 +0000 (08:00 +0000)
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.

locale/programs/locfile.c

index 07a65bb..4d978d1 100644 (file)
 #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)
                            {