From 66601c7f92fa43a4476172ff7ee981cfa16d9b0a Mon Sep 17 00:00:00 2001 From: Thomas Cort Date: Fri, 22 Mar 2013 19:03:20 +0000 Subject: [PATCH] Importing usr.bin/whatis - LSC: fixed missing entry in minix/mi Change-Id: I5766dd72819e3b15ef24ab49c5ee3a5aa42049c4 --- distrib/sets/lists/minix/mi | 3 +- man/man5/Makefile | 2 +- man/man5/whatis.5 | 57 -------- releasetools/nbsd_ports | 1 + usr.bin/Makefile | 2 +- usr.bin/whatis/Makefile | 13 ++ usr.bin/whatis/whatis.1 | 116 +++++++++++++++++ usr.bin/whatis/whatis.c | 250 ++++++++++++++++++++++++++++++++++++ 8 files changed, 384 insertions(+), 60 deletions(-) delete mode 100644 man/man5/whatis.5 create mode 100644 usr.bin/whatis/Makefile create mode 100644 usr.bin/whatis/whatis.1 create mode 100644 usr.bin/whatis/whatis.c diff --git a/distrib/sets/lists/minix/mi b/distrib/sets/lists/minix/mi index 6313ed291..ce90878ab 100644 --- a/distrib/sets/lists/minix/mi +++ b/distrib/sets/lists/minix/mi @@ -453,6 +453,7 @@ ./usr/bin/vi minix-sys ./usr/bin/vol minix-sys ./usr/bin/wc minix-sys +./usr/bin/whatis minix-sys ./usr/bin/whereis minix-sys ./usr/bin/which minix-sys ./usr/bin/whoami minix-sys @@ -1421,6 +1422,7 @@ ./usr/man/man1/vol.1 minix-sys ./usr/man/man1/wait.1 minix-sys ./usr/man/man1/wc.1 minix-sys +./usr/man/man1/whatis.1 minix-sys ./usr/man/man1/whereis.1 minix-sys ./usr/man/man1/which.1 minix-sys ./usr/man/man1/who.1 minix-sys @@ -3672,7 +3674,6 @@ ./usr/man/man5/tzfile.5 minix-sys ./usr/man/man5/usermgmt.conf.5 minix-sys ./usr/man/man5/utmp.5 minix-sys -./usr/man/man5/whatis.5 minix-sys ./usr/man/man6 minix-sys ./usr/man/man7/ascii.7 minix-sys ./usr/man/man7/environ.7 minix-sys diff --git a/man/man5/Makefile b/man/man5/Makefile index dbd6a11da..03cf2c62c 100644 --- a/man/man5/Makefile +++ b/man/man5/Makefile @@ -2,7 +2,7 @@ MAN= boot.cfg.5 configfile.5 crontab.5 dhcp.conf.5 dir.5 ethers.5 \ fstab.5 hosts.5 httpd.conf.5 http_status.5 keymap.5 \ passwd.5 resolv.conf.5 resolver.5 rhosts.5 statvfs.5 serv.access.5 \ system.conf.5 syslog.conf.5 termcap.5 ttytab.5 TZ.5 utmp.5 \ - whatis.5 pkg_install.conf.5 pkg_summary.5 + pkg_install.conf.5 pkg_summary.5 MLINKS += passwd.5 group.5 diff --git a/man/man5/whatis.5 b/man/man5/whatis.5 deleted file mode 100644 index ee7eed7aa..000000000 --- a/man/man5/whatis.5 +++ /dev/null @@ -1,57 +0,0 @@ -.TH WHATIS 5 -.SH NAME -whatis \- database of online manual pages -.SH SYNOPSIS -.B /usr/man/*/whatis -.br -.B /usr/man/whatis -.SH DESCRIPTION -The -.B whatis -file in each manual page directory is a database of titles for manual pages. -This database is used by -.BR man (1) -to map titles to manual pages names. The database is created by -.BR makewhatis (1) -from the NAME sections of the manual pages. -.PP -The NAME secions must be simple lines with no troff fluff but one -backslash like these two: -.PP -.RS -whatis \e\- database of online manual pages -.br -cawf, nroff \e\- C version of the nroff-like, Amazingly Workable (text) -Formatter -.RE -.PP -These lines are transformed by -.B makewhatis -to these two lines for the database: -.PP -.RS -cawf, nroff (1) \- C version of the nroff-like, Amazingly Workable (text) -Formatter -.br -whatis (5) \- database of online manual pages -.RE -.PP -As you can see they are in section number order, so that -.B man -searches them in section order. -.PP -Each entry is just a single line, restricting the NAME section to a single -line too with just one dash, and commas and spaces before the dash as you -see above. -.SH "SEE ALSO" -.BR man (1), -.BR whatis (1), -.BR makewhatis (1), -.BR man (7). -.SH BUGS -It seems to be impossible for many manual page writers to keep the NAME -section simple. They also like to use every font available in their -documents. My simple scripts can't read their NAME sections, my simple -me can't read their texts. -.SH AUTHOR -Kees J. Bot (kjb@cs.vu.nl) diff --git a/releasetools/nbsd_ports b/releasetools/nbsd_ports index 344679bab..208d2e13e 100644 --- a/releasetools/nbsd_ports +++ b/releasetools/nbsd_ports @@ -161,6 +161,7 @@ 2012/10/17 12:00:00,usr.bin/tput 2012/10/17 12:00:00,usr.bin/tsort 2010/10/06 07:59:18,usr.bin/uniq +2013/03/22 12:00:00,usr.bin/whatis 2013/03/15 12:00:00,usr.bin/who 2012/10/17 12:00:00,usr.bin/xinstall 2013/03/15 12:00:00,usr.bin/yes diff --git a/usr.bin/Makefile b/usr.bin/Makefile index 9a17fea67..d9ab2b595 100644 --- a/usr.bin/Makefile +++ b/usr.bin/Makefile @@ -30,7 +30,7 @@ SUBDIR= \ uniq \ \ \ - who \ + whatis who \ xinstall yes .if !defined(__MINIX) diff --git a/usr.bin/whatis/Makefile b/usr.bin/whatis/Makefile new file mode 100644 index 000000000..bb29c78e9 --- /dev/null +++ b/usr.bin/whatis/Makefile @@ -0,0 +1,13 @@ +# $NetBSD: Makefile,v 1.8 2002/09/19 11:29:54 lukem Exp $ +# @(#)Makefile 8.1 (Berkeley) 6/6/93 + +.include + +MDIST= ${NETBSDSRCDIR}/usr.bin/man + +PROG= whatis +SRCS= whatis.c manconf.c +.PATH: ${MDIST} +CPPFLAGS+=-I${MDIST} + +.include diff --git a/usr.bin/whatis/whatis.1 b/usr.bin/whatis/whatis.1 new file mode 100644 index 000000000..9d9028c48 --- /dev/null +++ b/usr.bin/whatis/whatis.1 @@ -0,0 +1,116 @@ +.\" $NetBSD: whatis.1,v 1.8 2003/08/07 11:17:16 agc Exp $ +.\" +.\" Copyright (c) 1989, 1990, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)whatis.1 8.1 (Berkeley) 6/6/93 +.\" +.Dd June 6, 1993 +.Dt WHATIS 1 +.Os +.Sh NAME +.Nm whatis +.Nd describe what a command is +.Sh SYNOPSIS +.Nm +.Op Fl C Ar path +.Op Fl M Ar path +.Op Fl m Ar path +.Ar command Ar ... +.Sh DESCRIPTION +.Nm +looks up a given command and gives the header line from the manual page. +You can then use the +.Xr man 1 +command to get more information. +.Pp +The options are as follows: +.Bl -tag -width Fl +.It Fl C Ar path +Use different +.Xr man 1 +configuration file than the default, +.Pa /etc/man.conf . +.It Fl M Ar path +Override the list of standard directories +.Nm +searches for its database named +.Dq Pa whatis.db . +The supplied +.Ar path +must be a colon +.Dq \&: +separated list of directories. +This search path may also be set using the environment variable +.Ev MANPATH . +.It Fl m Ar path +Augment the list of standard directories +.Nm +searches for its database named +.Dq Pa whatis.db . +The supplied +.Ar path +must be a colon +.Dq \&: +separated list of directories. +These directories will be searched before the standard directories +or the directories supplied with the +.Fl M +option or the +.Ev MANPATH +environment variable are searched. +.El +.Sh ENVIRONMENT +.Bl -tag -width MANPATH +.It Ev MANPATH +The standard search path used by +.Xr man 1 +may be overridden by specifying a path in the +.Ev MANPATH +environment variable. +.El +.Sh FILES +.Bl -tag -compact -width /etc/man.conf1 +.It Pa whatis.db +name of the whatis databases +.It Pa /etc/man.conf +.Xr man 1 +configuration file, used to get location of whatis databases if +.Ev MANPATH +is not set. +.El +.Sh SEE ALSO +.Xr apropos 1 , +.Xr man 1 , +.Xr whereis 1 , +.Xr man.conf 5 , +.Xr makewhatis 8 +.Sh HISTORY +The +.Nm +command appeared in +.Bx 3.0 . diff --git a/usr.bin/whatis/whatis.c b/usr.bin/whatis/whatis.c new file mode 100644 index 000000000..f30623e79 --- /dev/null +++ b/usr.bin/whatis/whatis.c @@ -0,0 +1,250 @@ +/* $NetBSD: whatis.c,v 1.24 2011/09/06 18:46:03 joerg Exp $ */ + +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#ifndef lint +__COPYRIGHT("@(#) Copyright (c) 1987, 1993\ + The Regents of the University of California. All rights reserved."); +#endif /* not lint */ + +#ifndef lint +#if 0 +static char sccsid[] = "@(#)whatis.c 8.5 (Berkeley) 1/2/94"; +#else +__RCSID("$NetBSD: whatis.c,v 1.24 2011/09/06 18:46:03 joerg Exp $"); +#endif +#endif /* not lint */ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "manconf.h" /* from ../man/ */ +#include "pathnames.h" /* from ../man/ */ + +#define MAXLINELEN 8192 /* max line handled */ + +static int *found, foundman; + +static void dashtrunc(char *, char *); +static int match(char *, char *); +__dead static void usage(void); +static void whatis(char **, char *, int); + +int +main(int argc, char **argv) +{ + ENTRY *ep; + TAG *tp; + int ch, rv; + char *beg, *conffile, **p, *p_augment, *p_path; + glob_t pg; + + conffile = NULL; + p_augment = p_path = NULL; + while ((ch = getopt(argc, argv, "C:M:m:P:")) != -1) + switch (ch) { + case 'C': + conffile = optarg; + break; + case 'M': + case 'P': /* backward compatible */ + p_path = optarg; + break; + case 'm': + p_augment = optarg; + break; + case '?': + default: + usage(); + } + argv += optind; + argc -= optind; + + if (argc < 1) + usage(); + + if ((found = malloc((u_int)argc * sizeof(int))) == NULL) + err(1, "malloc"); + memset(found, 0, argc * sizeof(int)); + + for (p = argv; *p; ++p) /* trim full paths */ + if ((beg = strrchr(*p, '/'))) + *p = beg + 1; + + if (p_augment) + whatis(argv, p_augment, 1); + if (p_path || (p_path = getenv("MANPATH"))) + whatis(argv, p_path, 1); + else { + config(conffile); + tp = gettag("_whatdb", 0); + if (!tp) + errx(EXIT_FAILURE, + "no database dirs (_whatdb) in config file"); + TAILQ_FOREACH(ep, &tp->entrylist, q) { + if ((rv = glob(ep->s, GLOB_BRACE | GLOB_NOSORT, NULL, + &pg)) != 0) { + if (rv == GLOB_NOMATCH) + continue; + else + err(EXIT_FAILURE, "glob"); + } + if (pg.gl_pathc) + for (p = pg.gl_pathv; *p; p++) + whatis(argv, *p, 0); + globfree(&pg); + } + } + + if (!foundman) { + fprintf(stderr, "whatis: no %s file found.\n", _PATH_WHATIS); + exit(1); + } + rv = 1; + for (p = argv; *p; ++p) + if (found[p - argv]) + rv = 0; + else + printf("%s: not found\n", *p); + exit(rv); +} + +static void +whatis(char **argv, char *path, int buildpath) +{ + char *end, *name, **p; + char buf[MAXLINELEN + 1], wbuf[MAXLINELEN + 1]; + char hold[MAXPATHLEN + 1]; + + for (name = path; name; name = end) { /* through name list */ + if ((end = strchr(name, ':'))) + *end++ = '\0'; + + if (buildpath) { + (void)sprintf(hold, "%s/%s", name, _PATH_WHATIS); + name = hold; + } + + if (!freopen(name, "r", stdin)) + continue; + + foundman = 1; + + /* for each file found */ + while (fgets(buf, sizeof(buf), stdin)) { + dashtrunc(buf, wbuf); + for (p = argv; *p; ++p) + if (match(wbuf, *p)) { + printf("%s", buf); + found[p - argv] = 1; + + /* only print line once */ + while (*++p) + if (match(wbuf, *p)) + found[p - argv] = 1; + break; + } + } + } +} + +/* + * match -- + * match a full word + */ +static int +match(char *bp, char *str) +{ + int len; + char *start; + + if (!*str || !*bp) + return(0); + for (len = strlen(str);;) { + /* + * /bin/[ is a special case. + */ + for (; *bp && *bp != '[' && !isalnum((unsigned char)*bp); ++bp); + if (!*bp) + break; + + /* check for word match first */ + for (start = bp++; *bp && (*bp == '_' || + isalnum((unsigned char) *bp)); ++bp); + if (bp - start == len && strncasecmp(start, str, len) == 0) { + return(1); + } else if (*bp && *bp != ',') { + /* check for full string match */ + for (bp = start; *bp && *bp != ',' && *bp != '(' && + !isspace((unsigned char) *bp); ++bp); + if (bp - start == len && + strncasecmp(start, str, len) == 0) + return(1); + } + } + return(0); +} + +/* + * dashtrunc -- + * truncate a string at " - " + */ +static void +dashtrunc(char *from, char *to) +{ + int ch; + + for (; (ch = *from) && ch != '\n' && + (ch != ' ' || from[1] != '-' || from[2] != ' '); ++from) + *to++ = ch; + *to = '\0'; +} + +/* + * usage -- + * print usage message and die + */ +static void +usage(void) +{ + (void)fprintf(stderr, + "usage: whatis [-C file] [-M path] [-m path] command ...\n"); + exit(1); +}