Upstream-Status: Pending Signed-off-by: Scott Garman 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 */ 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); }