Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/man Add support for man -p to print the search path ...
details: https://anonhg.NetBSD.org/src/rev/b21dc56d89f8
branches: trunk
changeset: 766072:b21dc56d89f8
user: joerg <joerg%NetBSD.org@localhost>
date: Tue Jun 14 18:53:48 2011 +0000
description:
Add support for man -p to print the search path for manual pages (not
including cat page directories).
>From Abhinav Upadhyay as part of Google's Summer of Code 2011
diffstat:
usr.bin/man/man.1 | 8 +++++-
usr.bin/man/man.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++----
2 files changed, 63 insertions(+), 7 deletions(-)
diffs (163 lines):
diff -r 2a2cbe2cfcad -r b21dc56d89f8 usr.bin/man/man.1
--- a/usr.bin/man/man.1 Tue Jun 14 16:33:51 2011 +0000
+++ b/usr.bin/man/man.1 Tue Jun 14 18:53:48 2011 +0000
@@ -1,4 +1,4 @@
-.\" $NetBSD: man.1,v 1.21 2009/10/07 08:30:31 cegger Exp $
+.\" $NetBSD: man.1,v 1.22 2011/06/14 18:53:48 joerg Exp $
.\"
.\" Copyright (c) 1989, 1990, 1993
.\" The Regents of the University of California. All rights reserved.
@@ -29,7 +29,7 @@
.\"
.\" @(#)man.1 8.2 (Berkeley) 1/2/94
.\"
-.Dd October 6, 2009
+.Dd June 14, 2011
.Dt MAN 1
.Os
.Sh NAME
@@ -54,6 +54,8 @@
.Op Fl M Ar path
.Op Fl m Ar path
.Ar keyword Ar ...
+.Nm
+.Op Fl p
.Sh DESCRIPTION
The
.Nm
@@ -130,6 +132,8 @@
line in the
.Nm
configuration file.
+.It Fl p
+Print the search path for the manual pages.
.It Fl s
Restrict the directories that
.Nm
diff -r 2a2cbe2cfcad -r b21dc56d89f8 usr.bin/man/man.c
--- a/usr.bin/man/man.c Tue Jun 14 16:33:51 2011 +0000
+++ b/usr.bin/man/man.c Tue Jun 14 18:53:48 2011 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: man.c,v 1.41 2010/07/07 21:24:34 christos Exp $ */
+/* $NetBSD: man.c,v 1.42 2011/06/14 18:53:48 joerg Exp $ */
/*
* Copyright (c) 1987, 1993, 1994, 1995
@@ -40,12 +40,13 @@
#if 0
static char sccsid[] = "@(#)man.c 8.17 (Berkeley) 1/31/95";
#else
-__RCSID("$NetBSD: man.c,v 1.41 2010/07/07 21:24:34 christos Exp $");
+__RCSID("$NetBSD: man.c,v 1.42 2011/06/14 18:53:48 joerg Exp $");
#endif
#endif /* not lint */
#include <sys/param.h>
#include <sys/queue.h>
+#include <sys/stat.h>
#include <sys/utsname.h>
#include <ctype.h>
@@ -84,7 +85,8 @@
char *pathsearch; /* -S: path of man must contain this string */
char *sectionname; /* -s: limit search to a given man section */
int where; /* -w: just show paths of all matching files */
-
+ int getpath; /* -p: print the path of directories containing man pages */
+
/* important tags from the config file */
TAG *defaultpath; /* _default: default MANPATH */
TAG *subdirs; /* _subdir: default subdir search list */
@@ -118,6 +120,7 @@
static void usage(void) __attribute__((__noreturn__));
static void addpath(struct manstate *, const char *, size_t, const char *);
static const char *getclass(const char *);
+static void printmanpath(struct manstate *);
/*
* main function
@@ -137,7 +140,7 @@
/*
* parse command line...
*/
- while ((ch = getopt(argc, argv, "-aC:cfhkM:m:P:s:S:w")) != -1)
+ while ((ch = getopt(argc, argv, "-aC:cfhkM:m:P:ps:S:w")) != -1)
switch (ch) {
case 'a':
m.all = 1;
@@ -159,6 +162,9 @@
case 'P': /* -P for backward compatibility */
m.manpath = strdup(optarg);
break;
+ case 'p':
+ m.getpath = 1;
+ break;
/*
* The -f and -k options are backward compatible,
* undocumented ways of calling whatis(1) and apropos(1).
@@ -187,7 +193,7 @@
argc -= optind;
argv += optind;
- if (!argc)
+ if (!m.getpath && !argc)
usage();
/*
@@ -358,6 +364,9 @@
}
+ if (m.getpath)
+ printmanpath(&m);
+
/*
* now m.mymanpath is complete!
*/
@@ -986,3 +995,46 @@
getprogname());
exit(EXIT_FAILURE);
}
+
+/*
+ * printmanpath --
+ * Prints a list of directories containing man pages.
+ */
+static void
+printmanpath(struct manstate *m)
+{
+ ENTRY *esubd;
+ char *defaultpath = NULL; /* _default tag value from man.conf. */
+ char *buf; /* for storing temporary values */
+ char **ap;
+ glob_t pg;
+ struct stat sb;
+ TAG *path = m->defaultpath;
+ TAG *subdirs = m->subdirs;
+
+ /* the tail queue is empty if no _default tag is defined in * man.conf */
+ if (TAILQ_EMPTY(&path->entrylist))
+ errx(EXIT_FAILURE, "Empty manpath");
+
+ defaultpath = TAILQ_LAST(&path->entrylist, tqh)->s;
+
+ if (glob(defaultpath, GLOB_BRACE | GLOB_NOSORT, NULL, &pg) != 0)
+ err(EXIT_FAILURE, "glob failed");
+
+ TAILQ_FOREACH(esubd, &subdirs->entrylist, q) {
+ /* Drop cat page directory, only sources are relevant. */
+ if (strncmp(esubd->s, "man", 3))
+ continue;
+
+ for (ap = pg.gl_pathv; *ap != NULL; ++ap) {
+ if (asprintf(&buf, "%s%s", *ap, esubd->s) == -1)
+ err(EXIT_FAILURE, "memory allocation error");
+ /* Skip non-directories. */
+ if (stat(buf, &sb) == 0 && S_ISDIR(sb.st_mode))
+ printf("%s\n", buf);
+
+ free(buf);
+ }
+ }
+ globfree(&pg);
+}
Home |
Main Index |
Thread Index |
Old Index