--- manual/files.me +++ manual/files.me 2009-01-15 01:02:11.000000000 +0100 @@ -135,9 +135,11 @@ manpath. However, if the element is not mentioned in the config file, a man directory relative to it will be sought. The subdirectories -.i ../man +.i ../man , +.i man , +.i ../share/man , or -.i man +.i share/man relative to the path component are appended to the internal manpath if they exist. Finally, the internal manpath is stripped of duplicate paths before --- src/manp.c +++ src/manp.c 2009-01-15 01:02:11.000000000 +0100 @@ -58,6 +58,7 @@ #include #include "xgetcwd.h" +#include "xvasprintf.h" #include "gettext.h" #define _(String) gettext (String) @@ -886,7 +887,8 @@ static char *def_path (int flag) * directories listed in the man_db.config file. If so, and it is * not already in the manpath, add it. If the directory is not listed * in the man_db.config file, see if there is a subdirectory `../man' or - * `man'. If so, and it is not already in the manpath, add it. + * `man', or, for FHS-compliance, `../share/man' or `share/man'. If so, + * and it is not already in the manpath, add it. * Example: user has $HOME/bin in his path and the directory * $HOME/man exists -- the directory $HOME/man will be added * to the manpath. @@ -941,13 +943,15 @@ static inline char *get_manpath_from_pat t = has_mandir (p); if (t) { - debug ("but does have a ../man or man " + debug ("but does have a ../man, man, " + "../share/man, or share/man " "subdirectory\n"); add_dir_to_list (tmplist, t); free (t); } else - debug ("and doesn't have ../man or man " + debug ("and doesn't have ../man, man, " + "../share/man, or share/man " "subdirectories\n"); } } @@ -1022,34 +1026,41 @@ static void add_dir_to_list (char **lp, } } -/* path does not exist in config file: check to see if path/../man or - path/man exist. If so return it, if not return NULL. */ +/* path does not exist in config file: check to see if path/../man, + path/man, path/../share/man, or path/share/man exist. If so return + it, if not return NULL. */ static inline char *has_mandir (const char *path) { - char *newpath = NULL; + char *newpath; /* don't assume anything about path, especially that it ends in "bin" or even has a '/' in it! */ char *subdir = strrchr (path, '/'); if (subdir) { - const int prefix_len = subdir + 1 - path; - newpath = xmalloc (prefix_len + sizeof ("man") + 1); - strncpy (newpath, path, prefix_len); - strcpy (newpath + prefix_len, "man"); - + newpath = xasprintf ("%.*s/man", subdir - path, path); if (is_directory (newpath) == 1) return newpath; - else - *newpath = '\0'; + free (newpath); } - newpath = appendstr (newpath, path, "/man", NULL); - + newpath = appendstr (NULL, path, "/man", NULL); if (is_directory (newpath) == 1) return newpath; + free (newpath); + + if (subdir) { + newpath = xasprintf ("%.*s/share/man", subdir - path, path); + if (is_directory (newpath) == 1) + return newpath; + free (newpath); + } + newpath = appendstr (NULL, path, "/share/man", NULL); + if (is_directory (newpath) == 1) + return newpath; free (newpath); + return NULL; }