1*62fe3e72Sschwarze.\" $OpenBSD: man.cgi.8,v 1.23 2022/07/06 15:47:10 schwarze Exp $ 2c6c22f12Sschwarze.\" 3ddda2719Sschwarze.\" Copyright (c) 2014, 2015, 2016 Ingo Schwarze <schwarze@openbsd.org> 4c6c22f12Sschwarze.\" 5c6c22f12Sschwarze.\" Permission to use, copy, modify, and distribute this software for any 6c6c22f12Sschwarze.\" purpose with or without fee is hereby granted, provided that the above 7c6c22f12Sschwarze.\" copyright notice and this permission notice appear in all copies. 8c6c22f12Sschwarze.\" 9c6c22f12Sschwarze.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10c6c22f12Sschwarze.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11c6c22f12Sschwarze.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12c6c22f12Sschwarze.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13c6c22f12Sschwarze.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14c6c22f12Sschwarze.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15c6c22f12Sschwarze.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16c6c22f12Sschwarze.\" 17*62fe3e72Sschwarze.Dd $Mdocdate: July 6 2022 $ 18c6c22f12Sschwarze.Dt MAN.CGI 8 19c6c22f12Sschwarze.Os 20c6c22f12Sschwarze.Sh NAME 21c6c22f12Sschwarze.Nm man.cgi 22c6c22f12Sschwarze.Nd CGI program to search and display manual pages 23c6c22f12Sschwarze.Sh DESCRIPTION 24c6c22f12SschwarzeThe 25c6c22f12Sschwarze.Nm 26c6c22f12SschwarzeCGI program searches for manual pages on a WWW server 27c6c22f12Sschwarzeand displays them to HTTP clients, 28c6c22f12Sschwarzeproviding functionality equivalent to the 29c6c22f12Sschwarze.Xr man 1 30784a63d6Sschwarzeand 31784a63d6Sschwarze.Xr apropos 1 32c6c22f12Sschwarzeutilities. 33c6c22f12SschwarzeIt can use multiple manual trees in parallel. 34c6c22f12Sschwarze.Ss HTML search interface 35c6c22f12SschwarzeAt the top of each generated HTML page, 36c6c22f12Sschwarze.Nm 37c6c22f12Sschwarzedisplays a search form containing these elements: 38c6c22f12Sschwarze.Bl -enum 39c6c22f12Sschwarze.It 40158bb456SschwarzeAn input box for search queries, expecting 41158bb456Sschwarzeeither a name of a manual page or an 42c6c22f12Sschwarze.Ar expression 43c6c22f12Sschwarzeusing the syntax described in the 44c6c22f12Sschwarze.Xr apropos 1 45c6c22f12Sschwarzemanual; filling this in is required for each search. 46fbeeb774Sschwarze.Pp 47fbeeb774SschwarzeThe expression is broken into words at whitespace. 48fbeeb774SschwarzeWhitespace characters and backslashes can be escaped 49fbeeb774Sschwarzeby prepending a backslash. 50fbeeb774SschwarzeThe effect of prepending a backslash to another character is undefined; 51fbeeb774Sschwarzein the current implementation, it has no effect. 52c6c22f12Sschwarze.It 53158bb456SschwarzeA 54158bb456Sschwarze.Xr man 1 55784a63d6Sschwarzesubmit button. 56784a63d6SschwarzeThe string in the input box is interpreted as the name of a manual page. 57784a63d6Sschwarze.It 58784a63d6SschwarzeAn 59158bb456Sschwarze.Xr apropos 1 60784a63d6Sschwarzesubmit button. 61784a63d6SschwarzeThe string in the input box is interpreted as a search 62784a63d6Sschwarze.Ar expression . 63158bb456Sschwarze.It 64158bb456SschwarzeA dropdown menu to optionally select a manual section. 65c6c22f12SschwarzeIf one is provided, it has the same effect as the 66158bb456Sschwarze.Xr man 1 67158bb456Sschwarzeand 68c6c22f12Sschwarze.Xr apropos 1 69c6c22f12Sschwarze.Fl s 70c6c22f12Sschwarzeoption. 71c6c22f12SschwarzeOtherwise, pages from all sections are shown. 72c6c22f12Sschwarze.It 73158bb456SschwarzeA dropdown menu to optionally select an architecture. 74c6c22f12SschwarzeIf one is provided, it has the same effect as the 75158bb456Sschwarze.Xr man 1 76158bb456Sschwarzeand 77c6c22f12Sschwarze.Xr apropos 1 78c6c22f12Sschwarze.Fl S 79c6c22f12Sschwarzeoption. 80c6c22f12SschwarzeBy default, pages for all architectures are shown. 81c6c22f12Sschwarze.It 82c6c22f12SschwarzeA dropdown menu to select a manual tree. 83c6c22f12SschwarzeIf the configuration file 84c6c22f12Sschwarze.Pa /var/www/man/manpath.conf 85c6c22f12Sschwarzecontains only one manpath, the dropdown menu is not shown. 86c6c22f12SschwarzeBy default, the first manpath given in the file is used. 87c6c22f12Sschwarze.El 88c6c22f12Sschwarze.Ss Program output 89c6c22f12SschwarzeThe 90c6c22f12Sschwarze.Nm 91c6c22f12Sschwarzeprogram generates five kinds of output pages: 92c6c22f12Sschwarze.Bl -tag -width Ds 93c6c22f12Sschwarze.It The index page. 94c6c22f12SschwarzeThis is returned when calling 95c6c22f12Sschwarze.Nm 96c6c22f12Sschwarzewithout 97c6c22f12Sschwarze.Ev PATH_INFO 98c6c22f12Sschwarzeand without a 99c6c22f12Sschwarze.Ev QUERY_STRING . 100c6c22f12SschwarzeIt serves as a starting point for using the program 101c6c22f12Sschwarzeand shows the search form only. 102c6c22f12Sschwarze.It A list page. 103c6c22f12SschwarzeLists are returned when searches match more than one manual page. 104c6c22f12SschwarzeThe first column shows the names and section numbers of manuals 105c6c22f12Sschwarzeas clickable links. 106c6c22f12SschwarzeThe second column shows the one-line descriptions of the manuals. 107d50b5b74SschwarzeFor 108d50b5b74Sschwarze.Xr man 1 109d50b5b74Sschwarzestyle searches, the content of the first manual page follows the list. 110c6c22f12Sschwarze.It A manual page. 111c6c22f12SschwarzeThis output format is used when a search matches exactly one 112c6c22f12Sschwarzemanual page, or when a link on a list page or an 113c6c22f12Sschwarze.Ic \&Xr 114c6c22f12Sschwarzelink on another manual page is followed. 115c6c22f12Sschwarze.It A no-result page. 116c6c22f12SschwarzeThis is shown when a search request returns no results - 117d50b5b74Sschwarzeeither because it violates the query syntax, or because 118c6c22f12Sschwarzethe search does not match any manual pages. 119c6c22f12Sschwarze.It \&An error page. 120c6c22f12SschwarzeThis cannot happen by merely clicking the 121c6c22f12Sschwarze.Dq Search 122c6c22f12Sschwarzebutton, but only by manually entering an invalid URI. 123c6c22f12SschwarzeIt does not show the search form, but only an error message 124c6c22f12Sschwarzeand a link back to the index page. 125c6c22f12Sschwarze.El 126c6c22f12Sschwarze.Ss Setup 127c6c22f12SschwarzeFor each manual tree, create one first-level subdirectory below 128c6c22f12Sschwarze.Pa /var/www/man . 129c6c22f12SschwarzeThe name of one of these directories is called a 130c6c22f12Sschwarze.Dq manpath 131c6c22f12Sschwarzein the context of 132c6c22f12Sschwarze.Nm . 133c6c22f12SschwarzeCreate a single ASCII text file 134c6c22f12Sschwarze.Pa /var/www/man/manpath.conf 135c6c22f12Sschwarzecontaining the names of these directories, one per line. 136c6c22f12SschwarzeThe directory given first is used as the default manpath. 137c6c22f12Sschwarze.Pp 138c6c22f12SschwarzeInside each of these directories, use the same directory and file 139c6c22f12Sschwarzestructure as found below 140c6c22f12Sschwarze.Pa /usr/share/man , 141c6c22f12Sschwarzethat is, second-level subdirectories 142c6c22f12Sschwarze.Pa /var/www/man/*/man1 , /var/www/man/*/man2 143c6c22f12Sschwarzeetc. containing source 144c6c22f12Sschwarze.Xr mdoc 7 145c6c22f12Sschwarzeand 146c6c22f12Sschwarze.Xr man 7 147c6c22f12Sschwarzemanuals with file name extensions matching the section numbers, 148c6c22f12Sschwarzesecond-level subdirectories 149c6c22f12Sschwarze.Pa /var/www/man/*/cat1 , /var/www/man/*/cat2 150c6c22f12Sschwarzeetc. containing preformatted manuals with the file name extension 151c6c22f12Sschwarze.Sq 0 , 152c6c22f12Sschwarzeand optional third-level subdirectories for architectures. 153c6c22f12SschwarzeUse 154c6c22f12Sschwarze.Xr makewhatis 8 155c6c22f12Sschwarzeto create a 156c6c22f12Sschwarze.Xr mandoc.db 5 157c6c22f12Sschwarzedatabase inside each manpath. 158c6c22f12Sschwarze.Pp 159c6c22f12SschwarzeConfigure your web server to execute CGI programs located in 160c6c22f12Sschwarze.Pa /cgi-bin . 161e8ddc539SschwarzeWhen using 162e8ddc539Sschwarze.Ox 163e8ddc539Sschwarze.Xr httpd 8 , 164e8ddc539Sschwarzethe 165e8ddc539Sschwarze.Xr slowcgi 8 166e8ddc539Sschwarzeproxy daemon is needed to translate FastCGI requests to plain old CGI. 167aabcc9a1Sschwarze.Pp 168aabcc9a1SschwarzeTo compile 169aabcc9a1Sschwarze.Nm , 170aabcc9a1Sschwarzefirst copy 171aabcc9a1Sschwarze.Pa cgi.h.example 172aabcc9a1Sschwarzeto 173aabcc9a1Sschwarze.Pa cgi.h 174aabcc9a1Sschwarzeand edit it according to your needs. 175aabcc9a1SschwarzeIt contains the following compile-time definitions: 176aabcc9a1Sschwarze.Bl -tag -width Ds 177aabcc9a1Sschwarze.It Ev COMPAT_OLDURI 178aabcc9a1SschwarzeOnly useful for running on www.openbsd.org to deal with old URIs containing 179aabcc9a1Sschwarze.Qq "manpath=OpenBSD " 180aabcc9a1Sschwarzewhere the blank character has to be translated to a hyphen. 181aabcc9a1SschwarzeWhen compiling for other sites, this definition can be deleted. 1823b9cfc6fSschwarze.It Dv CSS_DIR 1833b9cfc6fSschwarzeAn optional file system path to the directory containing the file 1843b9cfc6fSschwarze.Pa mandoc.css , 185aabcc9a1Sschwarzeto be specified relative to the server's document root, 186aabcc9a1Sschwarzeand to be specified without a trailing slash. 1873b9cfc6fSschwarzeWhen empty, the CSS file is assumed to be in the document root. 1883b9cfc6fSschwarzeOtherwise, a leading slash is needed. 189aabcc9a1SschwarzeThis is used in generated HTML code. 1903b9cfc6fSschwarze.It Dv CUSTOMIZE_TITLE 191711661c7SschwarzeAn ASCII string to be used for the HTML <TITLE> element. 1923b9cfc6fSschwarze.It Dv MAN_DIR 1933b9cfc6fSschwarzeA file system path to the 194aabcc9a1Sschwarze.Nm 1953b9cfc6fSschwarzedata directory relative to the web server 196aabcc9a1Sschwarze.Xr chroot 2 1973b9cfc6fSschwarzedirectory, to be specified with a leading slash and without a trailing slash. 1983b9cfc6fSschwarzeIt needs to have at least one component; the root directory cannot be used 1993b9cfc6fSschwarzefor this purpose. 2003b9cfc6fSschwarzeThe files 2013b9cfc6fSschwarze.Pa manpath.conf , 2023b9cfc6fSschwarze.Pa header.html , 2033b9cfc6fSschwarzeand 2043b9cfc6fSschwarze.Pa footer.html 2053b9cfc6fSschwarzeare looked up in this directory. 2063b9cfc6fSschwarzeIt is also prepended to the manpath when opening 207aabcc9a1Sschwarze.Xr mandoc.db 5 208aabcc9a1Sschwarzeand manual page files. 2093b9cfc6fSschwarze.It Dv SCRIPT_NAME 2103b9cfc6fSschwarzeThe initial component of URIs, to be specified without leading 2113b9cfc6fSschwarzeand trailing slashes. 2123b9cfc6fSschwarzeIt can be empty. 213aabcc9a1Sschwarze.El 214aabcc9a1Sschwarze.Pp 215aabcc9a1SschwarzeAfter editing 216aabcc9a1Sschwarze.Pa cgi.h , 217aabcc9a1Sschwarzerun 218aabcc9a1Sschwarze.Pp 219aabcc9a1Sschwarze.Dl make man.cgi 220aabcc9a1Sschwarze.Pp 2218361bf54Sschwarzeand copy the resulting binary to the proper location, 2228361bf54Sschwarzefor example using the command: 2238361bf54Sschwarze.Pp 2248361bf54Sschwarze.Dl make installcgi 2258361bf54Sschwarze.Pp 2268361bf54SschwarzeIn addition to that, make sure the default manpath contains the files 2278361bf54Sschwarze.Pa man1/apropos.1 2288361bf54Sschwarzeand 2298361bf54Sschwarze.Pa man8/man.cgi.8 , 2308361bf54Sschwarzeor the documentation links at the bottom of the index page will not work. 231c6c22f12Sschwarze.Ss URI interface 232c6c22f12Sschwarze.Nm 233c6c22f12Sschwarzeuniform resource identifiers are not needed for interactive use, 234c6c22f12Sschwarzebut can be useful for deep linking. 235c6c22f12SschwarzeThey consist of: 236c6c22f12Sschwarze.Bl -enum 237c6c22f12Sschwarze.It 238c6c22f12SschwarzeThe 239c6c22f12Sschwarze.Cm http:// 240d50b5b74Sschwarzeor 241d50b5b74Sschwarze.Cm https:// 242c6c22f12Sschwarzeprotocol specifier. 243c6c22f12Sschwarze.It 2443b9cfc6fSschwarzeThe host name. 245c6c22f12Sschwarze.It 2463b9cfc6fSschwarzeThe 2473b9cfc6fSschwarze.Dv SCRIPT_NAME , 2483b9cfc6fSschwarzepreceded by a slash unless empty. 249c6c22f12Sschwarze.It 250158bb456SschwarzeTo show a single page, a slash, the manpath, another slash, 251c6c22f12Sschwarzeand the name of the requested file, for example 252c6c22f12Sschwarze.Pa /OpenBSD-current/man1/mandoc.1 . 253ddda2719SschwarzeThis can be abbreviated according to the following syntax: 254ddda2719Sschwarze.Sm off 255daf4c292Sschwarze.Op / Ar manpath 256daf4c292Sschwarze.Op / Cm man Ar sec 257daf4c292Sschwarze.Op / Ar arch 258ddda2719Sschwarze.Pf / Ar name Op \&. Ar sec 259ddda2719Sschwarze.Sm on 260c6c22f12Sschwarze.It 261158bb456SschwarzeFor searches, a query string starting with a question mark 262c6c22f12Sschwarzeand consisting of 263c6c22f12Sschwarze.Ar key Ns = Ns Ar value 264c6c22f12Sschwarzepairs, separated by ampersands, for example 265158bb456Sschwarze.Pa ?manpath=OpenBSD-current&query=mandoc . 266c6c22f12SschwarzeSupported keys are 267c6c22f12Sschwarze.Cm manpath , 268158bb456Sschwarze.Cm query , 269c6c22f12Sschwarze.Cm sec , 270c6c22f12Sschwarze.Cm arch , 271c6c22f12Sschwarzecorresponding to 272c6c22f12Sschwarze.Xr apropos 1 273c6c22f12Sschwarze.Fl M , 274c6c22f12Sschwarze.Ar expression , 275c6c22f12Sschwarze.Fl s , 276c6c22f12Sschwarze.Fl S , 277158bb456Sschwarzerespectively, and 278158bb456Sschwarze.Cm apropos , 279158bb456Sschwarzewhich is a boolean parameter to select or deselect the 280158bb456Sschwarze.Xr apropos 1 281158bb456Sschwarzequery mode. 282c6c22f12SschwarzeFor backward compatibility with the traditional 283c6c22f12Sschwarze.Nm , 284c6c22f12Sschwarze.Cm sektion 285158bb456Sschwarzeis supported as an alias for 286c6c22f12Sschwarze.Cm sec . 287c6c22f12Sschwarze.El 288cf3a545cSschwarze.Ss Restricted character set 289cf3a545cSschwarzeFor security reasons, in particular to prevent cross site scripting 290cf3a545cSschwarzeattacks, some strings used by 291cf3a545cSschwarze.Nm 292cf3a545cSschwarzecan only contain the following characters: 293cf3a545cSschwarze.Pp 294cf3a545cSschwarze.Bl -dash -compact -offset indent 295cf3a545cSschwarze.It 296cf3a545cSschwarzelower case and upper case ASCII letters 297cf3a545cSschwarze.It 298cf3a545cSschwarzethe ten decimal digits 299cf3a545cSschwarze.It 300cf3a545cSschwarzethe dash 301cf3a545cSschwarze.Pq Sq - 302cf3a545cSschwarze.It 303cf3a545cSschwarzethe dot 304cf3a545cSschwarze.Pq Sq \&. 305cf3a545cSschwarze.It 306cf3a545cSschwarzethe slash 307cf3a545cSschwarze.Pq Sq / 308cf3a545cSschwarze.It 309cf3a545cSschwarzethe underscore 310cf3a545cSschwarze.Pq Sq _ 311cf3a545cSschwarze.El 312cf3a545cSschwarze.Pp 3133b9cfc6fSschwarzeIn particular, this applies to all manpaths and architecture names. 314c6c22f12Sschwarze.Sh ENVIRONMENT 315c6c22f12SschwarzeThe web server may pass the following CGI variables to 316c6c22f12Sschwarze.Nm : 317c6c22f12Sschwarze.Bl -tag -width Ds 3183b9cfc6fSschwarze.It Ev SCRIPT_NAME 319174828c5SjmcThe initial part of the URI passed from the client to the server, 3203b9cfc6fSschwarzestarting after the server's host name and ending before 3213b9cfc6fSschwarze.Ev PATH_INFO . 3223b9cfc6fSschwarzeThis is ignored by 3233b9cfc6fSschwarze.Nm . 3243b9cfc6fSschwarzeWhen constructing URIs for links and redirections, the 3253b9cfc6fSschwarze.Dv SCRIPT_NAME 3263b9cfc6fSschwarzepreprocessor constant is used instead. 327c6c22f12Sschwarze.It Ev PATH_INFO 328c6c22f12SschwarzeThe final part of the URI path passed from the client to the server, 329c6c22f12Sschwarzestarting after the 330c6c22f12Sschwarze.Ev SCRIPT_NAME 331c6c22f12Sschwarzeand ending before the 332c6c22f12Sschwarze.Ev QUERY_STRING . 333c6c22f12SschwarzeIt is used by the 334c6c22f12Sschwarze.Cm show 3357a7bc5c3Sschwarzepage to acquire the manpath and filename it needs. 336c6c22f12Sschwarze.It Ev QUERY_STRING 337c6c22f12SschwarzeThe HTTP query string passed from the client to the server. 338c6c22f12SschwarzeIt is the final part of the URI, after the question mark. 339c6c22f12SschwarzeIt is used by the 340c6c22f12Sschwarze.Cm search 341c6c22f12Sschwarzepage to acquire the named parameters it needs. 342c6c22f12Sschwarze.El 343c6c22f12Sschwarze.Sh FILES 344c6c22f12Sschwarze.Bl -tag -width Ds 345c6c22f12Sschwarze.It Pa /var/www 346c6c22f12SschwarzeDefault web server 347c6c22f12Sschwarze.Xr chroot 2 348c6c22f12Sschwarzedirectory. 349c6c22f12SschwarzeAll the following paths are specified relative to this directory. 350c6c22f12Sschwarze.It Pa /cgi-bin/man.cgi 3513b9cfc6fSschwarzeThe usual file system path to the 352c6c22f12Sschwarze.Nm 3533b9cfc6fSschwarzeprogram inside the web server 3543b9cfc6fSschwarze.Xr chroot 2 3553b9cfc6fSschwarzedirectory. 3563b9cfc6fSschwarzeA different name can be chosen, but in any case, it needs to be configured in 3573b9cfc6fSschwarze.Xr httpd.conf 5 . 358c6c22f12Sschwarze.It Pa /htdocs 3593b9cfc6fSschwarzeThe file system path to the server document root directory 3603b9cfc6fSschwarzerelative to the server 3613b9cfc6fSschwarze.Xr chroot 2 3623b9cfc6fSschwarzedirectory. 363c6c22f12SschwarzeThis is part of the web server configuration and not specific to 364c6c22f12Sschwarze.Nm . 36506bcd913Sschwarze.It Pa /htdocs/mandoc.css 366c6c22f12SschwarzeA style sheet for 367c6c22f12Sschwarze.Xr mandoc 1 36806bcd913SschwarzeHTML styling, referenced from each generated HTML page. 369c6c22f12Sschwarze.It Pa /man 370c6c22f12SschwarzeDefault 371c6c22f12Sschwarze.Nm 372c6c22f12Sschwarzedata directory containing all the manual trees. 373c6c22f12SschwarzeCan be overridden by 3743b9cfc6fSschwarze.Dv MAN_DIR . 375c6c22f12Sschwarze.It Pa /man/manpath.conf 376c6c22f12SschwarzeThe list of available manpaths, one per line. 377cf3a545cSschwarzeIf any of the lines in this file contains a slash 378cf3a545cSschwarze.Pq Sq / 379cf3a545cSschwarzeor any character not contained in the 380cf3a545cSschwarze.Sx Restricted character set , 381cf3a545cSschwarze.Nm 382cf3a545cSschwarzereports an internal server error and exits without doing anything. 383711661c7Sschwarze.It Pa /man/header.html 384*62fe3e72SschwarzeAn optional file containing static HTML code to be wrapped in 385*62fe3e72Sschwarzea <HEADER> element and inserted right after opening the <BODY> element. 386*62fe3e72SschwarzeFor example, it can contain an <H1> element 387*62fe3e72Sschwarzespecifying the name of the website. 388711661c7Sschwarze.It Pa /man/footer.html 389*62fe3e72SschwarzeAn optional file containing static HTML code to be wrapped in 390*62fe3e72Sschwarzea <FOOTER> element and inserted right before closing the <BODY> element. 391c6c22f12Sschwarze.It Pa /man/OpenBSD-current/man1/mandoc.1 392c6c22f12SschwarzeAn example 393c6c22f12Sschwarze.Xr mdoc 7 394c6c22f12Sschwarzesource file located below the 395c6c22f12Sschwarze.Dq OpenBSD-current 396c6c22f12Sschwarzemanpath. 397c6c22f12Sschwarze.El 398c6c22f12Sschwarze.Sh COMPATIBILITY 399c6c22f12SschwarzeThe 400c6c22f12Sschwarze.Nm 401c6c22f12SschwarzeCGI program is call-compatible with queries from the traditional 402c6c22f12Sschwarze.Pa man.cgi 403c6c22f12Sschwarzescript by Wolfram Schneider. 404d50b5b74SschwarzeHowever, the output looks quite different. 405c6c22f12Sschwarze.Sh SEE ALSO 406c6c22f12Sschwarze.Xr apropos 1 , 407c6c22f12Sschwarze.Xr mandoc.db 5 , 408c6c22f12Sschwarze.Xr makewhatis 8 , 409c6c22f12Sschwarze.Xr slowcgi 8 410c6c22f12Sschwarze.Sh HISTORY 411c6c22f12SschwarzeA version of 412c6c22f12Sschwarze.Nm 413c6c22f12Sschwarzebased on 414c6c22f12Sschwarze.Xr mandoc 1 415c6c22f12Sschwarzefirst appeared in mdocml-1.12.1 (March 2012). 41618f5ab3dSschwarzeThe current 41718f5ab3dSschwarze.Xr mandoc.db 5 41818f5ab3dSschwarzedatabase format first appeared in 41918f5ab3dSschwarze.Ox 6.1 . 420c6c22f12Sschwarze.Sh AUTHORS 421c6c22f12Sschwarze.An -nosplit 422c6c22f12SschwarzeThe 423c6c22f12Sschwarze.Nm 424c6c22f12Sschwarzeprogram was written by 425c6c22f12Sschwarze.An Kristaps Dzonsons Aq Mt kristaps@bsd.lv 42618f5ab3dSschwarzeand is maintained by 42718f5ab3dSschwarze.An Ingo Schwarze Aq Mt schwarze@openbsd.org , 42818f5ab3dSschwarzewho also designed and implemented the database format. 429