blob: 568f742100c53336121dbdc161fdd1fb008aecd2 [file] [log] [blame]
Upstream-Status: Pending
Signed-off-by: Scott Garman <scott.a.garman@intel.com>
diff -Naur man-1.6e.orig/catopen/catopen.c man-1.6e/catopen/catopen.c
--- man-1.6e.orig/catopen/catopen.c 2005-08-20 20:26:06.000000000 -0300
+++ man-1.6e/catopen/catopen.c 2007-05-18 11:31:05.000000000 -0300
@@ -9,22 +9,63 @@
extern char *index (const char *, int); /* not always in <string.h> */
extern char *my_malloc(int); /* in util.c */
+/* if the program has sgid/suid privileges then getenv doesn't return
+ * NLSPATH; so we set here a good default value.
+ */
#ifndef DEFAULT_NLSPATH
# if __GLIBC__ >= 2
-# define DEFAULT_NLSPATH "/usr/share/locale/%L/%N"
+# define DEFAULT_NLSPATH "/usr/share/locale/%L/%N:/usr/share/locale/%l_%t/%N:/usr/share/locale/%l/%N"
# else
# define DEFAULT_NLSPATH "/usr/lib/locale/%N/%L"
# endif
#endif
-static nl_catd my_catopenpath(char *name, char *path);
+static nl_catd my_catopenpath(char *name, char *path, char *lang);
static /* this source included in gripes.c */
nl_catd
my_catopen(char *name, int oflag) {
- nl_catd fd;
+ nl_catd fd = (nl_catd) -1;
+
+ /* using first the my_catopenpath, which looks with LANGUAGE
+ * and only if it fails ressort to catopen, it gives better i18n
+ */
+ {
+ char *nlspath, *lang, *s;
- fd = catopen(name, oflag);
+ /*
+ * "If NLSPATH does not exist in the environment, or if a
+ * message catalog cannot be opened in any of the paths specified
+ * by NLSPATH, then an implementation defined default path is used"
+ */
+ nlspath = getenv("NLSPATH");
+ if (!nlspath)
+ nlspath = DEFAULT_NLSPATH;
+
+ lang = getenv("LANGUAGE");
+ if (!lang)
+ lang = getenv("LC_ALL");
+ if (!lang)
+ lang = getenv("LC_MESSAGES");
+ if (!lang)
+ lang = getenv("LANG");
+ if (!lang)
+ lang = "";
+
+ while(*lang && (fd == (nl_catd) -1)) {
+ s = index(lang, ':');
+ if (s) *s = 0;
+ fd = my_catopenpath(name, nlspath, lang);
+ if (s) lang=s+1;
+ else lang = "";
+ }
+ if (fd == (nl_catd) -1)
+ fd = my_catopenpath(name, nlspath, "en");
+ }
+
+ /* still not found, use the system catopen */
+ if (fd == (nl_catd) -1)
+ fd = catopen(name, oflag);
if (fd == (nl_catd) -1 && oflag) {
oflag = 0;
@@ -32,8 +73,6 @@
}
if (fd == (nl_catd) -1) {
- char *nlspath;
-
/* The libc catopen fails - let us see if we can do better */
/* The quotes below are from X/Open, XPG 1987, Vol. 3. */
@@ -58,17 +97,6 @@
#endif
}
- /*
- * "If NLSPATH does not exist in the environment, or if a
- * message catalog cannot be opened in any of the paths specified
- * by NLSPATH, then an implementation defined default path is used"
- */
-
- nlspath = getenv("NLSPATH");
- if (nlspath)
- fd = my_catopenpath(name, nlspath);
- if (fd == (nl_catd) -1)
- fd = my_catopenpath(name, DEFAULT_NLSPATH);
}
return fd;
}
@@ -90,15 +118,13 @@
*
*/
static nl_catd
-my_catopenpath(char *name, char *nlspath) {
- int fd;
+my_catopenpath(char *name, char *nlspath, char *lang) {
nl_catd cfd = (nl_catd) -1;
- char *path0, *path, *s, *file, *lang, *lang_l, *lang_t, *lang_c;
+ char *path0, *path, *s, *file, *lang_l, *lang_t, *lang_c;
int langsz, namesz, sz, lang_l_sz, lang_t_sz, lang_c_sz;
namesz = strlen(name);
- lang = getenv("LANG");
if (!lang)
lang = "";
langsz = strlen(lang);
@@ -194,14 +220,9 @@
path = s+1;
} else
path = 0;
- fd = open(file, O_RDONLY);
- if (fd != -1) {
- /* we found the right catalog - but we don't know the
- type of nl_catd, so close it again and ask libc */
- close(fd);
- cfd = catopen(file, 0);
- break;
- }
+ cfd = catopen(file, 0);
+ if (cfd != (nl_catd) -1)
+ break;
}
free(path0);
diff -Naur man-1.6e.orig/src/manpath.c man-1.6e/src/manpath.c
--- man-1.6e.orig/src/manpath.c 2006-08-03 18:18:33.000000000 -0300
+++ man-1.6e/src/manpath.c 2007-05-18 11:02:48.000000000 -0300
@@ -282,13 +282,14 @@
/* We cannot use "lang = setlocale(LC_MESSAGES, NULL)" or so:
the return value of setlocale is an opaque string. */
/* POSIX prescribes the order: LC_ALL, LC_MESSAGES, LANG */
- if((lang = getenv("LC_ALL")) != NULL)
+ /* LANGUAGE is GNU/Linux and overrules all */
+ if((lang = getenv("LANGUAGE")) != NULL)
split2(dir, lang, add_to_mandirlist_x, perrs);
- if((lang = getenv("LC_MESSAGES")) != NULL)
+ else if((lang = getenv("LC_ALL")) != NULL)
split2(dir, lang, add_to_mandirlist_x, perrs);
- if((lang = getenv("LANG")) != NULL)
+ else if((lang = getenv("LC_MESSAGES")) != NULL)
split2(dir, lang, add_to_mandirlist_x, perrs);
- if((lang = getenv("LANGUAGE")) != NULL)
+ else if((lang = getenv("LANG")) != NULL)
split2(dir, lang, add_to_mandirlist_x, perrs);
add_to_mandirlist_x(dir, 0, perrs);
}