]> Zhao Yanbai Git Server - minix.git/commitdiff
Importing usr.bin/whatis 40/440/1
authorThomas Cort <tcort@minix3.org>
Fri, 22 Mar 2013 19:03:20 +0000 (19:03 +0000)
committerLionel Sambuc <lionel@minix3.org>
Sat, 23 Mar 2013 15:10:23 +0000 (16:10 +0100)
- LSC: fixed missing entry in minix/mi

Change-Id: I5766dd72819e3b15ef24ab49c5ee3a5aa42049c4

distrib/sets/lists/minix/mi
man/man5/Makefile
man/man5/whatis.5 [deleted file]
releasetools/nbsd_ports
usr.bin/Makefile
usr.bin/whatis/Makefile [new file with mode: 0644]
usr.bin/whatis/whatis.1 [new file with mode: 0644]
usr.bin/whatis/whatis.c [new file with mode: 0644]

index 6313ed29123a326acecc62b073cd55bf8b466679..ce90878ab0766b57a27db147ba81fc71d9743a05 100644 (file)
 ./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
 ./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
 ./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
index dbd6a11da5f0f5c7ea2c6ca45fd9b31e9a9d93ab..03cf2c62cc09ce29c21a0e0b027f161b85b91585 100644 (file)
@@ -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 (file)
index ee7eed7..0000000
+++ /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)
index 344679baba2e2acc03c2c71187bc012bd2719b34..208d2e13ed379a0153061c6fc03fc8d58ac514c5 100644 (file)
 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
index 9a17fea6711b4d0e18f899b0a6d7fb525a85944a..d9ab2b5954212ecad2891bd82140fb0de9f5c1bd 100644 (file)
@@ -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 (file)
index 0000000..bb29c78
--- /dev/null
@@ -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 <bsd.own.mk>
+
+MDIST= ${NETBSDSRCDIR}/usr.bin/man
+
+PROG=  whatis
+SRCS=  whatis.c manconf.c
+.PATH: ${MDIST}
+CPPFLAGS+=-I${MDIST}
+
+.include <bsd.prog.mk>
diff --git a/usr.bin/whatis/whatis.1 b/usr.bin/whatis/whatis.1
new file mode 100644 (file)
index 0000000..9d9028c
--- /dev/null
@@ -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 (file)
index 0000000..f30623e
--- /dev/null
@@ -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 <sys/cdefs.h>
+
+#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 <sys/param.h>
+#include <sys/queue.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <glob.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#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);
+}