You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
7.2 KiB
202 lines
7.2 KiB
7 years ago
|
Add --list-archive FILE support to localedef.
|
||
|
|
||
|
This feature largely supports the integrated work
|
||
|
for InstLang support, and does not explicitly change
|
||
|
any help text or behaviour at the API level for these
|
||
|
routines. The basic purpose is to allow a file name to
|
||
|
propagate to through the internal APIs to be used instead
|
||
|
of the default locale archive. Given that build-locale-archive
|
||
|
links against copies of the internal API it can use these
|
||
|
non-public APIs without problem.
|
||
|
|
||
|
Author: Carlos O'Donell <carlos@redhat.com>
|
||
|
Date: Mon Feb 24 22:33:35 2014 -0500
|
||
|
|
||
|
Fix failure load locale template.
|
||
|
|
||
|
The call to open_tmpl_archive was being passed a pointer to an
|
||
|
object allocated on the stack. The object on the stack is not
|
||
|
guaranteed to be initialized to zero so we need to minimally
|
||
|
initialize `fname' in the struct locarhandle to ensure that
|
||
|
open_tml_archive loads the default tempalte.
|
||
|
|
||
|
This error was seen while debugging glibc installs in a qemu
|
||
|
VM where it is more likely the stack pages were dirty. It has
|
||
|
not been reported on non-VM systems.
|
||
|
|
||
|
Author: Carlos O'Donell <carlos@redhat.com>
|
||
|
Date: Fri Oct 18 23:27:45 2013 -0400
|
||
|
|
||
|
Allow fill_archive to be called with NULL fname.
|
||
|
|
||
|
The fill_archive function should support being
|
||
|
called with a NULL fname argument. A NULL fname
|
||
|
argument indicates that the default archive should
|
||
|
be opened. We enable this by setting ah.fname to
|
||
|
NULL before initializing ah or calling open_archive.
|
||
|
This way if fname is NULL then ah.fname remains NULL
|
||
|
and open_archive opens the default archive.
|
||
|
|
||
|
Author: Carlos O'Donell <carlos@redhat.com>
|
||
|
Date: Thu Oct 3 05:22:51 2013 -0400
|
||
|
|
||
|
[snip]
|
||
|
- Support `--list-archive FILE' in localedef utility.
|
||
|
|
||
|
This landed upstream in:
|
||
|
|
||
|
commit 484c12fb1e3664fb434291234ea5787c5e3df4f5
|
||
|
Author: Carlos O'Donell <carlos@redhat.com>
|
||
|
Date: Fri Oct 18 23:41:30 2013 -0400
|
||
|
|
||
|
Enhance localedef --list-archive option.
|
||
|
|
||
|
The localedef --list-archive option claims that it can
|
||
|
accept a [file] argument and list the contents of that
|
||
|
archive. The support was never implemented. This patch
|
||
|
adds that support and allows --list-archive to work as
|
||
|
expected. You can now use localedef to list the contents
|
||
|
of arbitrary locale archives by using:
|
||
|
./localedef --list-archive file
|
||
|
|
||
|
The defaultfname flag was removed there, see
|
||
|
<https://sourceware.org/ml/libc-alpha/2013-10/msg00127.html>.
|
||
|
|
||
|
Index: glibc-2.17-c758a686/locale/locarchive.h
|
||
|
===================================================================
|
||
|
--- glibc-2.17-c758a686.orig/locale/locarchive.h
|
||
|
+++ glibc-2.17-c758a686/locale/locarchive.h
|
||
|
@@ -80,6 +80,8 @@ struct locrecent
|
||
|
|
||
|
struct locarhandle
|
||
|
{
|
||
|
+ /* Full path to the locale archive file. */
|
||
|
+ const char *fname;
|
||
|
int fd;
|
||
|
void *addr;
|
||
|
size_t mmaped;
|
||
|
Index: glibc-2.17-c758a686/locale/programs/localedef.c
|
||
|
===================================================================
|
||
|
--- glibc-2.17-c758a686.orig/locale/programs/localedef.c
|
||
|
+++ glibc-2.17-c758a686/locale/programs/localedef.c
|
||
|
@@ -202,7 +202,7 @@ main (int argc, char *argv[])
|
||
|
|
||
|
/* Handle a few special cases. */
|
||
|
if (list_archive)
|
||
|
- show_archive_content (verbose);
|
||
|
+ show_archive_content (remaining > 1 ? argv[remaining] : NULL, verbose);
|
||
|
if (add_to_archive)
|
||
|
return add_locales_to_archive (argc - remaining, &argv[remaining],
|
||
|
replace_archive);
|
||
|
Index: glibc-2.17-c758a686/locale/programs/localedef.h
|
||
|
===================================================================
|
||
|
--- glibc-2.17-c758a686.orig/locale/programs/localedef.h
|
||
|
+++ glibc-2.17-c758a686/locale/programs/localedef.h
|
||
|
@@ -176,7 +176,8 @@ extern int add_locales_to_archive (size_
|
||
|
/* Removed named locales from archive. */
|
||
|
extern int delete_locales_from_archive (size_t nlist, char *list[]);
|
||
|
|
||
|
-/* List content of locale archive. */
|
||
|
-extern void show_archive_content (int verbose) __attribute__ ((noreturn));
|
||
|
+/* List content of locale archive. If FNAME is non-null use that as
|
||
|
+ the locale archive to list, otherwise the default. */
|
||
|
+extern void show_archive_content (char *fname, int verbose) __attribute__ ((noreturn));
|
||
|
|
||
|
#endif /* localedef.h */
|
||
|
Index: glibc-2.17-c758a686/locale/programs/locarchive.c
|
||
|
===================================================================
|
||
|
--- glibc-2.17-c758a686.orig/locale/programs/locarchive.c
|
||
|
+++ glibc-2.17-c758a686/locale/programs/locarchive.c
|
||
|
@@ -197,6 +197,7 @@ create_archive (const char *archivefname
|
||
|
_("cannot change mode of new locale archive"));
|
||
|
}
|
||
|
|
||
|
+ ah->fname = NULL;
|
||
|
ah->fd = fd;
|
||
|
ah->addr = p;
|
||
|
ah->mmaped = total;
|
||
|
@@ -519,11 +520,19 @@ open_archive (struct locarhandle *ah, bo
|
||
|
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);
|
||
|
+ char fname[prefix_len + sizeof (ARCHIVE_NAME)];
|
||
|
+ char *archivefname = ah->fname;
|
||
|
+ bool defaultfname = false;
|
||
|
+
|
||
|
+ /* If ah has a non-NULL fname open that otherwise open the default. */
|
||
|
+ if (archivefname == NULL)
|
||
|
+ {
|
||
|
+ defaultfname = true;
|
||
|
+ archivefname = fname;
|
||
|
+ if (output_prefix)
|
||
|
+ memcpy (archivefname, output_prefix, prefix_len);
|
||
|
+ strcpy (archivefname + prefix_len, ARCHIVE_NAME);
|
||
|
+ }
|
||
|
|
||
|
while (1)
|
||
|
{
|
||
|
@@ -531,8 +540,11 @@ open_archive (struct locarhandle *ah, bo
|
||
|
fd = open64 (archivefname, readonly ? O_RDONLY : O_RDWR);
|
||
|
if (fd == -1)
|
||
|
{
|
||
|
- /* Maybe the file does not yet exist. */
|
||
|
- if (errno == ENOENT)
|
||
|
+ /* Maybe the file does not yet exist? If we are opening
|
||
|
+ the default locale archive we ignore the failure and
|
||
|
+ list an empty archive, otherwise we print an error
|
||
|
+ and exit. */
|
||
|
+ if (errno == ENOENT && defaultfname)
|
||
|
{
|
||
|
if (readonly)
|
||
|
{
|
||
|
@@ -1258,6 +1270,7 @@ add_locales_to_archive (nlist, list, rep
|
||
|
|
||
|
/* Open the archive. This call never returns if we cannot
|
||
|
successfully open the archive. */
|
||
|
+ ah.fname = NULL;
|
||
|
open_archive (&ah, false);
|
||
|
|
||
|
while (nlist-- > 0)
|
||
|
@@ -1457,6 +1470,7 @@ delete_locales_from_archive (nlist, list
|
||
|
|
||
|
/* Open the archive. This call never returns if we cannot
|
||
|
successfully open the archive. */
|
||
|
+ ah.fname = NULL;
|
||
|
open_archive (&ah, false);
|
||
|
|
||
|
head = ah.addr;
|
||
|
@@ -1545,7 +1559,7 @@ dataentcmp (const void *a, const void *b
|
||
|
|
||
|
|
||
|
void
|
||
|
-show_archive_content (int verbose)
|
||
|
+show_archive_content (char *fname, int verbose)
|
||
|
{
|
||
|
struct locarhandle ah;
|
||
|
struct locarhead *head;
|
||
|
@@ -1555,6 +1569,7 @@ show_archive_content (int verbose)
|
||
|
|
||
|
/* Open the archive. This call never returns if we cannot
|
||
|
successfully open the archive. */
|
||
|
+ ah.fname = fname;
|
||
|
open_archive (&ah, true);
|
||
|
|
||
|
head = ah.addr;
|
||
|
Index: glibc-2.17-c758a686/locale/programs/locfile.c
|
||
|
===================================================================
|
||
|
--- glibc-2.17-c758a686.orig/locale/programs/locfile.c
|
||
|
+++ glibc-2.17-c758a686/locale/programs/locfile.c
|
||
|
@@ -337,6 +337,7 @@ write_all_categories (struct localedef_t
|
||
|
|
||
|
/* Open the archive. This call never returns if we cannot
|
||
|
successfully open the archive. */
|
||
|
+ ah.fname = NULL;
|
||
|
open_archive (&ah, false);
|
||
|
|
||
|
if (add_locale_to_archive (&ah, locname, to_archive, true) != 0)
|