1*54ba9607SSascha Wildner.\" $Id: mandocd.8,v 1.2 2017/03/18 19:56:01 schwarze Exp $ 2*54ba9607SSascha Wildner.\" 3*54ba9607SSascha Wildner.\" Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org> 4*54ba9607SSascha Wildner.\" 5*54ba9607SSascha Wildner.\" Permission to use, copy, modify, and distribute this software for any 6*54ba9607SSascha Wildner.\" purpose with or without fee is hereby granted, provided that the above 7*54ba9607SSascha Wildner.\" copyright notice and this permission notice appear in all copies. 8*54ba9607SSascha Wildner.\" 9*54ba9607SSascha Wildner.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10*54ba9607SSascha Wildner.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11*54ba9607SSascha Wildner.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12*54ba9607SSascha Wildner.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13*54ba9607SSascha Wildner.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14*54ba9607SSascha Wildner.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15*54ba9607SSascha Wildner.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16*54ba9607SSascha Wildner.\" 17*54ba9607SSascha Wildner.Dd $Mdocdate: March 18 2017 $ 18*54ba9607SSascha Wildner.Dt MANDOCD 8 19*54ba9607SSascha Wildner.Os 20*54ba9607SSascha Wildner.Sh NAME 21*54ba9607SSascha Wildner.Nm mandocd 22*54ba9607SSascha Wildner.Nd server process to format manual pages in batch mode 23*54ba9607SSascha Wildner.Sh SYNOPSIS 24*54ba9607SSascha Wildner.Nm mandocd 25*54ba9607SSascha Wildner.Op Fl I Cm os Ns = Ns Ar name 26*54ba9607SSascha Wildner.Op Fl T Ar output 27*54ba9607SSascha Wildner.Ar socket_fd 28*54ba9607SSascha Wildner.Sh DESCRIPTION 29*54ba9607SSascha WildnerThe 30*54ba9607SSascha Wildner.Nm 31*54ba9607SSascha Wildnerutility formats many manual pages without requiring 32*54ba9607SSascha Wildner.Xr fork 2 33*54ba9607SSascha Wildnerand 34*54ba9607SSascha Wildner.Xr exec 3 35*54ba9607SSascha Wildneroverhead in between. 36*54ba9607SSascha WildnerIt does not require listing all the manuals to be formatted on the 37*54ba9607SSascha Wildnercommand line, and it supports writing each formatted manual to its 38*54ba9607SSascha Wildnerown file descriptor. 39*54ba9607SSascha Wildner.Pp 40*54ba9607SSascha WildnerThis server requires that a connected UNIX domain 41*54ba9607SSascha Wildner.Xr socket 2 42*54ba9607SSascha Wildneris already present at 43*54ba9607SSascha Wildner.Xr exec 3 44*54ba9607SSascha Wildnertime. 45*54ba9607SSascha WildnerConsequently, it cannot be started from the 46*54ba9607SSascha Wildner.Xr sh 1 47*54ba9607SSascha Wildnercommand line because the shell cannot supply such a socket. 48*54ba9607SSascha WildnerTypically, the socket is created by the parent process using 49*54ba9607SSascha Wildner.Xr socketpair 2 50*54ba9607SSascha Wildnerbefore calling 51*54ba9607SSascha Wildner.Xr fork 2 52*54ba9607SSascha Wildnerand 53*54ba9607SSascha Wildner.Xr exec 3 54*54ba9607SSascha Wildneron 55*54ba9607SSascha Wildner.Nm . 56*54ba9607SSascha WildnerThe parent process will pass the file descriptor number as an argument to 57*54ba9607SSascha Wildner.Xr exec 3 , 58*54ba9607SSascha Wildnerformatted as a decimal ASCII-encoded integer. 59*54ba9607SSascha WildnerSee 60*54ba9607SSascha Wildner.Xr catman 8 61*54ba9607SSascha Wildnerfor a typical implementation of a parent process. 62*54ba9607SSascha Wildner.Pp 63*54ba9607SSascha Wildner.Nm 64*54ba9607SSascha Wildnerloops reading one-byte messages with 65*54ba9607SSascha Wildner.Xr recvmsg 2 66*54ba9607SSascha Wildnerfrom the file descriptor number 67*54ba9607SSascha Wildner.Ar socket_fd . 68*54ba9607SSascha WildnerIt ignores the byte read and only uses the out-of-band auxiliary 69*54ba9607SSascha Wildner.Vt struct cmsghdr 70*54ba9607SSascha Wildnercontrol data, typically supplied by the calling process using 71*54ba9607SSascha Wildner.Xr CMSG_FIRSTHDR 3 . 72*54ba9607SSascha WildnerThe parent process is expected to pass three file descriptors 73*54ba9607SSascha Wildnerwith each dummy byte. 74*54ba9607SSascha WildnerThe first one is used for 75*54ba9607SSascha Wildner.Xr mdoc 7 76*54ba9607SSascha Wildneror 77*54ba9607SSascha Wildner.Xr man 7 78*54ba9607SSascha Wildnerinput, the second one for formatted output, and the third one 79*54ba9607SSascha Wildnerfor error output. 80*54ba9607SSascha Wildner.Pp 81*54ba9607SSascha WildnerThe options are as follows: 82*54ba9607SSascha Wildner.Bl -tag -width Ds 83*54ba9607SSascha Wildner.It Fl I Cm os Ns = Ns Ar name 84*54ba9607SSascha WildnerOverride the default operating system 85*54ba9607SSascha Wildner.Ar name 86*54ba9607SSascha Wildnerfor the 87*54ba9607SSascha Wildner.Xr mdoc 7 88*54ba9607SSascha Wildner.Ic \&Os 89*54ba9607SSascha Wildnerand for the 90*54ba9607SSascha Wildner.Xr man 7 91*54ba9607SSascha Wildner.Ic TH 92*54ba9607SSascha Wildnermacro. 93*54ba9607SSascha Wildner.It Fl T Ar output 94*54ba9607SSascha WildnerOutput format. 95*54ba9607SSascha WildnerThe 96*54ba9607SSascha Wildner.Ar output 97*54ba9607SSascha Wildnerargument can be 98*54ba9607SSascha Wildner.Cm ascii , 99*54ba9607SSascha Wildner.Cm utf8 , 100*54ba9607SSascha Wildneror 101*54ba9607SSascha Wildner.Cm html ; 102*54ba9607SSascha Wildnersee 103*54ba9607SSascha Wildner.Xr mandoc 1 . 104*54ba9607SSascha WildnerIn 105*54ba9607SSascha Wildner.Cm html 106*54ba9607SSascha Wildneroutput mode, the 107*54ba9607SSascha Wildner.Cm fragment 108*54ba9607SSascha Wildneroutput option is implied. 109*54ba9607SSascha WildnerOther output options are not supported. 110*54ba9607SSascha Wildner.El 111*54ba9607SSascha Wildner.Pp 112*54ba9607SSascha WildnerAfter exhausting one input file descriptor, all three file descriptors 113*54ba9607SSascha Wildnerare closed before reading the next dummy byte and control message. 114*54ba9607SSascha Wildner.Pp 115*54ba9607SSascha WildnerWhen a zero-byte message is read, when the 116*54ba9607SSascha Wildner.Ar socket_fd 117*54ba9607SSascha Wildneris closed by the parent process, 118*54ba9607SSascha Wildneror when an error occurs, 119*54ba9607SSascha Wildner.Nm 120*54ba9607SSascha Wildnerexits. 121*54ba9607SSascha Wildner.Sh EXIT STATUS 122*54ba9607SSascha Wildner.Ex -std 123*54ba9607SSascha Wildner.Pp 124*54ba9607SSascha WildnerA zero-byte message or a closed 125*54ba9607SSascha Wildner.Ar socket_fd 126*54ba9607SSascha Wildneris considered success. 127*54ba9607SSascha WildnerPossible errors include: 128*54ba9607SSascha Wildner.Bl -bullet 129*54ba9607SSascha Wildner.It 130*54ba9607SSascha Wildnermissing, invalid, or excessive 131*54ba9607SSascha Wildner.Xr exec 3 132*54ba9607SSascha Wildnerarguments 133*54ba9607SSascha Wildner.It 134*54ba9607SSascha Wildner.Xr recvmsg 2 135*54ba9607SSascha Wildnerfailure, for example due to 136*54ba9607SSascha Wildner.Er EMSGSIZE 137*54ba9607SSascha Wildner.It 138*54ba9607SSascha Wildnermissing or unexpected control data, in particular a 139*54ba9607SSascha Wildner.Fa cmsg_level 140*54ba9607SSascha Wildnerin the 141*54ba9607SSascha Wildner.Vt struct cmsghdr 142*54ba9607SSascha Wildnerthat differs from 143*54ba9607SSascha Wildner.Dv SOL_SOCKET , 144*54ba9607SSascha Wildnera 145*54ba9607SSascha Wildner.Fa cmsg_type 146*54ba9607SSascha Wildnerthat differs from 147*54ba9607SSascha Wildner.Dv SCM_RIGHTS , 148*54ba9607SSascha Wildneror a 149*54ba9607SSascha Wildner.Fa cmsg_len 150*54ba9607SSascha Wildnerthat is not three times the size of an 151*54ba9607SSascha Wildner.Vt int 152*54ba9607SSascha Wildner.It 153*54ba9607SSascha Wildnerinvalid file descriptors passed in the 154*54ba9607SSascha Wildner.Xr CMSG_DATA 3 155*54ba9607SSascha Wildner.It 156*54ba9607SSascha Wildnerresource exhaustion, in particular 157*54ba9607SSascha Wildner.Xr dup 2 158*54ba9607SSascha Wildneror 159*54ba9607SSascha Wildner.Xr malloc 3 160*54ba9607SSascha Wildnerfailure 161*54ba9607SSascha Wildner.El 162*54ba9607SSascha Wildner.Pp 163*54ba9607SSascha WildnerExcept for memory exhaustion and similar system-level failures, 164*54ba9607SSascha Wildnerparsing and formatting errors do not cause 165*54ba9607SSascha Wildner.Nm 166*54ba9607SSascha Wildnerto return an error exit status. 167*54ba9607SSascha WildnerEven after severe parsing errors, 168*54ba9607SSascha Wildner.Nm 169*54ba9607SSascha Wildnerwill simply accept and process the next input file descriptor. 170*54ba9607SSascha Wildner.Sh SEE ALSO 171*54ba9607SSascha Wildner.Xr mandoc 1 , 172*54ba9607SSascha Wildner.Xr mandoc 3 , 173*54ba9607SSascha Wildner.Xr catman 8 174*54ba9607SSascha Wildner.Sh HISTORY 175*54ba9607SSascha WildnerThe 176*54ba9607SSascha Wildner.Nm 177*54ba9607SSascha Wildnerutility appeared in version 1.14.1 or the 178*54ba9607SSascha Wildner.Sy mandoc 179*54ba9607SSascha Wildnertoolkit. 180*54ba9607SSascha Wildner.Sh AUTHORS 181*54ba9607SSascha Wildner.An -nosplit 182*54ba9607SSascha WildnerThe concept was designed and implemented by 183*54ba9607SSascha Wildner.An Michael Stapelberg Aq Mt stapelberg@debian.org . 184*54ba9607SSascha WildnerThe 185*54ba9607SSascha Wildner.Xr mandoc 3 186*54ba9607SSascha Wildnerglue needed to make it a stand-alone process was added by 187*54ba9607SSascha Wildner.An Ingo Schwarze Aq Mt schwarze@openbsd.org . 188*54ba9607SSascha Wildner.Sh CAVEATS 189*54ba9607SSascha WildnerIf the parsed manual pages contain 190*54ba9607SSascha Wildner.Xr roff 7 191*54ba9607SSascha Wildner.Pf . Ic so 192*54ba9607SSascha Wildnerrequests, 193*54ba9607SSascha Wildner.Nm 194*54ba9607SSascha Wildnerneeds to be started with the current working directory set to the 195*54ba9607SSascha Wildnerroot of the manual page tree. 196*54ba9607SSascha WildnerAvoid starting it in directories that contain secret files in any 197*54ba9607SSascha Wildnersubdirectories, in particular in the user starting it has read 198*54ba9607SSascha Wildneraccess to these secret files. 199