diff options
author | Ulrich Drepper <drepper@redhat.com> | 2002-05-01 17:09:58 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2002-05-01 17:09:58 +0000 |
commit | 531bafd8a6384b15f1ddc7f2360bb55a4542856a (patch) | |
tree | 5886b1fd757e7aab9d96626bda0bc1bed6afc76e /locale/programs/locarchive.c | |
parent | 3e992afaaf284d24dab4dd136cc3aee5a2b92d6e (diff) | |
download | glibc-531bafd8a6384b15f1ddc7f2360bb55a4542856a.tar.gz glibc-531bafd8a6384b15f1ddc7f2360bb55a4542856a.tar.xz glibc-531bafd8a6384b15f1ddc7f2360bb55a4542856a.zip |
Update.
2002-04-30 Jakub Jelinek <jakub@redhat.com> * locale/programs/locarchive.c (create_archive): Add archivefname argument, create fname from it. (enlarge_archive): Honour output_prefix. (open_archive): Likewise. 2002-04-30 Jakub Jelinek <jakub@redhat.com> * locale/programs/locarchive.c (add_locales_to_archive): Don't nest too many stpcpy macros. 2002-04-26 Bruno Haible <bruno@clisp.org> * locale/programs/ld-collate.c (collate_read): Cast first argument for "%.*s" to int. 2002-04-26 Bruno Haible <bruno@clisp.org> * include/libintl.h (__ngettext, __dngettext, __dcngettext, __dcngettext_internal): New declarations. (__gettext, __dgettext, __dcgettext, __dcgettext_internal): Add attribute declarations.
Diffstat (limited to 'locale/programs/locarchive.c')
-rw-r--r-- | locale/programs/locarchive.c | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c index 861dd5bd68..be5514790e 100644 --- a/locale/programs/locarchive.c +++ b/locale/programs/locarchive.c @@ -45,8 +45,9 @@ #include "simple-hash.h" #include "localedef.h" +extern const char *output_prefix; -static const char archivefname[] = LOCALEDIR "/locale-archive"; +#define ARCHIVE_NAME LOCALEDIR "/locale-archive" static const char *locnames[] = { @@ -65,14 +66,16 @@ static const char *locnames[] = static void -create_archive (struct locarhandle *ah) +create_archive (const char *archivefname, struct locarhandle *ah) { int fd; - char fname[] = LOCALEDIR "/locale-archive.XXXXXX"; + char fname[strlen (archivefname) + sizeof (".XXXXXX")]; struct locarhead head; void *p; size_t total; + strcpy (stpcpy (fname, archivefname), ".XXXXXX"); + /* Create a temporary file in the correct directory. */ fd = mkstemp (fname); if (fd == -1) @@ -169,7 +172,6 @@ enlarge_archive (struct locarhandle *ah, const struct locarhead *head) { struct stat64 st; int fd; - char fname[] = LOCALEDIR "/locale-archive.XXXXXX"; struct locarhead newhead; size_t total; void *p; @@ -177,6 +179,14 @@ enlarge_archive (struct locarhandle *ah, const struct locarhead *head) struct namehashent *oldnamehashtab; struct locrecent *oldlocrectab; struct locarhandle new_ah; + size_t prefix_len = output_prefix ? strlen (output_prefix) : 0; + char archivefname[prefix_len + sizeof (ARCHIVE_NAME)]; + char fname[prefix_len + sizeof (ARCHIVE_NAME) + sizeof (".XXXXXX") - 1]; + + if (output_prefix) + memcpy (archivefname, output_prefix, prefix_len); + strcpy (archivefname + prefix_len, ARCHIVE_NAME); + strcpy (stpcpy (fname, archivefname), ".XXXXXX"); /* Not all of the old file has to be mapped. Change this now this we will have to access the whole content. */ @@ -331,6 +341,12 @@ open_archive (struct locarhandle *ah) int fd; struct locarhead head; int retry = 0; + size_t prefix_len = output_prefix ? strlen (output_prefix) : 0; + char archivefname[prefix_len + sizeof (ARCHIVE_NAME)]; + + if (output_prefix) + memcpy (archivefname, output_prefix, prefix_len); + strcpy (archivefname + prefix_len, ARCHIVE_NAME); again: /* Open the archive. We must have exclusive write access. */ @@ -340,7 +356,7 @@ open_archive (struct locarhandle *ah) /* Maybe the file does not yet exist. */ if (errno == ENOENT) { - create_archive (ah); + create_archive (archivefname, ah); return; } else @@ -711,11 +727,8 @@ add_locales_to_archive (nlist, list, replace) directory and it therefore must contain a regular file with the same name except a "SYS_" prefix. */ - strcpy (stpcpy (stpcpy (stpcpy (stpcpy (fullname, - fname), - "/"), - d->d_name), - "/SYS_"), + char *t = stpcpy (stpcpy (fullname, fname), "/"); + strcpy (stpcpy (stpcpy (t, d->d_name), "/SYS_"), d->d_name); if (stat64 (fullname, &st) == -1) @@ -765,11 +778,10 @@ add_locales_to_archive (nlist, list, replace) if (S_ISDIR (st.st_mode)) { + char *t; close (fd); - strcpy (stpcpy (stpcpy (stpcpy (stpcpy (fullname, fname), - "/"), - locnames[cnt]), - "/SYS_"), + t = stpcpy (stpcpy (fullname, fname), "/"); + strcpy (stpcpy (stpcpy (t, locnames[cnt]), "/SYS_"), locnames[cnt]); fd = open64 (fullname, O_RDONLY); |