9ff1f2ac94
--- MAJOR NEW FEATURES --- * man.conf(5): Design and implement a simpler configuration file format. * man(1): Leverage less(1) -T and :t in a way resembling ctags(1) to jump to the definitions of various terms inside manual pages. * soelim(1): New implementation by Baptiste Daroussin. * privilege limitation: Use OpenBSD pledge(2) or OS X sandbox_init(3) when available. * man.cgi(8): Support short URIs like http://man.openbsd.org/mdoc . * mandoc.css: Use one unified stylesheet rather than three different ones. --- MAJOR FUNCTIONALLY RELEVANT BUGFIXES --- * mdoc(7): Fix multiple aspects of SYNOPSIS .Nm formatting. * man(1): Fix process group handling, avoiding unclean shutdowns. --- PORTABILITY IMPROVEMENTS --- * Correctly use the ohash(3) compatibility implementation even when building without SQLite support. * Add compat glue for building on Solaris 9 and 10. * Let ./configure select a supported RE syntax for word boundaries. * Support LDFLAGS, to be used for example for hardening options. * Avoid mixing putchar(3) and putwchar(3) on the same file descriptor, it resulted in output corruption on some platforms. * Avoid reusing va_lists, use va_copy(3) for better portability. * Do not hardcode the path to the more(1) program. --- MINOR NEW FEATURES --- * roff(7): Implement \n(.$ (number of macro arguments). * roff(7): Fully implement \z (do not advance cursor). * roff(7): Implement the `r' conditional (register exists). * roff(7): Implement \\$* (interpolate all arguments). * roff(7): Parse and ignore \, and \/ (italic corrections). * When there is no -m, no -M, no MANPATH and no /etc/man.conf, fall back to /usr/share/man:/usr/X11R6/man:/usr/local/man. * man(1): Give manuals in purely numerical sections priority over manuals of the same name in sections with an alphabetical suffix. * man.cgi(8): Support "header.html" and "footer.html". * man.cgi(8): Set the "autofocus" attribute on the query text box. * man.cgi(8): Simplify the search form, drop two useless buttons. * man.cgi(8): Delete the pseudo-manpath "mandoc", assume that apropos(1) and man.cgi(8) are installed in the default manpath. --- RELIABILITY BUGFIXES --- * mdoc(7): Avoid a use after free and an assertion failure when nodes are deleted during validation. * mdoc(7): Avoid a NULL pointer access when .Bd has no arguments. * mdoc(7): Avoid a NULL pointer access triggered by mismatching end macros. * mdoc(7): Avoid an assertion when .Fo has no argument. * mdoc(7): Avoid an assertion when .Ta<tab> occurs in .Bl -column. * mdoc(7): Avoid an assertion when a body gets broken and has a tail. * roff(7): Avoid an assertion caused by blanks inside \o. * roff(7): Make .so links to gziped manuals work without mandoc.db(5). * tbl(7): Avoid a use after free when the last line of a layout is empty. * eqn(7): Avoid an infinite loop caused by recursive "define". * makewhatis(8): Avoid a segfault caused by unusual directory structures. * Fix handling of leading, trailing, and double colons in MANPATH and -m. --- MINOR BUGFIXES --- * mdoc(7): Put arguments to end macros of broken partial explicit blocks inside the breaking block. * mdoc(7): Let .Dv force normal font. * mdoc(7): Make trailing whitespace significant in .Bl -tag widths. * mdoc(7): Fix macro interpretation around tabs in .Bl -column. * man(7): Use the default width for .RS without arguments. * man(7): On a new RS nesting level, the saved width starts from the default width, not from the saved width of the previous level. * man(7): Allow .PD in next-line scope. * man(7): Improve handling of empty .HP. * man(7): Improve formatting of .br and .sp inside .HP. * man(7): Do not mistreat empty arguments to font alternating macros as vertical spacing requests. * man(7): Allow fill mode changes in tagged paragraph next-line scope. * man(7): Fix minor bugs in block rewinding and simplify the related code. * man(7): Add missing line breaks before subsection headers. * man(7): Give section and subsection headers hanging indentation. * man(7): Make trailing whitespace significant in .TP widths. * roff(7): Don't allow breaking the output line after hyphens that immediately follow escape sequences. * roff(7): Ignore blank characters at the beginning of conditional blocks. * roff(7): Escape breakable hyphens only after handling input line traps. * roff(7): Reject \[uD800] to \[uDFFF] (surrogates) in the parser. * tbl(7): Allow more than one data field after T} on the same input line. * terminal output: Apply bold and italic to non-ASCII Unicode codepoints. * terminal output: Improve rounding rules for horizontal scaling widths. * HTML output: Render ASCII_NBRSP as " ", not "-". * man(1): Do not match the first part of a name if it continues with a dot. * man(1): Keep working even if the current directory is unusable. * man(1): Better error message when $PAGER is invalid. * makewhatis(8): Improve handling of .Va and .Vt macros. * apropos(1): Print "nothing appropriate" to stderr when appropriate. * apropos(1): Abort with a useful error message when elementary database operations like preparing queries or binding variables fail. --- STRUCTURAL CHANGES, no functional change --- * mdoc(7) and man(7): Unified data structures struct roff_node etc. * mdoc(7) and man(7): Unified node handling library in roff.c. * mdoc(7) and man(7): Seperate validation phase from parsing. * roff(7): Major character table cleanup. * Link with libz rather than forking gunzip(1). --- THANKS TO --- * Baptiste Daroussin (FreeBSD) for the new soelim(1) and for release testing. * Anthony Bentley (OpenBSD) for unifying mandoc.css, two nice patches for man.cgi(8), some documentation patches, some bug reports, and various useful discussions. * Todd Miller (OpenBSD) for lots of help with process group and signal handling, a few patches, some bug reports and some useful discussions. * Jonathan Gray (OpenBSD) for yet more testing with afl(1) again resulting in more than half a dozen important bug reports. * Svyatoslav Mishyn (Crux Linux) for some patches, several bug reports, and extensive release testing. * Christian Neukirchen (void Linux) for a number of compatibility patches and suggestions and several bug reports. * Christos Zoulas (NetBSD) for a bug fix patch and some useful suggestions for cleanup. * Florian Obser (OpenBSD) for a bugfix patch and some bug reports. * Sevan Janiyan for help with Solaris compatibility and release testing on many platforms. * Jan Holzhueter and OpenCSW in general for help with Solaris compatibility, and for providing me with a Solaris 9/10/11 testing environment. * Michael McConville (OpenBSD) for some simple cleanup patches. * Thomas Klausner (NetBSD) for some bug reports and release testing. * Christian Weisgerber, Dmitrij Czarkoff, Igor Sobrado, Ken Westerback, Marc Espie, Mike Belopuhov, Rafael Neves, Ted Unangst, Tim van der Molen, Theo Buehler, Theo de Raadt (OpenBSD), Kurt Jaeger, Dag Erling Smoergrav (FreeBSD), Joerg Sonnenberger (NetBSD), Carsten Kunze (Heirloom troff), Daniel Levai, Fabian Raetz, Jan Stary, Jean-Yves Migeon, Lorenzo Beretta, Markus Waldeck, Maxim Belooussov, Michael Reed, Peter Bray, and Serguey Parkhomovsky for bug reports and feature suggestions. * Alexander Hall, Andrew Fresh, Antoine Jacoutot, Doug Hogan, Jason McIntyre, Jasper Lievisse Adriaanse, Kent Spillner, Nicholas Marriott, Peter Hessler, Sebastien Marie, Stefan Sperling, and Theo de Raadt (OpenBSD) for helpful discussions and feedback.
229 lines
5.8 KiB
Groff
229 lines
5.8 KiB
Groff
.\" Id: mansearch.3,v 1.4 2015/03/27 17:37:25 schwarze Exp
|
|
.\"
|
|
.\" Copyright (c) 2014 Ingo Schwarze <schwarze@openbsd.org>
|
|
.\"
|
|
.\" Permission to use, copy, modify, and distribute this software for any
|
|
.\" purpose with or without fee is hereby granted, provided that the above
|
|
.\" copyright notice and this permission notice appear in all copies.
|
|
.\"
|
|
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
.\"
|
|
.Dd March 27, 2015
|
|
.Dt MANSEARCH 3
|
|
.Os
|
|
.Sh NAME
|
|
.Nm mansearch ,
|
|
.Nm mansearch_setup
|
|
.Nd search manual page databases
|
|
.Sh SYNOPSIS
|
|
.In stdint.h
|
|
.In manconf.h
|
|
.In mansearch.h
|
|
.Ft int
|
|
.Fo mansearch_setup
|
|
.Fa "int start"
|
|
.Fc
|
|
.Ft int
|
|
.Fo mansearch
|
|
.Fa "const struct mansearch *search"
|
|
.Fa "const struct manpaths *paths"
|
|
.Fa "int argc"
|
|
.Fa "char *argv[]"
|
|
.Fa "const char *outkey"
|
|
.Fa "struct manpage **res"
|
|
.Fa "size_t *sz"
|
|
.Fc
|
|
.Sh DESCRIPTION
|
|
The
|
|
.Fn mansearch
|
|
function returns information about manuals matching a search query from a
|
|
.Xr mandoc.db 5
|
|
SQLite3 database.
|
|
.Pp
|
|
The query arguments are as follows:
|
|
.Bl -tag -width Ds
|
|
.It Fa "const struct mansearch *search"
|
|
Search options, defined in
|
|
.In mansearch.h .
|
|
.It Fa "const struct manpaths *paths"
|
|
Directories to be searched, defined in
|
|
.In manconf.h .
|
|
.It Fa "int argc" , "char *argv[]"
|
|
Search criteria, usually taken from the command line.
|
|
.El
|
|
.Pp
|
|
The
|
|
.Fa "const char *outkey"
|
|
selects which data to return in the
|
|
.Va output
|
|
field of the
|
|
.Fa res
|
|
structures.
|
|
It takes any of the macro keys defined in
|
|
.Pa mansearch_const.c
|
|
and described in
|
|
.Xr apropos 1 .
|
|
.Pp
|
|
The output arguments are as follows:
|
|
.Bl -tag -width Ds
|
|
.It Fa "struct manpage **res"
|
|
Returns a pointer to an array of result structures defined in
|
|
.In mansearch.h .
|
|
The user is expected to call
|
|
.Xr free 3
|
|
on the
|
|
.Va file ,
|
|
.Va names ,
|
|
and
|
|
.Va output
|
|
fields of all structures, as well as the
|
|
.Fa res
|
|
array itself.
|
|
.It Fa "size_t *sz"
|
|
Returns the number of result structures contained in
|
|
.Fa res .
|
|
.El
|
|
.Pp
|
|
To speed up searches, the
|
|
.Fn mansearch_setup
|
|
function can optionally be called with a
|
|
.Fa start
|
|
argument of 1 before
|
|
.Fn mansearch
|
|
to set up an SQLite3 pagecache.
|
|
If it was called, it has to be called again with a
|
|
.Fa start
|
|
argument of 0 after the last call to
|
|
.Fn mansearch
|
|
to release the memory used for the pagecache.
|
|
.Sh IMPLEMENTATION NOTES
|
|
For each manual page tree, the search is done in two steps.
|
|
In the first step, a list of pages matching the search criteria is built.
|
|
In the second step, the requested information about these pages is
|
|
retrieved from the database and assembled into the
|
|
.Fa res
|
|
array.
|
|
.Pp
|
|
All function mentioned here are defined in the file
|
|
.Pa mansearch.c .
|
|
No functions except
|
|
.Fn mansearch
|
|
and
|
|
.Fn sql_statement
|
|
build any SQL code, and no functions except
|
|
.Fn mansearch ,
|
|
.Fn buildnames ,
|
|
and
|
|
.Fn buildoutput
|
|
execute it.
|
|
.Ss Finding matches
|
|
The query is built using the following grammar:
|
|
.Bd -literal -offset indent
|
|
<query> ::= "SELECT * FROM mpages WHERE" <condition>
|
|
<condition> ::= "(" <condition> ")" |
|
|
<condition> "OR" <condition> |
|
|
<condition> "AND" <condition> |
|
|
"desc" <operator> "?" |
|
|
"id IN (SELECT pageid FROM" <subquery> ")"
|
|
<subquery> ::= "names WHERE name" <operator> "?" |
|
|
"keys WHERE key" <operator> "? AND bits & ?"
|
|
<operator> ::= "MATCH" | "REGEXP"
|
|
.Ed
|
|
.Pp
|
|
The MATCH and REGEXP operators are implemented by the functions
|
|
.Fn sql_match
|
|
and
|
|
.Fn sql_regexp ,
|
|
respectively.
|
|
This is required because SQLite3 natively neither supports
|
|
case-insensitive substring matching nor regular expression matching,
|
|
but only string identity, shell globbing, and the weird home-brewed
|
|
LIKE operator.
|
|
.Pp
|
|
Command line parsing is done by the function
|
|
.Fn exprcomp
|
|
building a singly linked list of
|
|
.Vt expr
|
|
structures, using the helper functions
|
|
.Fn exprterm
|
|
and
|
|
.Fn exprspec .
|
|
The resulting SQL statement is assembled by the function
|
|
.Fn sql_statement
|
|
and evaluated in the main loop of the
|
|
.Fn mansearch
|
|
function.
|
|
.Ss Assembling the results
|
|
The names, sections, and architectures of the manuals found
|
|
are assembled into the
|
|
.Va names
|
|
field of the result structure by the function
|
|
.Fn buildnames ,
|
|
using the following query:
|
|
.Pp
|
|
.Dl "SELECT * FROM mlinks WHERE pageid=? ORDER BY sec, arch, name"
|
|
.Pp
|
|
If the
|
|
.Fa outkey
|
|
differs from
|
|
.Qq Ic \&Nd ,
|
|
the requested output data is assembled into the
|
|
.Va output
|
|
field of the result structure by the function
|
|
.Fn buildoutput ,
|
|
using the following query:
|
|
.Pp
|
|
.Dl "SELECT * FROM keys WHERE pageid=? AND bits & ?"
|
|
.Sh FILES
|
|
.Bl -tag -width mandoc.db -compact
|
|
.It Pa mandoc.db
|
|
The manual page database.
|
|
.El
|
|
.Sh EXAMPLES
|
|
The simplest invocation
|
|
.Pp
|
|
.Dl apropos keyword
|
|
.Pp
|
|
results in the following SQL query:
|
|
.Bd -literal
|
|
SELECT * FROM mpages WHERE (
|
|
id IN (SELECT pageid FROM names WHERE name MATCH 'keyword') OR
|
|
desc MATCH 'keyword'
|
|
);
|
|
.Ed
|
|
.Pp
|
|
A more complicated request like
|
|
.Pp
|
|
.Dl apropos -s 2 Nm,Xr=getuid
|
|
.Pp
|
|
results in:
|
|
.Bd -literal
|
|
SELECT * FROM mpages WHERE (
|
|
id IN (SELECT pageid FROM names WHERE name MATCH 'getuid') OR
|
|
id IN (SELECT pageid FROM keys WHERE key MATCH 'getuid' AND bits & 4)
|
|
) AND id IN (SELECT pageid FROM keys WHERE key REGEXP '^2$' AND bits & 2);
|
|
.Ed
|
|
.Sh SEE ALSO
|
|
.Xr apropos 1 ,
|
|
.Xr mandoc.db 5 ,
|
|
.Xr makewhatis 8
|
|
.Sh HISTORY
|
|
The
|
|
.Fn mansearch
|
|
subsystem first appeared in
|
|
.Ox 5.6 .
|
|
.Sh AUTHORS
|
|
.An -nosplit
|
|
A module to search manual page databases was first written by
|
|
.An Kristaps Dzonsons Aq Mt kristaps@bsd.lv
|
|
in 2011, at first using the Berkeley DB;
|
|
he rewrote it for SQLite3 in 2012.
|
|
The current version received major changes from
|
|
.An Ingo Schwarze Aq Mt schwarze@openbsd.org .
|