diff options
| author | Richard Lowe <richlowe@richlowe.net> | 2022-01-23 16:40:25 -0600 |
|---|---|---|
| committer | Richard Lowe <richlowe@richlowe.net> | 2022-02-18 15:33:04 -0600 |
| commit | a7e2137a8db6545c97ed5b1ee50f6ebce79bd6ca (patch) | |
| tree | 4144c5f1bef70a0a0d3a23123493436c8ee44fc6 /usr | |
| parent | b56a90ca8b7f74c630c4f07cb7ec277479afa172 (diff) | |
| download | illumos-joyent-a7e2137a8db6545c97ed5b1ee50f6ebce79bd6ca.tar.gz | |
man: Extend backward compatibility for section renames
Extend the existing logic to support section remapping for renamed
sections (originally added long ago) to map our newly renamed sections
also.
Add support for remapping accidently supported but commonly used
'man foo.4' style specification of sections.
Diffstat (limited to 'usr')
| -rw-r--r-- | usr/src/cmd/man/man.c | 110 |
1 files changed, 76 insertions, 34 deletions
diff --git a/usr/src/cmd/man/man.c b/usr/src/cmd/man/man.c index 3935305932..3a676ee0e5 100644 --- a/usr/src/cmd/man/man.c +++ b/usr/src/cmd/man/man.c @@ -74,6 +74,7 @@ static const struct map_entry { char *old_name; char *new_name; } map[] = { + { "1m", "8" }, { "3b", "3ucb" }, { "3e", "3elf" }, { "3g", "3gen" }, @@ -85,6 +86,16 @@ static const struct map_entry { { "3x", "3curses" }, { "3xc", "3xcurses" }, { "3xn", "3xnet" }, + { "4", "5" }, + { "5", "7" }, + { "7", "4" }, + { "7B", "4B" }, + { "7D", "4D" }, + { "7FS", "4FS" }, + { "7I", "4I" }, + { "7IPP", "4IPP" }, + { "7M", "4M" }, + { "7P", "4P" }, { NULL, NULL } }; @@ -135,18 +146,18 @@ static struct pathmap { dev_t dev; ino_t ino; } bintoman[] = { - { "/sbin", "/usr/share/man,1m", 0, 0 }, - { "/usr/sbin", "/usr/share/man,1m", 0, 0 }, - { "/usr/ucb", "/usr/share/man,1b", 0, 0 }, - { "/usr/bin", "/usr/share/man,1,1m,1s,1t,1c", 0, 0 }, - { "/usr/xpg4/bin", "/usr/share/man,1", 0, 0 }, - { "/usr/xpg6/bin", "/usr/share/man,1", 0, 0 }, - { NULL, NULL, 0, 0 } + { "/sbin", "/usr/share/man,8,1m", 0, 0 }, + { "/usr/sbin", "/usr/share/man,8,1m", 0, 0 }, + { "/usr/ucb", "/usr/share/man,1b", 0, 0 }, + { "/usr/bin", "/usr/share/man,1,8,1m,1s,1t,1c", 0, 0 }, + { "/usr/xpg4/bin", "/usr/share/man,1", 0, 0 }, + { "/usr/xpg6/bin", "/usr/share/man,1", 0, 0 }, + { NULL, NULL, 0, 0 } }; struct man_node { char *path; /* mandir path */ - char **secv; /* submandir suffices */ + char **secv; /* submandir suffixes */ int defsrch; /* hint for man -p */ int frompath; /* hint for man -d */ struct man_node *next; @@ -159,17 +170,16 @@ static int found = 0; static int list = 0; static int makewhatis = 0; static int printmp = 0; -static int sargs = 0; static int psoutput = 0; static int lintout = 0; static int whatis = 0; static int makewhatishere = 0; -static char *mansec; +static char *mansec = NULL; static char *pager = NULL; static char *addlocale(char *); -static struct man_node *build_manpath(char **, int); +static struct man_node *build_manpath(char **, char *, int); static void do_makewhatis(struct man_node *); static char *check_config(char *); static int cmp(const void *, const void *); @@ -182,11 +192,11 @@ static void fullpaths(struct man_node **); static void get_all_sect(struct man_node *); static int getdirs(char *, char ***, int); static void getpath(struct man_node *, char **); -static void getsect(struct man_node *, char **); +static void getsect(struct man_node *, char **, char *); static void init_bintoman(void); static void lower(char *); static void mandir(char **, char *, char *, int); -static int manual(struct man_node *, char *); +static int manual(struct man_node *, char *, char *); static char *map_section(char *, char *); static char *path_to_manpath(char *); static void print_manpath(struct man_node *); @@ -283,7 +293,6 @@ main(int argc, char **argv) break; case 's': mansec = optarg; - sargs++; break; case 'r': lintout++; @@ -334,8 +343,7 @@ main(int argc, char **argv) manpath = DEFMANDIR; } pathv = split(manpath, ':'); - mandirs = build_manpath(pathv, bmp_flags); - freev(pathv); + mandirs = build_manpath(pathv, mansec, bmp_flags); fullpaths(&mandirs); if (makewhatis) { @@ -377,7 +385,7 @@ main(int argc, char **argv) for (i = 0; i < argc; i++) { char *cmd; static struct man_node *mp; - char *pv[2]; + char *pv[2] = {NULL, NULL}; /* * If full path to command specified, customize @@ -389,23 +397,56 @@ main(int argc, char **argv) err(1, "strdup"); pv[1] = NULL; *cmd = '/'; - mp = build_manpath(pv, + mp = build_manpath(pv, mansec, BMP_ISPATH | BMP_FALLBACK_DEFMANDIR); } else { mp = mandirs; } - if (apropos) + if (apropos) { whatapro(mp, argv[i]); - else - ret += manual(mp, argv[i]); + } else { + /* + * If a page is specified with an embedded section, + * such as 'printf.3c' First try to find it literally + * (which has historically worked due to the + * implementation of mandir() and has come to be + * relied upon), if that doesn't work split it at the + * right most '.' to separate a hypothetical name and + * section, and explicitly search under the specified + * section, which will trigger the section name + * compatibility logic. + * + * The error that the page they initially requested + * does not exist will still be produced at this + * point, and indicate (unless clobbered by the pager) + * what has been done. + */ + int lret = 0; + + lret = manual(mp, argv[i], NULL); + if (lret != 0) { + char *sec = NULL; + + if ((sec = strrchr(argv[i], '.')) != NULL) { + char *page = NULL; + *sec++ = '\0'; + if ((page = strdup(argv[i])) == NULL) + err(1, "strdup"); + mp = build_manpath(pathv, sec, 0); + lret = manual(mp, page, sec); + free(page); + } + } + ret += lret; + } if (mp != NULL && mp != mandirs) { free(pv[0]); free_manp(mp); } } - + freev(pathv); return (ret == 0 ? 0 : 1); } @@ -415,7 +456,7 @@ main(int argc, char **argv) * flags. */ static struct man_node * -build_manpath(char **pathv, int flags) +build_manpath(char **pathv, char *sec, int flags) { struct man_node *manpage = NULL; struct man_node *currp = NULL; @@ -458,7 +499,7 @@ build_manpath(char **pathv, int flags) lastp = manpage = currp; getpath(currp, p); - getsect(currp, p); + getsect(currp, p, sec); /* * If there are no new elements in this path, @@ -518,7 +559,7 @@ getpath(struct man_node *manp, char **pv) * directories) into the manp structure. */ static void -getsect(struct man_node *manp, char **pv) +getsect(struct man_node *manp, char **pv, char *explicit_sec) { char *sections; char **sectp; @@ -529,9 +570,10 @@ getsect(struct man_node *manp, char **pv) DPRINTF("-- Adding %s\n", manp->path); manp->secv = NULL; get_all_sect(manp); - } else if (sargs) { - DPRINTF("-- Adding %s: sections=%s\n", manp->path, mansec); - manp->secv = split(mansec, ','); + } else if (explicit_sec != NULL) { + DPRINTF("-- Adding %s: sections=%s\n", manp->path, + explicit_sec); + manp->secv = split(explicit_sec, ','); for (sectp = manp->secv; *sectp; sectp++) lower(*sectp); } else if ((sections = strchr(*pv, ',')) != NULL) { @@ -743,12 +785,12 @@ search_whatis(char *whatpath, char *word) if (regcomp(&preg, pkwd, REG_BASIC | REG_ICASE | REG_NOSUB) != 0) err(1, "regcomp"); - if (sargs) + if (mansec != NULL) ss = split(mansec, ','); while (getline(&line, &linecap, fp) > 0) { if (regexec(&preg, line, 0, NULL, 0) == 0) { - if (sargs) { + if (mansec != NULL) { /* Section-restricted search */ for (i = 0; ss[i] != NULL; i++) { (void) snprintf(s, sizeof (s), "(%s)", @@ -939,7 +981,7 @@ cmp(const void *arg1, const void *arg2) * Find a manpage. */ static int -manual(struct man_node *manp, char *name) +manual(struct man_node *manp, char *name, char *sec) { struct man_node *p; struct man_node *local; @@ -964,7 +1006,7 @@ manual(struct man_node *manp, char *name) if (ndirs != 0) { ldirs[0] = ldir; ldirs[1] = NULL; - local = build_manpath(ldirs, 0); + local = build_manpath(ldirs, mansec, 0); DPRINTF("-- Locale specific subdir: %s\n", ldir); mandir(local->secv, ldir, name, 1); @@ -985,10 +1027,10 @@ manual(struct man_node *manp, char *name) } if (!found) { - if (sargs) { + if (sec != NULL) { (void) fprintf(stderr, gettext( "No manual entry for %s in section(s) %s\n"), - fullname, mansec); + fullname, sec); } else { (void) fprintf(stderr, gettext("No manual entry for %s\n"), fullname); |
