summaryrefslogtreecommitdiff
path: root/locale/programs/locale.c
diff options
context:
space:
mode:
Diffstat (limited to 'locale/programs/locale.c')
-rw-r--r--locale/programs/locale.c110
1 files changed, 33 insertions, 77 deletions
diff --git a/locale/programs/locale.c b/locale/programs/locale.c
index c37dad8649..7a42f1e3a4 100644
--- a/locale/programs/locale.c
+++ b/locale/programs/locale.c
@@ -35,10 +35,12 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <unistd.h>
#include <sys/stat.h>
#include "localeinfo.h"
+#include "charmap-dir.h"
+
+extern char *xstrdup (const char *__str);
/* If set print the name of the category. */
@@ -251,7 +253,7 @@ more_help (int key, const char *text, void *input)
{
case ARGP_KEY_HELP_EXTRA:
/* We print some extra information. */
- return strdup (gettext ("\
+ return xstrdup (gettext ("\
Report bugs using the `glibcbug' script to <bugs@gnu.org>.\n"));
default:
break;
@@ -320,7 +322,7 @@ write_locales (void)
{
mode_t mode;
#ifdef _DIRENT_HAVE_D_TYPE
- if (dirent->d_type != DT_UNKNOWN)
+ if (dirent->d_type != DT_UNKNOWN && dirent->d_type != DT_LNK)
mode = DTTOIF (dirent->d_type);
else
#endif
@@ -348,7 +350,7 @@ write_locales (void)
"/LC_CTYPE");
if (stat (buf, &st) == 0 && S_ISREG (st.st_mode))
- PUT (strdup (dirent->d_name));
+ PUT (xstrdup (dirent->d_name));
}
}
@@ -425,7 +427,7 @@ write_locales (void)
*cp++ = '\0';
/* Add the alias. */
- PUT (strdup (alias));
+ PUT (xstrdup (alias));
}
}
@@ -453,84 +455,38 @@ static void
write_charmaps (void)
{
void *all_data = NULL;
- DIR *dir;
- struct dirent *dirent;
+ CHARMAP_DIR *dir;
+ const char *dirent;
- dir = opendir (CHARMAP_PATH);
+ /* Look for all files in the charmap directory. */
+ dir = charmap_opendir (CHARMAP_PATH);
if (dir == NULL)
- {
- error (1, errno, gettext ("cannot read character map directory `%s'"),
- CHARMAP_PATH);
- return;
- }
-
- /* Now we can look for all files in the directory. */
- while ((dirent = readdir (dir)) != NULL)
- if (strcmp (dirent->d_name, ".") != 0
- && strcmp (dirent->d_name, "..") != 0)
- {
- char *buf = NULL;
- mode_t mode;
+ return;
-#ifdef _DIRENT_HAVE_D_TYPE
- if (dirent->d_type != DT_UNKNOWN)
- mode = DTTOIF (dirent->d_type);
- else
+ while ((dirent = charmap_readdir (dir)) != NULL)
+ {
+ char **aliases;
+ char **p;
+
+ PUT (xstrdup (dirent));
+
+ aliases = charmap_aliases (CHARMAP_PATH, dirent);
+
+#if 0
+ /* Add the code_set_name and the aliases. */
+ for (p = aliases; *p; p++)
+ PUT (xstrdup (*p));
+#else
+ /* Add the code_set_name only. Most aliases are obsolete. */
+ p = aliases;
+ if (*p)
+ PUT (xstrdup (*p));
#endif
- {
- struct stat st;
-
- buf = alloca (sizeof (CHARMAP_PATH) + strlen (dirent->d_name) + 1);
-
- stpcpy (stpcpy (stpcpy (buf, CHARMAP_PATH), "/"), dirent->d_name);
-
- if (stat (buf, &st) < 0)
- continue;
- mode = st.st_mode;
- }
-
- if (S_ISREG (mode))
- {
- FILE *fp;
-
- PUT (strdup (dirent->d_name));
-
- /* Read the file and learn about the code set name. */
- if (buf == NULL)
- {
- buf = alloca (sizeof (CHARMAP_PATH)
- + strlen (dirent->d_name) + 1);
-
- stpcpy (stpcpy (stpcpy (buf, CHARMAP_PATH), "/"),
- dirent->d_name);
- }
- fp = fopen (buf, "r");
- if (fp != NULL)
- {
- char *name = NULL;
-
- while (!feof (fp))
- {
- char junk[BUFSIZ];
-
- if (fscanf (fp, " <code_set_name> %as", &name) == 1)
- break;
-
- while (fgets (junk, sizeof junk, fp) != NULL
- && strchr (junk, '\n') == NULL)
- continue;
- }
-
- fclose (fp);
-
- if (name != NULL)
- PUT (name);
- }
- }
- }
+ charmap_free_aliases (aliases);
+ }
- closedir (dir);
+ charmap_closedir (dir);
twalk (all_data, print_names);
}