with-authinfo-kludge: Fix race between `setpgrp' and `kill'.
[with-authinfo-kludge] / with-authinfo-kludge.1
CommitLineData
b3370918
MW
1.\" -*-nroff-*-
2.\"
3.\" Manual page for `with-authinfo-kludge'.
4.\"
5.\" (c) 2016 Mark Wooding
6.\"
7.
8.\"----- Licensing notice ---------------------------------------------------
9.\"
10.\" This program is free software; you can redistribute it and/or modify
11.\" it under the terms of the GNU General Public License as published by
12.\" the Free Software Foundation; either version 2 of the License, or
13.\" (at your option) any later version.
14.\"
15.\" This program is distributed in the hope that it will be useful,
16.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
17.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18.\" GNU General Public License for more details.
19.\"
20.\" You should have received a copy of the GNU General Public License
21.\" along with this program; if not, write to the Free Software Foundation,
22.\" Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23.
24.ie t \{\
25. ds o \(bu
26.\}
27.el \{\
28. ds o o
29.\}
30.
31.de hP
32.IP
33\h'-\w'\fB\\$1\ \fP'u'\fB\\$1\ \fP\c
34..
35.
36.de VS
37.sp 1
38.RS
39.nf
40.ft B
41..
42.de VE
43.ft R
44.fi
45.RE
46.sp 1
47..
48.
49.TH with-authinfo-kludge 1 "23 April 2016"
50.
51.\"--------------------------------------------------------------------------
52.SH NAME
53with-authinfo-kludge \- run a newsreader with AUTHINFO GENERIC support
54.
55.SH SYNOPSIS
56with-authinfo-kludge
57.RB [ \-v ]
58.RB [ \-d
59.IR dir ]
60.RB [ \-f
61.IR conf ]
62.RB [ \-t
63.IR tag ]
64.br
65\h'5m'\c
66[
67.BI + server
68.RI [ param \fR= value
69\&...] \&...]
70.RB [ + ]
71.br
72\h'5m'\c
73.I command
74.RI [ args
75\&...]
76.
77.\"--------------------------------------------------------------------------
78.SH DESCRIPTION
79.
80The
81.B with-authinfo-kludge
82program is an
83.I adverbial modifier
84which runs another command
85(typically a newsreader)
b352adb0 86in an environment in which it can,
b3370918
MW
87transparently to it,
88make connections to certain NNTP servers
89which usually require
90.B AUTHINFO GENERIC
91authentication before they'll permit clients to read or post.
92This is useful because support for
93.B AUTHINFO GENERIC
b352adb0 94has never been especially widely implemented by newsreaders
b3370918
MW
95and now seems to be being withdrawn from those newsreaders
96which used to support it.
97.PP
98In the simple case, you say something like
99.VS
100with-authinfo-kludge slrn
101.VE
102and then
103.B slrn
104will start up,
105connect to your default NNTP server
106(as named in the
107.B NNTPSERVER
108environment variable),
109authenticate to it as needed,
110and let you read and post news.
111In more complicated cases,
112.B with-authinfo-kludge
113can handle multiple NNTP servers,
114set up SSH forwarding for them,
115offer different authentication credentials to them,
116and hide the fact that they might be running on nonstandard ports.
117.PP
118The
119.B with-authinfo-kludge
120program doesn't do all of this itself:
121it depends on some other tools existing on the system in which it runs.
122(It doesn't need anything special running on the server system.)
123The external dependencies are as follows.
124.hP \*o
125The
126.B authinfo-kludge
127program, by Richard Kettlewell,
128is a simple proxy which relays commands and responses
129between the client (on stdin/stdout) and server (over TCP),
130and responds transparently to authentication requests from the server.
131.hP \*o
132The
133.B noip
134hack, by Mark Wooding,
135is an
136.B LD_PRELOAD
137library which selectively uses Unix-domain sockets
138in place of IPv4 or IPv6 sockets.
139.
140.SS "Command line"
141The
142.B with-authinfo-kludge
143program accepts a small number of options
144before its main command-line arguments.
145.TP
146.B \-h
147Write help about the command-line syntax to standard output,
148and exit with status zero.
149.TP
150.BI "\-d " dir
151Use
152.I dir
153as the `runtime directory',
154which is used to store sockets and other working files
155while
156.B with-authinfo-kludge
157is running.
158By default, it will choose an appropriate place
159in a moderately complicated manner described below;
160this option lets you override its choice
161in order to achieve special effects.
162.TP
163.BI "\-f " conf
164Read configuration from
165.IR conf .
166The default is somewhat complicated;
167see below.
168.TP
169.BI "\-t " tag
170Use
171.I tag
172to distinguish this usage of
173.B with-authinfo-kludge
174from others.
175The tag is used to select default configuration files
176and runtime directories.
177By default, the basename of the
178.I command
179is used.
180.TP
181.B "\-v"
182Print messages explaining what
183.B with-authinfo-kludge
184is doing to standard error.
185By default,
186.B with-authinfo-kludge
187does its thing silently unless there are problems.
188.PP
189The
190.I command
191argument names the command which should be run
192with the various proxy arrangements which it is the task of
193.B with-authinfo-kludge
194to arrange; it will be passed the
195.IR args ,
196if any.
197The command name and arguments are not subject to
198interpretation by the shell;
199if, for some reason, you wanted to make use of shell features,
200you should specify a command of the form
201.B /bin/sh
202.B \-c
203.IR shell-fragment .
204.PP
205Between the options (if any) and the
206.I command
207name,
208there may be a number of server configurations.
209If any are present, they take the place of any configuration file:
210an error is reported if a
211.B \-f
212option was passed.
afaf8da0 213A server configuration starts with
b3370918
MW
214an argument consisting of a server name prefixed by a
215.RB ` + '
216character:
217.IP
218.BI + server
219.PP
220This may be followed by assignments
221.IP
222.IB param = value
223.PP
224which set configuration parameters
225for the previously-named server.
226Such a server configuration on the command line
227is treated exactly the same as a configuration-file section
228.IP
229.BI [ server ]
230.br
231.IB param = value
232.br
233\&...
234.PP
235See below for details about the configuration file.
236.PP
89a1cc74 237To hedge against the
b3370918 238.IR command 's
89a1cc74
MW
239name containing an
240.RB ` = '
241or, less plausibly, beginning with
b3370918
MW
242.RB ` + ',
243an argument consisting of a
244.RB ` + '
245sign on its own marks the end of the server configurations:
246the following argument will be interpreted as the command name
247regardless of its syntactic form.
248If there is a
249.RB ` + '
250marker, but no server configurations,
251then the configuration file is read,
252or the default configuration is used,
253as usual.
254.
255.SS "Configuration file"
256The
257.B with-authinfo-kludge
258program reads configuration from a standard-ish
259.RB ` .ini '-format
260file.
261The file consists of parameter settings of the form
262.IP
263.I param
264.B =
265.I value
266.PP
267divided into sections by headers of the form
268.IP
269.BI [ name ]
270.PP
271Whitespace around the
272.IR name ,
273.I param
274and
275.I value
276strings is discarded.
277A section
278.I name
279may itself contain square brackets,
280and they need not be properly nested.
281There is no syntax for continuing values over more than one line.
282.PP
283The file may also contain blank lines,
284and comment lines whose first non-whitespace character is either
285.RB ` # '
286or
287.RB ` ; '.
288All such lines are ignored.
289.PP
290Parameter settings apply to the section named in the most recent
291setion header.
292Settings appearing before the first section header apply to
293the special section named
294.BR @GLOBAL ,
295just as if a line
296.IP
297.B [@GLOBAL]
298.PP
299appeared at the very top of the file.
300It is permitted (though not usually expected)
301for several section headers to have the same name;
302in this case,
303all of the settings following any of the occurrences are gathered together,
304just as if they'd all appeared under a single header,
305in the same order.
306If the same parameter is assigned more than once,
307then only the
308.I last
309assignment has any effect.
310.PP
311With the exception of the
312.B @GLOBAL
313section,
314each section header should name an NNTP server.
315.PP
316The following server parameters are recognized.
317.TP
318.BI local= host\fR[ : port \fR]
319Sets the NNTP server address which the newsreader command
320expects to connect to.
321This does
322.I not
323have to be an address local to the machine on which
324.B with-authinfo-kludge
325runs.
326It defaults to the
327.I server
328name from the section heading
329(which must therefore be in the appropriate format),
330and may be equal to the
331.I remote
332address (below) without causing difficulty.
838ff5e9
MW
333Note that
334.B with-authinfo-kludge
335will not do anything to encourage the client
336to connect to the right address;
337its caller must arrange to configure the client correctly,
338e.g., by setting the
339.B NNTPSERVER
340environment variable appropriately.
b3370918
MW
341.TP
342.BI nntpauth= "parameter arguments\fR..."
343Set the AUTHINFO GENERIC authentication parameter and arguments
344to use for this server.
345The default is to use the settings from the
346.B NNTPAUTH
347environment variable.
348.TP
349.BI remote= host\fR[ : port \fR]
350Sets the real address of the NNTP server which
351.BR with-authinfo-kludge 's
352proxy (or the SSH tunnel) should connect to.
353It defaults to the
354.I server
355name from the section heading
356(which must therefore be in the appropriate format).
357.TP
358.BI sshbind= host\fR[ : port\fR]
359Change the address and port number
360of the local end of the SSH tunnel
361set up by the
362.B via
363parameter.
364The default is to use
e8e64c07 365.\" FIXME Fuck you openssh
b3370918
MW
366127.1.0.1:119.
367It is
368.I not
369a problem for multiple servers to use the same address:
370.B with-authinfo-kludge
371uses the
372.BR noip (1)
373library to keep them
374separate.
375.TP
376.BI via= gateway
377Use SSH connection forwarding to reach the server.
378The
379.I gateway
380is passed to
381.BR ssh (1)
382as its hostname parameter,
383so may be a hostname or IP address,
384possibly prefixed by
385.IB user @
386to choose a different login name;
387or it may name a
388.BR ssh_config (1)
389stanza providing detailed configuration.
390Note that the local end of the tunnel will
391.I not
392be exposed to other users of the local machine,
393since this instance of SSH is run under the control of
394.BR noip (1).
395.PP
396The various parameters which take network addresses
397accept a common syntax:
398.IP
399.IR host \c
400.RB [ : \c
401.IR port ]
402.PP
403The
404.I host
405may be a hostname;
406an IPv4 address in dotted-quad notation; or
407an IPv6 address in hex-and-colons notation,
408which must contain at least
409.I two
410colons to be valid.
411Raw IP addresses may be surrounded by square brackets;
412this is necessary to disambiguate a trailing
413.BI : port
414following an IPv6 address because the IPv6 address syntax is stupid.
415.PP
416The
417.B @GLOBAL
418section may set the following parameters.
419.TP
420.BI rundir= dir
421Set the runtime directory to be
422.IR dir .
423This directory (but not its parent directories)
424will be created automatically if necessary.
425The default runtime directory is chosen in a complicated way;
426see below.
427.PP
428The configuration file is found as follows.
429.hP 1.
430If server configurations are provided on the command line,
431then they are used instead of any configuration file.
432.hP 2.
433If a
434.B \-f
435option is given, then it is read as a configuration file.
436A fatal error is reported if the file does not exist,
437or cannot be read for some other reason.
438.hP 3.
439The user's home directory is determined, as follows.
440If the environment variable
441.B HOME
442is set, then its value is used.
b3370918
MW
443Let
444.I home
445be the home directory so determined, if any.
446.hP 4.
447A `configuration home' directory is determined, as follows.
448If the environment variable
449.B XDG_CONFIG_HOME
450is set, then its value is used.
451Otherwise, the configuration home is
452.IB home /.config \fR;
453a fatal error is reported at this point
454if no home directory was determined.
455Let
456.I config-home
457denote the configuration home directory so determined.
e8e64c07 458.\" FIXME XDG_CONFIG_DIRS too now
b3370918
MW
459.hP 5.
460A `tag' is chosen, as follows.
461If the
462.B \-t
463option is given, then its value is used;
464otherwise the tag is the basename of the
465.I command
466(i.e., the part following the last
467.RB ` / ',
468if any).
469Let
470.I tag
471denote the tag so chosen.
472.hP 6.
473If
474.IB config-home /with-authinfo-kludge/ tag .conf
475exists, then it is read as a configuration file.
476(If it can't be read, then a fatal error is reported.)
477.hP 7.
478If
479.IB config-home /with-authinfo-kludge/@default.conf
480exists, then it is read as a configuration file.
481(If it can't be read, then a fatal error is reported.)
482.hP 8.
483No configuration file could be found,
484so a default configuration is constructed, as follows.
485Let
486.I nntp-server
afaf8da0 487be the value of the
b3370918
MW
488.B NNTPSERVER
489environment variable;
490if it is not set, then a fatal error is reported.
491The default configuration is as follows.
492.RS
493.IP
494.BI [ nntp-server ]
495.RE
496.
497.SS "The runtime directory"
498(This section is technical, and can safely be skipped by most users.
499It may be useful to know this stuff if
500.B with-authinfo-kludge
501is behaving confusingly and you're trying to understand why.)
502.PP
503The runtime directory is chosen as follows.
504.hP 1.
505If the
506.B \-d
507option is present, then its value is used.
e365c82b
MW
508Otherwise, if the configuration file specifies
509a value for the global
510.B rundir
511parameter then that it used.
b3370918
MW
512.hP 2.
513If the environment variable
514.B XDG_RUNTIME_DIR
515is set, then let
516.I run
517denote its value;
518then
519.IB run /with-authinfo-kludge
520is used as the runtime directory.
d9c763dc 521.hP 3
b3370918
MW
522If the environment variable
523.B TMPDIR
524is set, then let
525.I tmp
526be its value;
527otherwise, let
528.I tmp
529be
530.BR /tmp .
d9c763dc
MW
531Let
532.I uid
533be the current effective uid, in decimal,
534without leading zeroes
535(if the superuser is foolish enough to run this program then
536.I uid
537is
538.BR 0 ).
b3370918 539If
d9c763dc 540.IB tmp/ with-authinfo-kludge- uid
b3370918
MW
541exists,
542is a directory (and not a symbolic link),
543is owned by the current effective uid,
544and has no permissions for group or others;
545or if it does not exist but can be created with the above properties;
546then it is used as the runtime directory.
d9c763dc 547.hP 4.
b3370918
MW
548The user's home directory is determined, as follows.
549If the environment variable
550.B HOME
551is set, then its value is used.
b3370918
MW
552Let
553.I home
554be the home directory so determined, if any.
d9c763dc 555.hP 5.
b3370918
MW
556A `cache home' directory is determined, as follows.
557If the environment variable
558.B XDG_CACHE_HOME
559is set, then its value is used.
560Otherwise, the configuration home is
561.IB home /.cache \fR;
562a fatal error is reported at this point
563if no home directory was determined.
564Let
565.I cache-home
566denote the cache home directory so determined.
567If the cache home directory does not exist,
568then it is created with mode 0777 (as modified by the umask).
d9c763dc 569.hP 6.
b3370918
MW
570Let
571.I hostname
572be the local machine's hostname,
573as reported by
574.BR gethostname (2).
e365c82b 575Then
b3370918 576.IB cache-home /with-authinfo-kludge. hostname
e365c82b
MW
577is used as the runtime directory.
578.PP
579If the directory chosen by the above procedure does not exist,
b3370918
MW
580then it is created as a directory,
581with mode 0700 (and modified by the umask).
b3370918
MW
582(If it exists, but is not in fact a directory,
583then later operations will fail.)
584.PP
585The runtime directory contains a number of other directories,
586named
e8e64c07
MW
587.\" FIXME junk, new, naming
588.\" session dirs now entirely different
b3370918
MW
589.IR tag . pid \fR.
590Each such directory corresponds to a running
591(or failed)
592instance of
593.BR with-authinfo-kludge ;
594the
595.I pid
596is its process-id (possibly useful for diagnostic purposes),
597and the
598.I tag
599is the tag summarizing its purpose
600(as determined in step 5 of the procedure
601for finding a configuration file).
602.PP
603The contents of the instance directory are as follows.
604.TP
605.B client.pid
606The process-id of the client command run by
607.BR with-authinfo-kludge .
608.TP
609.B lock
610An empty file.
611A
612running
613.B with-authinfo-kludge
614process holds a lock on this file.
615It is used simply to tell other processes that
616the directory is still in use and shouldn't be cleaned up.
617.TP
618.B noip/
619A directory containing Unix-domain sockets,
620maintained by the
621.B noip
622library.
623.TP
624.B ssh.pid
625The process-id of the SSH process started to satisfy a
626.B via
627server parameter.
628.
629.\"--------------------------------------------------------------------------
630.SH BUGS
631.
632The program is probably too complicated for many uses,
633but the author finds the various bells and whistles useful.
634.PP
635There isn't a good way to get two or more NNTP clients
636to share the same proxy machinery.
637This is somewhat wasteful.
638Fixing this would necessitate some other way of
639orchestrating the setup and teardown of runtime directories.
b3370918
MW
640.
641.\"--------------------------------------------------------------------------
642.SH SEE ALSO
643.
644.BR authinfo-kludge (1),
645.BR noip (1).
646.PP
647S. Barber,
648.IR "RFC2980, Common NNTP Extensions",
649.if !t \{\
650.br
651\h'5m'\c
652.\}
653.BR "https://www.ietf.org/rfc/rfc2980.txt" .
654.
655.SH AUTHOR
656Mark Wooding,
657<mdw@distorted.org.uk>
658.
659.\"----- That's all, folks --------------------------------------------------