/* -*- Mode: Text -*- */

autogen definitions options;

#include autogen-version.def

copyright = {
    date  = "1970-2006";
    owner = "ntp.org";
    eaddr = "http://bugs.ntp.isc.org, bugs@ntp.org";
    type  = note;
    text  = `cat COPYRIGHT`;
};


prog-name      = "sntp";
prog-title     = "standard SNTP program";
homerc         =  $HOME, ".";
long-opts;

config-header  = "config.h";

#ifndef __windows__
rcfile         = ".ntprc";
#else
rcfile         = "ntp.ini";
#endif

environrc;

#include version.def

test-main;

flag = {
    name      = ipv4;
    value     = 4;
    equivalence = ipv4;
    descrip   = "Force IPv4 DNS name resolution";
    doc = <<-  _EndOfDoc_
	Force DNS resolution of following host names on the command line
	to the IPv4 namespace.
	_EndOfDoc_;
};

flag = {
    name      = ipv6;
    value     = 6;
    equivalence = ipv4;
    descrip   = "Force IPv6 DNS name resolution";
    doc = <<-  _EndOfDoc_
	Force DNS resolution of following host names on the command line
	to the IPv6 namespace.
	_EndOfDoc_;
};

flag = {
    name      = unprivport;
    value     = u;
    descrip   = "Use an unprivileged port";
    doc = <<-  _EndOfDoc_
	Use an unprivilegded UDP port for our queries.
	_EndOfDoc_;
};

flag = {
    name      = normalverbose;
    value     = v;
    flags-cant = extraverbose, megaverbose;
    descrip   = "Slightly verbose";
    doc = <<-  _EndOfDoc_
	Diagnostic messages for non-fatal errors and a limited amount of
	tracing should be written to standard error.  Fatal ones always
	produce a diagnostic.  This option should be set when there is a
	suspected problem with the server, network or the source.
	_EndOfDoc_;
};

flag = {
    name      = extraverbose;
    value     = V;
    flags-cant = normalverbose, megaverbose;
    descrip   = "Extra verbose";
    doc = <<-  _EndOfDoc_
	Produce more and less comprehensible output, mainly for investigating
	problems with apparently inconsistent timestamps.  This option should
	be set when the program fails with a message indicating that is the
	trouble.
	_EndOfDoc_;
};

flag = {
    name      = megaverbose;
    value     = W;
    flags-cant = normalverbose, extraverbose;
    descrip   = "Mega verbose";
    doc = <<-  _EndOfDoc_
	Very verbose debugging output that will interfere with the timing
	when writing to the terminal (because of line buffered output from C).
	Note that the times produced by this are the corrections needed, and
	not the error in the local clock.  This option should be set only when
	debugging the source.
	_EndOfDoc_;
};

flag = {
    name      = settimeofday;
    value     = r;
    flags-cant = adjtime;
    descrip   = "Set (step) the time with settimeofday()";
    doc = <<-  _EndOfDoc_
	_EndOfDoc_;
};

flag = {
    name      = adjtime;
    value     = a;
    flags-cant = settimeofday;
    descrip   = "Set (slew) the time with adjtime()";
    doc = <<-  _EndOfDoc_
	_EndOfDoc_;
};

detail = <<-  _END_DETAIL
.I sntp
can be used as a SNTP client to query a NTP or SNTP server and either display
the time or set the local system's time (given suitable privilege).  It can be
run as an interactive command or in a
.I cron
job.
NTP is the Network Time Protocol (RFC 1305) and SNTP is the
Simple Network Time Protocol (RFC 2030, which supersedes RFC 1769).
	_END_DETAIL;

prog-man-descrip = <<-  _END_PROG_MAN_DESCRIP
.I sntp
can be used as a SNTP client to query a NTP or SNTP server and either display
the time or set the local system's time (given suitable privilege).  It can be
run as an interactive command or in a
.I cron
job.
NTP is the Network Time Protocol (RFC 1305) and SNTP is the
Simple Network Time Protocol (RFC 2030, which supersedes RFC 1769).
.SS Options
.PP
.I sntp
recognizes the following options:
.TP
.B \-v
indicates that diagnostic messages for non-fatal errors and a limited amount of
tracing should be written to standard error.  Fatal ones always produce a
diagnostic.  This option should be set when there is a suspected problem with
the server, network or the source.
.TP
.B \-V
requests more and less comprehensible output, mainly for investigating problems
with apparently inconsistent timestamps.  This option should be set when the
program fails with a message indicating that is the trouble.
.TP
.B \-W
requests very verbose debugging output, and will interfere with the timing
when writing to the terminal (because of line buffered output from C).  Note
that the times produced by this are the corrections needed, and not the error
in the local clock.  This option should be set only when debugging the source.
.TP
.B \-q
indicates that it should query a daemon save file being maintained by it.
This needs no privilege and will change neither the save file nor the clock.
.PP
The default is that it should behave as a client, and the following options
are then relevant:
.TP
.B \-r
indicates that the system clock should be reset by
.IR settimeofday .
Naturally, this will work only if the user has enough privilege.
.TP
.B \-a
indicates that the system clock should be reset by
.IR adjtime .
Naturally, this will work only if the user has enough privilege.
.PP
The default is to write the estimated correct local date and time (i.e. not
UTC) to the standard output in a format like
.BR "'1996 Oct 15 20:17:25.123 + 4.567 +/- 0.089 secs'" ,
where the
.B "'+ 4.567 +/- 0.089 secs'"
indicates the estimated error in the time on the local system.
.TP
.BI \-l " lockfile"
sets the name of the lock file to ensure that there is only
one copy of
.I sntp
running at once.  The default is installation-dependent, but will usually be
.IR /etc/sntp.pid .
.TP
.BI \-e " minerr"
sets the maximum ignorable variation between the clocks to
.IR minerr .
Acceptable values are from 0.001 to 1, and the default is 0.1 if a NTP host is
is specified and 0.5 otherwise.
.TP
.BI \-E " maxerr"
sets the maximum value of various delays that are deemed acceptable to
.IR maxerr .
Acceptable values are from 1 to 60, and the default is 5.  It should sometimes
be increased if there are problems with the network, NTP server or system
clock, but take care.
.TP
.BI \-P  " prompt"
sets the maximum clock change that will be made automatically to
.IR maxerr .
Acceptable values are from 1 to 3600 or
.IR no ,
and the default is 30.  If the program is being run interactively in ordinary
client mode, and the system clock is to be changed, larger corrections will
prompt the user for confirmation.  Specifying
.I no
will disable this and the correction will be made regardless.
.TP
.BI \-c " count"
sets the maximum number of NTP packets required to
.IR count .
Acceptable values are from 1 to 25 if a NTP host is specified and from 5 to 25
otherwise, and the default is 5.  If the maximum isn't enough, the system needs
a better consistency algorithm than this program uses.
.TP
.BI \-d " delay"
sets a rough limit on the total running time to
.I delay
seconds.  Acceptable values are from 1 to 3600, and the default is 15 if a NTP
host is specified and 300 otherwise.
.TP
.B -4
force IPv4 DNS resolution.
.TP
.B -6
force IPv6 DNS resolution.
.PP
.B address(es)
are the DNS names or IP numbers of hosts to use for the challenge and response
protocol; if no names are given, the program waits for broadcasts.  Polling a
server is vastly more reliable than listening to broadcasts.  Note that a
single component numeric address is not allowed, to avoid ambiguities.  If
more than one name is give, they will be used in a round-robin fashion.
.PP
Constraints:
.IP
.B minerr
must be less than
.B maxerr
which must be less than
.B delay
(or, if a NTP host is not specified
.BR delay / count "),"
and
.B count
must be less than half of
.BR delay .
.IP
In update mode,
.B maxerr
must be less than
.BR prompt.
.PP
Note that none of the above values are closely linked to the limits described
in the NTP protocol (RFC 1305).
.SH USAGE
The simplest use of this program is as an unprivileged command to check the
current time and error in the local clock.  For example:
.IP
.B sntp ntpserver.somewhere
.PP
With suitable privilege, it can be run as a command or in a
.I cron
job to reset the local clock from a reliable server, like the
.I ntpdate
and
.I rdate
commands.  For example:
.IP
.B sntp -a ntpserver.somewhere
.PP
More information on how to use this utility is given in the
.I README
file in the distribution.  In particular, this
.I man
page does not describe how to set it up as a server, which needs special care
to avoid propagating misinformation.
.SH RETURN VALUE
When used as a client in non-daemon mode, the program returns a zero exit
status for success, and a non-zero one otherwise. When used as a daemon
(either client or server), it does not return except after a serious error.
.SH BUGS
The program implements the SNTP protocol, and does not provide all NTP 
facilities.  In particular, it contains no checks against any form of spoofing.
If this is a serious concern, some network security mechanism (like a firewall
or even just
.IR tcpwrappers )
should be installed.
.PP
There are some errors, ambiguities and inconsistencies in the RFCs, and this
code may not interwork with all other NTP implementations.  Any unreasonable
restrictions should be reported as bugs to whoever is responsible.  It may
be difficult to find out who that is.
.PP
The program will stop as soon as it feels that things have got out of control.
In client daemon mode, it will usually fail during an extended period of
network or server inaccessibility or excessively slow performance, or when the
local clock is reset by another process.  It will then need restarting
manually.  Experienced system administrators can write a shell script, a
.I cron
job or put it in
.IR inittab ,
to do this automatically.
.PP
The error cannot be estimated reliably with broadcast packets or for the drift
in daemon mode (even with client-server packets), and the guess made by the
program may be wrong (possibly even very wrong).  If this is a problem, then
setting the
.B \-c
option to a larger value may help.  Or it may not.
.SH AUTHOR
.I sntp
was developed by N.M. Maclaren of the University of Cambridge Computing
Service.
	_END_PROG_MAN_DESCRIP;
