.Ch "Configuration Mechanisms in C News"
.Ix configuration
.SH
Intro
.LP
There is an overall problem with news stuff in that some pathnames
and such are site-specific.
In C News this hits both shell files and C programs, the former a
particular inconvenience because they are not compiled and hence can't
easily pick it up from a library at compile time.
It's easy to edit shell files, but there are too many of them for this
to be very convenient.
.LP
Several mechanisms are needed to solve the entire problem..
.SH
Configuration Parameters
.LP
Although there are many things that theoretically could be site-specific,
there are only a few that really crop up constantly,
are highly likely to change,
and have to be known to running code.
Here's a tentative list, with internal names and common defaults:
.Ix configuration variables
.TS
lll.
NEWSARTS	pathname of the article database	/usr/spool/news
NEWSCTL	pathname of the control-file directory	/usr/lib/news
NEWSBIN	pathname of the program directory	/usr/lib/newsbin
NEWSPATH	shell PATH setting for news	/bin:/usr/bin
NEWSUMASK	default umask for file creation	002
NEWSMASTER	where to send mail about trouble	usenet
NEWSCONFIG	see "Subst" section	/usr/lib/news/bin/config
.TE
.SH
Environment Variables
.LP
All C News programs
that care about configuration parameters are expected to look at
environment variables with the same names as the parameters, and to
use the environment values to override internal defaults.
This is primarily aimed at testing and special purposes rather than
production use, as there is a fundamental problem:
the environment is insecure.
The environment variables are nevertheless very useful.
.LP
There is a need for a canned interface to the environment variables,
to simplify their use.
There is also a requirement for centrally-set defaults for normal
production use.
These requirements are addressed differently for C and shell programs.
.SH
C Interface
.LP
\fILibcnews\fR provides a set of inquiry functions:
.Ix configuration library
.LP
.RS
.IP "char *fullartfile(char *name);"
Returns a full pathname for the NEWSARTS-relative file \fIname\fR;
if \fIname\fR is NULL, returns the value of NEWSARTS.
.IP "char *ctlfile(char *name);"
Returns a full pathname for the NEWSCTL-relative file \fIname\fR;
if \fIname\fR is NULL, returns the value of NEWSCTL.
.IP "char *binfile(char *name);"
Returns a full pathname for the NEWSBIN-relative file \fIname\fR;
if \fIname\fR is NULL, returns the value of NEWSBIN.
.IP "char *newspath(void);"
Returns the value of the NEWSPATH parameter.
.IP "int newsumask(void);"
Returns the value of the NEWSUMASK parameter.
.IP "char *newsmaster(void);"
Returns the value of NEWSMASTER.
.RE
.LP
Functions which return string values return pointers to areas which they
may later re-use, so the values should be copied if they are to persist
past later calls.
There is also a function \fIartfile\fR which returns a relative pathname,
as a special-purpose optimization,
and a function \fIcd\fR which does a \fIchdir\fR and notes the location
for future use by \fIartfile\fR.
.LP
The first inquiry function to be invoked automatically initializes
their internal housekeeping.
Against the possibility of malicious setting of environment variables,
if any environment variables are in fact present to override default
values, and at least one value in fact differs from the default,
this initialization includes a call to a function the user must supply:
.LP
.RS
.IP "void unprivileged(char *reason);"
Drop any special powers that should not be available to a normal user
program,
e.g. those obtained by set-uid bit.
.I Reason
is the name of the first environment variable that caused trouble.
.RE
.LP
Programs that do not use the set-uid bit can normally have a null
implementation of \fIunprivileged\fR, but to encourage thought about
the matter this is \fInot\fR provided as a default.
.LP
Suitable external declarations for all these functions can be found
in the include file \fIconfig.h\fR in the C News include directory.
.Ix config.h
.SH
Shell interface
.LP
All shell files that want to know configuration parameters should
execute NEWSCTL/bin/config using the `.' command;
.Ix config
it sets shell variables with the same names as the parameters.
Note that it does not export these variables, so subordinate shell
files need to pick up \fIconfig\fR themselves.
This is to preserve the property that subordinate programs see environment
variables set only if the user set them.
.SH
Subst
.LP
.Ix subst
The alert mind will have noticed a circularity in the previous section:
it's not possible to find NEWSCTL/bin/config until one knows where NEWSCTL is.
There are also occasional annoyances in that documentation and such wants
to know the local defaults, and can't get them from either the C or shell
interface.
Hence the use of \fIsubst\fR.
.LP
\fISubst\fR does substitutions into source files (including shell files)
in such a way that it is not necessary to maintain two versions of the file.
In the top-level directory of the C News sources are four files:
\fIsubst\fR itself, the \fIsubstitutions\fR file defining the values of
the configuration parameters, and \fIsubst.hs\fR and \fIsubst.gc\fR,
which are lists of files (relative to the top-level source directory)
that need substitutions done.
(The use of two `list' files reflects C News's dual authorship.)
See the \fIsubst\fR(1) manual page for the gory details of the syntax.
The only C program affected is the configuration-inquiry part of the
library, but all shell files that need any of the configuration parameters
need to be in one of the lists.
.SH
Program startup
.LP
As a result of all this, a C program which needs to know a configuration
parameter simply calls the appropriate inquiry function,
and is prepared for a return call to \fIunprivileged\fR.
A shell program has to do a bit more work; it should start with something
on the order of:
.Ix configuration "shell scripts"
.DS
.ft B
#! /bin/sh
# foobar \- does foo, bar, and bletch

# =()<\&. ${NEWSCONFIG\-@<NEWSCONFIG>@}>()=
\&. ${NEWSCONFIG\-/usr/lib/news/bin/config}

PATH=$NEWSCTL/bin:$NEWSBIN/xxx:$NEWSBIN:$NEWSPATH ; export PATH
umask $NEWSUMASK
.ft
.DE
(A prototype for this is in conf/proto.sh.)
(See an accompanying document for the logic of the PATH setting.)
The NEWSCONFIG configuration parameter specifies the location of the
configurer shell program, which is then executed to set up the rest
of the parameters.
The reason for doing it this way is to ensure that new parameters
can be added without having to change every shell file.
.Ix NEWSCONFIG
