xref: /dflybsd-src/contrib/mdocml/mandocd.8 (revision 54ba96075f5891e4574304da6ba88f1a1afe520b)
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