diff options
Diffstat (limited to 'ntpdc')
-rw-r--r-- | ntpdc/Makefile.am | 151 | ||||
-rw-r--r-- | ntpdc/Makefile.in | 1180 | ||||
-rw-r--r-- | ntpdc/README | 6 | ||||
-rw-r--r-- | ntpdc/invoke-ntpdc.menu | 1 | ||||
-rw-r--r-- | ntpdc/invoke-ntpdc.texi | 349 | ||||
-rw-r--r-- | ntpdc/layout.std | 447 | ||||
-rwxr-xr-x | ntpdc/nl.pl | 43 | ||||
-rw-r--r-- | ntpdc/nl.pl.in | 43 | ||||
-rw-r--r-- | ntpdc/nl_in.c | 3 | ||||
-rw-r--r-- | ntpdc/ntpdc-layout.c | 22 | ||||
-rw-r--r-- | ntpdc/ntpdc-opts.c | 1173 | ||||
-rw-r--r-- | ntpdc/ntpdc-opts.def | 812 | ||||
-rw-r--r-- | ntpdc/ntpdc-opts.h | 294 | ||||
-rw-r--r-- | ntpdc/ntpdc.1ntpdcman | 874 | ||||
-rw-r--r-- | ntpdc/ntpdc.1ntpdcmdoc | 809 | ||||
-rw-r--r-- | ntpdc/ntpdc.c | 1934 | ||||
-rw-r--r-- | ntpdc/ntpdc.h | 67 | ||||
-rw-r--r-- | ntpdc/ntpdc.html | 515 | ||||
-rw-r--r-- | ntpdc/ntpdc.man.in | 874 | ||||
-rw-r--r-- | ntpdc/ntpdc.mdoc.in | 809 | ||||
-rw-r--r-- | ntpdc/ntpdc.texi | 88 | ||||
-rw-r--r-- | ntpdc/ntpdc_ops.c | 3142 |
22 files changed, 13636 insertions, 0 deletions
diff --git a/ntpdc/Makefile.am b/ntpdc/Makefile.am new file mode 100644 index 0000000..a61dab9 --- /dev/null +++ b/ntpdc/Makefile.am @@ -0,0 +1,151 @@ +NULL= + +bin_PROGRAMS= $(NTPDC_DB) +libexec_PROGRAMS= $(NTPDC_DL) +sbin_PROGRAMS= $(NTPDC_DS) + +EXTRA_PROGRAMS= ntpdc ntpdc-layout +EXTRA_DATA= check-layout +BUILT_SOURCES= @MAKE_CHECK_LAYOUT@ ntpdc-opts.c ntpdc-opts.h + +AM_CFLAGS = $(CFLAGS_NTP) + +AM_CPPFLAGS = $(NTP_INCS) +AM_CPPFLAGS += $(LIBOPTS_CFLAGS) +AM_CPPFLAGS += $(CPPFLAGS_NTP) + +AM_LDFLAGS = $(LDFLAGS_NTP) + +# LDADD might need RESLIB and ADJLIB +ntpdc_LDADD = version.o $(LIBOPTS_LDADD) +ntpdc_LDADD += ../libntp/libntp.a $(LDADD_LIBNTP) $(LIBM) +ntpdc_LDADD += $(PTHREAD_LIBS) $(EDITLINE_LIBS) +ntpdc_LDADD += $(LDADD_NTP) +# ntpdc-layout doesn't need any additional libraries at all +ntpdc_layout_LDADD= + +DISTCLEANFILES= .version version.c config.log $(man_MANS) +CLEANFILES= check-layout layout.here nl.c ntpdc-layout +noinst_HEADERS= ntpdc.h +ETAGS_ARGS= Makefile.am +EXTRA_DIST= \ + invoke-ntpdc.menu \ + invoke-ntpdc.texi \ + layout.std \ + nl_in.c \ + nl.pl \ + ntpdc-opts.def \ + ntpdc.1ntpdcman \ + ntpdc.1ntpdcmdoc \ + ntpdc.man.in \ + ntpdc.mdoc.in \ + ntpdc.html \ + ntpdc.texi \ + $(NULL) + +man1_MANS= +man8_MANS= +man_MANS= ntpdc.$(NTPDC_MS) + +## HMS: Real Soon Now... +##info_TEXINFOS= ntpdc.texi +##ntpdc_TEXINFOS= ntpdc-opts.texi + +html_DATA= \ + $(srcdir)/ntpdc.html \ + $(NULL) + +noinst_DATA= \ + $(srcdir)/invoke-ntpdc.menu \ + $(srcdir)/invoke-ntpdc.texi \ + $(srcdir)/ntpdc.man.in \ + $(srcdir)/ntpdc.mdoc.in \ + $(NULL) + +install-data-local: install-html + +run_ag= cd $(srcdir) && env PATH="$(abs_builddir):$(PATH)" AUTOGEN_DNE_DATE=-D \ + autogen -L ../sntp/include -L ../sntp/ag-tpl --writable + +std_def_list = \ + $(top_srcdir)/sntp/include/debug-opt.def \ + $(top_srcdir)/sntp/include/autogen-version.def \ + $(top_srcdir)/sntp/include/copyright.def \ + $(top_srcdir)/sntp/include/homerc.def \ + $(top_srcdir)/sntp/include/ntp.lic \ + $(top_srcdir)/sntp/include/version.def \ + $(NULL) + +$(srcdir)/ntpdc-opts.h: $(srcdir)/ntpdc-opts.c + @: do-nothing action to avoid default SCCS get, .h built with .c + +$(srcdir)/ntpdc-opts.c: $(srcdir)/ntpdc-opts.def $(std_def_list) + $(run_ag) ntpdc-opts.def + +### + +$(srcdir)/ntpdc.1ntpdcman: $(srcdir)/ntpdc-opts.def $(std_def_list) + $(run_ag) -DMAN_SECTION=1ntpdcman -Tagman-cmd.tpl ntpdc-opts.def + +$(srcdir)/ntpdc.man.in: $(srcdir)/ntpdc.1ntpdcman $(top_srcdir)/sntp/scripts/mansec2subst.sed + sed -f $(top_srcdir)/sntp/scripts/mansec2subst.sed $(srcdir)/ntpdc.1ntpdcman > $(srcdir)/ntpdc.man.in+ + mv $(srcdir)/ntpdc.man.in+ $(srcdir)/ntpdc.man.in + +### + +$(srcdir)/ntpdc.1ntpdcmdoc: $(srcdir)/ntpdc-opts.def $(std_def_list) + $(run_ag) -DMAN_SECTION=1ntpdcmdoc -Tagmdoc-cmd.tpl ntpdc-opts.def + +$(srcdir)/ntpdc.mdoc.in: $(srcdir)/ntpdc.1ntpdcmdoc $(top_srcdir)/sntp/scripts/mansec2subst.sed + sed -f $(top_srcdir)/sntp/scripts/mansec2subst.sed $(srcdir)/ntpdc.1ntpdcmdoc > $(srcdir)/ntpdc.mdoc.in+ + mv $(srcdir)/ntpdc.mdoc.in+ $(srcdir)/ntpdc.mdoc.in + +### + +ntpdc.$(NTPDC_MS): $(srcdir)/ntpdc.$(MANTAGFMT).in $(top_builddir)/config.status + $(top_builddir)/config.status --file=ntpdc.$(NTPDC_MS)+:$(srcdir)/ntpdc.$(MANTAGFMT).in + mv ntpdc.$(NTPDC_MS)+ ntpdc.$(NTPDC_MS) + +### + +$(srcdir)/invoke-ntpdc.menu: $(srcdir)/invoke-ntpdc.texi + @: do-nothing action to avoid default SCCS get, .menu built with .texi + +$(srcdir)/invoke-ntpdc.texi: $(srcdir)/ntpdc-opts.def $(std_def_list) + $(run_ag) -Tagtexi-cmd.tpl -DLEVEL=section ntpdc-opts.def + $(top_srcdir)/scripts/build/check--help $@ + +$(srcdir)/ntpdc.html: $(srcdir)/invoke-ntpdc.menu $(srcdir)/invoke-ntpdc.texi $(srcdir)/ntpdc.texi $(top_srcdir)/sntp/include/version.texi + cd $(srcdir) && ( makeinfo --force --html --no-split -I ../sntp -o ntpdc.html ntpdc.texi || true ) + +ntpdc_SOURCES = ntpdc.c ntpdc_ops.c ntpdc-opts.c ntpdc-opts.h + +ntpdc-layout.o: nl.c + +layout.here: ntpdc-layout + ./ntpdc-layout > $@ + +check-layout: ntpdc-layout $(srcdir)/layout.std layout.here + cmp $(srcdir)/layout.std layout.here && echo stamp > $@ + +$(PROGRAMS): version.o + +$(top_srcdir)/sntp/scm-rev: + cd ../sntp && $(MAKE) $(AM_MAKEFLAGS) check-scm-rev + +version.c: $(ntpdc_OBJECTS) ../libntp/libntp.a Makefile $(top_srcdir)/sntp/scm-rev + env CSET=`cat $(top_srcdir)/sntp/scm-rev` $(top_builddir)/scripts/build/mkver ntpdc + +version.o: version.c + env CCACHE_DISABLE=1 $(COMPILE) -c version.c -o version.o + +# I ran nl_in.c (attached, to be installed into ntpdc) through +# $(CC) -E nl_in.c | nl.pl > nl.c +nl.c: nl_in.c nl.pl Makefile.am ../config.h ../include/ntp_request.h ntpdc.h + $(CC) -E $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(srcdir)/nl_in.c | ./nl.pl > nl.c + +include $(top_srcdir)/bincheck.mf +include $(top_srcdir)/check-libopts.mf +include $(top_srcdir)/sntp/check-libntp.mf +include $(top_srcdir)/depsver.mf +include $(top_srcdir)/includes.mf diff --git a/ntpdc/Makefile.in b/ntpdc/Makefile.in new file mode 100644 index 0000000..b31604d --- /dev/null +++ b/ntpdc/Makefile.in @@ -0,0 +1,1180 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# we traditionally installed software in bindir, while it should have gone +# in sbindir. Now that we offer a choice, look in the "other" installation +# subdir to warn folks if there is another version there. + + + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +EXTRA_PROGRAMS = ntpdc$(EXEEXT) ntpdc-layout$(EXEEXT) +DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/nl.pl.in \ + $(top_srcdir)/bincheck.mf $(top_srcdir)/check-libopts.mf \ + $(top_srcdir)/depsver.mf $(top_srcdir)/includes.mf \ + $(top_srcdir)/sntp/check-libntp.mf +subdir = ntpdc +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/sntp/libopts/m4/libopts.m4 \ + $(top_srcdir)/sntp/libopts/m4/stdnoreturn.m4 \ + $(top_srcdir)/sntp/libevent/m4/openldap-thread-check.m4 \ + $(top_srcdir)/sntp/libevent/m4/openldap.m4 \ + $(top_srcdir)/sntp/m4/define_dir.m4 \ + $(top_srcdir)/sntp/m4/hms_search_lib.m4 \ + $(top_srcdir)/sntp/m4/libtool.m4 \ + $(top_srcdir)/sntp/m4/ltoptions.m4 \ + $(top_srcdir)/sntp/m4/ltsugar.m4 \ + $(top_srcdir)/sntp/m4/ltversion.m4 \ + $(top_srcdir)/sntp/m4/lt~obsolete.m4 \ + $(top_srcdir)/sntp/m4/ntp_cacheversion.m4 \ + $(top_srcdir)/sntp/m4/ntp_compiler.m4 \ + $(top_srcdir)/sntp/m4/ntp_crosscompile.m4 \ + $(top_srcdir)/sntp/m4/ntp_debug.m4 \ + $(top_srcdir)/sntp/m4/ntp_dir_sep.m4 \ + $(top_srcdir)/sntp/m4/ntp_facilitynames.m4 \ + $(top_srcdir)/sntp/m4/ntp_googletest.m4 \ + $(top_srcdir)/sntp/m4/ntp_ipv6.m4 \ + $(top_srcdir)/sntp/m4/ntp_lib_m.m4 \ + $(top_srcdir)/sntp/m4/ntp_libevent.m4 \ + $(top_srcdir)/sntp/m4/ntp_libntp.m4 \ + $(top_srcdir)/sntp/m4/ntp_lineeditlibs.m4 \ + $(top_srcdir)/sntp/m4/ntp_locinfo.m4 \ + $(top_srcdir)/sntp/m4/ntp_openssl.m4 \ + $(top_srcdir)/sntp/m4/ntp_pkg_config.m4 \ + $(top_srcdir)/sntp/m4/ntp_prog_cc.m4 \ + $(top_srcdir)/sntp/m4/ntp_rlimit.m4 \ + $(top_srcdir)/sntp/m4/ntp_sntp.m4 \ + $(top_srcdir)/sntp/m4/ntp_ver_suffix.m4 \ + $(top_srcdir)/sntp/m4/ntp_vpathhack.m4 \ + $(top_srcdir)/sntp/m4/os_cflags.m4 \ + $(top_srcdir)/sntp/m4/snprintf.m4 \ + $(top_srcdir)/sntp/m4/version.m4 $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = nl.pl +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" \ + "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" \ + "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(htmldir)" +PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS) $(sbin_PROGRAMS) +am_ntpdc_OBJECTS = ntpdc.$(OBJEXT) ntpdc_ops.$(OBJEXT) \ + ntpdc-opts.$(OBJEXT) +ntpdc_OBJECTS = $(am_ntpdc_OBJECTS) +am__DEPENDENCIES_1 = +ntpdc_DEPENDENCIES = version.o $(am__DEPENDENCIES_1) \ + ../libntp/libntp.a $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) +AM_V_lt = $(am__v_lt_$(V)) +am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) +am__v_lt_0 = --silent +ntpdc_layout_SOURCES = ntpdc-layout.c +ntpdc_layout_OBJECTS = ntpdc-layout.$(OBJEXT) +ntpdc_layout_DEPENDENCIES = +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/sntp/libevent/build-aux/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_$(V)) +am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) +am__v_CC_0 = @echo " CC " $@; +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +CCLD = $(CC) +LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_$(V)) +am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CCLD_0 = @echo " CCLD " $@; +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +SOURCES = $(ntpdc_SOURCES) ntpdc-layout.c +DIST_SOURCES = $(ntpdc_SOURCES) ntpdc-layout.c +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +man1dir = $(mandir)/man1 +man8dir = $(mandir)/man8 +NROFF = nroff +MANS = $(man1_MANS) $(man8_MANS) $(man_MANS) +DATA = $(html_DATA) $(noinst_DATA) +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CALC_TICKADJ_DB = @CALC_TICKADJ_DB@ +CALC_TICKADJ_DL = @CALC_TICKADJ_DL@ +CALC_TICKADJ_DS = @CALC_TICKADJ_DS@ +CALC_TICKADJ_MS = @CALC_TICKADJ_MS@ +CALC_TICKADJ_NI = @CALC_TICKADJ_NI@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CFLAGS_NTP = @CFLAGS_NTP@ +CHUTEST = @CHUTEST@ +CONFIG_SHELL = @CONFIG_SHELL@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CPPFLAGS_NTP = @CPPFLAGS_NTP@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DCFD = @DCFD@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EDITLINE_LIBS = @EDITLINE_LIBS@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GREP = @GREP@ +GTEST_CONFIG = @GTEST_CONFIG@ +GTEST_CPPFLAGS = @GTEST_CPPFLAGS@ +GTEST_CXXFLAGS = @GTEST_CXXFLAGS@ +GTEST_LDFLAGS = @GTEST_LDFLAGS@ +GTEST_LIBS = @GTEST_LIBS@ +HAVE_INLINE = @HAVE_INLINE@ +HAVE_RLIMIT_MEMLOCK = @HAVE_RLIMIT_MEMLOCK@ +HAVE_RLIMIT_STACK = @HAVE_RLIMIT_STACK@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDADD_LIBNTP = @LDADD_LIBNTP@ +LDADD_NLIST = @LDADD_NLIST@ +LDADD_NTP = @LDADD_NTP@ +LDFLAGS = @LDFLAGS@ +LDFLAGS_NTP = @LDFLAGS_NTP@ +LIBISC_PTHREADS_NOTHREADS = @LIBISC_PTHREADS_NOTHREADS@ +LIBM = @LIBM@ +LIBOBJS = @LIBOBJS@ +LIBOPTS_CFLAGS = @LIBOPTS_CFLAGS@ +LIBOPTS_DIR = @LIBOPTS_DIR@ +LIBOPTS_LDADD = @LIBOPTS_LDADD@ +LIBPARSE = @LIBPARSE@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIBTOOL_DEPS = @LIBTOOL_DEPS@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LSCF = @LSCF@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MAKE_ADJTIMED = @MAKE_ADJTIMED@ +MAKE_CHECK_LAYOUT = @MAKE_CHECK_LAYOUT@ +MAKE_CHECK_Y2K = @MAKE_CHECK_Y2K@ +MAKE_LIBNTPSIM = @MAKE_LIBNTPSIM@ +MAKE_LIBPARSE = @MAKE_LIBPARSE@ +MAKE_LIBPARSE_KERNEL = @MAKE_LIBPARSE_KERNEL@ +MAKE_NTPDSIM = @MAKE_NTPDSIM@ +MAKE_NTPSNMPD = @MAKE_NTPSNMPD@ +MAKE_NTPTIME = @MAKE_NTPTIME@ +MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@ +MAKE_TICKADJ = @MAKE_TICKADJ@ +MAKE_TIMETRIM = @MAKE_TIMETRIM@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MANTAGFMT = @MANTAGFMT@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +NTPDATE_DB = @NTPDATE_DB@ +NTPDATE_DL = @NTPDATE_DL@ +NTPDATE_DS = @NTPDATE_DS@ +NTPDATE_MS = @NTPDATE_MS@ +NTPDATE_NI = @NTPDATE_NI@ +NTPDC_DB = @NTPDC_DB@ +NTPDC_DL = @NTPDC_DL@ +NTPDC_DS = @NTPDC_DS@ +NTPDC_MS = @NTPDC_MS@ +NTPDC_NI = @NTPDC_NI@ +NTPDSIM_DB = @NTPDSIM_DB@ +NTPDSIM_DL = @NTPDSIM_DL@ +NTPDSIM_DS = @NTPDSIM_DS@ +NTPDSIM_MS = @NTPDSIM_MS@ +NTPDSIM_NI = @NTPDSIM_NI@ +NTPD_DB = @NTPD_DB@ +NTPD_DL = @NTPD_DL@ +NTPD_DS = @NTPD_DS@ +NTPD_MS = @NTPD_MS@ +NTPD_NI = @NTPD_NI@ +NTPQ_DB = @NTPQ_DB@ +NTPQ_DL = @NTPQ_DL@ +NTPQ_DS = @NTPQ_DS@ +NTPQ_MS = @NTPQ_MS@ +NTPQ_NI = @NTPQ_NI@ +NTPSNMPD_DB = @NTPSNMPD_DB@ +NTPSNMPD_DL = @NTPSNMPD_DL@ +NTPSNMPD_DS = @NTPSNMPD_DS@ +NTPSNMPD_MS = @NTPSNMPD_MS@ +NTPSNMPD_NI = @NTPSNMPD_NI@ +NTPSWEEP_DB = @NTPSWEEP_DB@ +NTPSWEEP_DL = @NTPSWEEP_DL@ +NTPSWEEP_DS = @NTPSWEEP_DS@ +NTPSWEEP_MS = @NTPSWEEP_MS@ +NTPSWEEP_NI = @NTPSWEEP_NI@ +NTPTIME_DB = @NTPTIME_DB@ +NTPTIME_DL = @NTPTIME_DL@ +NTPTIME_DS = @NTPTIME_DS@ +NTPTIME_MS = @NTPTIME_MS@ +NTPTIME_NI = @NTPTIME_NI@ +NTPTRACE_DB = @NTPTRACE_DB@ +NTPTRACE_DL = @NTPTRACE_DL@ +NTPTRACE_DS = @NTPTRACE_DS@ +NTPTRACE_MS = @NTPTRACE_MS@ +NTPTRACE_NI = @NTPTRACE_NI@ +NTP_KEYGEN_DB = @NTP_KEYGEN_DB@ +NTP_KEYGEN_DL = @NTP_KEYGEN_DL@ +NTP_KEYGEN_DS = @NTP_KEYGEN_DS@ +NTP_KEYGEN_MS = @NTP_KEYGEN_MS@ +NTP_KEYGEN_NI = @NTP_KEYGEN_NI@ +NTP_KEYSDIR = @NTP_KEYSDIR@ +NTP_WAIT_DB = @NTP_WAIT_DB@ +NTP_WAIT_DL = @NTP_WAIT_DL@ +NTP_WAIT_DS = @NTP_WAIT_DS@ +NTP_WAIT_MS = @NTP_WAIT_MS@ +NTP_WAIT_NI = @NTP_WAIT_NI@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_NET_SNMP_CONFIG = @PATH_NET_SNMP_CONFIG@ +PATH_PERL = @PATH_PERL@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PATH_TEST = @PATH_TEST@ +PERLLIBDIR = @PERLLIBDIR@ +PKG_CONFIG = @PKG_CONFIG@ +POSIX_SHELL = @POSIX_SHELL@ +PROPDELAY = @PROPDELAY@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +SNMP_CFLAGS = @SNMP_CFLAGS@ +SNMP_CPPFLAGS = @SNMP_CPPFLAGS@ +SNMP_LIBS = @SNMP_LIBS@ +SNTP = @SNTP@ +SNTP_DB = @SNTP_DB@ +SNTP_DL = @SNTP_DL@ +SNTP_DS = @SNTP_DS@ +SNTP_MS = @SNTP_MS@ +SNTP_NI = @SNTP_NI@ +STDNORETURN_H = @STDNORETURN_H@ +STRIP = @STRIP@ +TESTDCF = @TESTDCF@ +TICKADJ_DB = @TICKADJ_DB@ +TICKADJ_DL = @TICKADJ_DL@ +TICKADJ_DS = @TICKADJ_DS@ +TICKADJ_MS = @TICKADJ_MS@ +TICKADJ_NI = @TICKADJ_NI@ +TIMETRIM_DB = @TIMETRIM_DB@ +TIMETRIM_DL = @TIMETRIM_DL@ +TIMETRIM_DS = @TIMETRIM_DS@ +TIMETRIM_MS = @TIMETRIM_MS@ +TIMETRIM_NI = @TIMETRIM_NI@ +VERSION = @VERSION@ +VER_SUFFIX = @VER_SUFFIX@ +YACC = @YACC@ +YFLAGS = @YFLAGS@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +subdirs = @subdirs@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +NULL = +bin_PROGRAMS = $(NTPDC_DB) +libexec_PROGRAMS = $(NTPDC_DL) +sbin_PROGRAMS = $(NTPDC_DS) +EXTRA_DATA = check-layout +BUILT_SOURCES = @MAKE_CHECK_LAYOUT@ ntpdc-opts.c ntpdc-opts.h \ + check-libopts check-libntp .deps-ver +AM_CFLAGS = $(CFLAGS_NTP) +AM_CPPFLAGS = $(NTP_INCS) $(LIBOPTS_CFLAGS) $(CPPFLAGS_NTP) +AM_LDFLAGS = $(LDFLAGS_NTP) + +# LDADD might need RESLIB and ADJLIB +ntpdc_LDADD = version.o $(LIBOPTS_LDADD) ../libntp/libntp.a \ + $(LDADD_LIBNTP) $(LIBM) $(PTHREAD_LIBS) $(EDITLINE_LIBS) \ + $(LDADD_NTP) +# ntpdc-layout doesn't need any additional libraries at all +ntpdc_layout_LDADD = +DISTCLEANFILES = .version version.c config.log $(man_MANS) +CLEANFILES = check-layout layout.here nl.c ntpdc-layout check-libopts \ + check-libntp .deps-ver +noinst_HEADERS = ntpdc.h +ETAGS_ARGS = Makefile.am +EXTRA_DIST = \ + invoke-ntpdc.menu \ + invoke-ntpdc.texi \ + layout.std \ + nl_in.c \ + nl.pl \ + ntpdc-opts.def \ + ntpdc.1ntpdcman \ + ntpdc.1ntpdcmdoc \ + ntpdc.man.in \ + ntpdc.mdoc.in \ + ntpdc.html \ + ntpdc.texi \ + $(NULL) + +man1_MANS = +man8_MANS = +man_MANS = ntpdc.$(NTPDC_MS) +html_DATA = \ + $(srcdir)/ntpdc.html \ + $(NULL) + +noinst_DATA = \ + $(srcdir)/invoke-ntpdc.menu \ + $(srcdir)/invoke-ntpdc.texi \ + $(srcdir)/ntpdc.man.in \ + $(srcdir)/ntpdc.mdoc.in \ + $(NULL) + +run_ag = cd $(srcdir) && env PATH="$(abs_builddir):$(PATH)" AUTOGEN_DNE_DATE=-D \ + autogen -L ../sntp/include -L ../sntp/ag-tpl --writable + +std_def_list = \ + $(top_srcdir)/sntp/include/debug-opt.def \ + $(top_srcdir)/sntp/include/autogen-version.def \ + $(top_srcdir)/sntp/include/copyright.def \ + $(top_srcdir)/sntp/include/homerc.def \ + $(top_srcdir)/sntp/include/ntp.lic \ + $(top_srcdir)/sntp/include/version.def \ + $(NULL) + +ntpdc_SOURCES = ntpdc.c ntpdc_ops.c ntpdc-opts.c ntpdc-opts.h +NTP_INCS = -I$(top_srcdir)/include -I$(top_srcdir)/lib/isc/include \ + -I$(top_srcdir)/lib/isc/$(LIBISC_PTHREADS_NOTHREADS)/include \ + -I$(top_srcdir)/lib/isc/unix/include +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/bincheck.mf $(top_srcdir)/check-libopts.mf $(top_srcdir)/sntp/check-libntp.mf $(top_srcdir)/depsver.mf $(top_srcdir)/includes.mf $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign ntpdc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign ntpdc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +nl.pl: $(top_builddir)/config.status $(srcdir)/nl.pl.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +install-libexecPROGRAMS: $(libexec_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(libexecdir)" || $(MKDIR_P) "$(DESTDIR)$(libexecdir)" + @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(libexecdir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(libexecdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-libexecPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(libexecdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(libexecdir)" && rm -f $$files + +clean-libexecPROGRAMS: + @list='$(libexec_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +install-sbinPROGRAMS: $(sbin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(sbindir)" || $(MKDIR_P) "$(DESTDIR)$(sbindir)" + @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p || test -f $$p1; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-sbinPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(sbindir)" && rm -f $$files + +clean-sbinPROGRAMS: + @list='$(sbin_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +ntpdc$(EXEEXT): $(ntpdc_OBJECTS) $(ntpdc_DEPENDENCIES) + @rm -f ntpdc$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(ntpdc_OBJECTS) $(ntpdc_LDADD) $(LIBS) +ntpdc-layout$(EXEEXT): $(ntpdc_layout_OBJECTS) $(ntpdc_layout_DEPENDENCIES) + @rm -f ntpdc-layout$(EXEEXT) + $(AM_V_CCLD)$(LINK) $(ntpdc_layout_OBJECTS) $(ntpdc_layout_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntpdc-layout.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntpdc-opts.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntpdc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntpdc_ops.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-man1: $(man1_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" + @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(man1_MANS)'; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } +install-man8: $(man8_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man8dir)" || $(MKDIR_P) "$(DESTDIR)$(man8dir)" + @list='$(man8_MANS)'; test -n "$(man8dir)" || exit 0; \ + { for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.8[a-z]*$$/p'; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ + done; } + +uninstall-man8: + @$(NORMAL_UNINSTALL) + @list='$(man8_MANS)'; test -n "$(man8dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.8[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + test -z "$$files" || { \ + echo " ( cd '$(DESTDIR)$(man8dir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(man8dir)" && rm -f $$files; } +install-htmlDATA: $(html_DATA) + @$(NORMAL_INSTALL) + test -z "$(htmldir)" || $(MKDIR_P) "$(DESTDIR)$(htmldir)" + @list='$(html_DATA)'; test -n "$(htmldir)" || list=; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ + done + +uninstall-htmlDATA: + @$(NORMAL_UNINSTALL) + @list='$(html_DATA)'; test -n "$(htmldir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + test -n "$$files" || exit 0; \ + echo " ( cd '$(DESTDIR)$(htmldir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(htmldir)" && rm -f $$files + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @list='$(MANS)'; if test -n "$$list"; then \ + list=`for p in $$list; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ + if test -n "$$list" && \ + grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ + echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ + grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ + echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ + echo " typically \`make maintainer-clean' will remove them" >&2; \ + exit 1; \ + else :; fi; \ + else :; fi + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(PROGRAMS) $(MANS) $(DATA) $(HEADERS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(htmldir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libexecPROGRAMS \ + clean-libtool clean-sbinPROGRAMS mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-data-local install-htmlDATA install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS install-libexecPROGRAMS \ + install-sbinPROGRAMS + @$(NORMAL_INSTALL) + $(MAKE) $(AM_MAKEFLAGS) install-exec-hook +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 install-man8 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-htmlDATA \ + uninstall-libexecPROGRAMS uninstall-man uninstall-sbinPROGRAMS + +uninstall-man: uninstall-man1 uninstall-man8 + +.MAKE: all check install install-am install-exec-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libexecPROGRAMS clean-libtool \ + clean-sbinPROGRAMS ctags distclean distclean-compile \ + distclean-generic distclean-libtool distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-binPROGRAMS install-data install-data-am \ + install-data-local install-dvi install-dvi-am install-exec \ + install-exec-am install-exec-hook install-html install-html-am \ + install-htmlDATA install-info install-info-am \ + install-libexecPROGRAMS install-man install-man1 install-man8 \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-sbinPROGRAMS install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-htmlDATA uninstall-libexecPROGRAMS uninstall-man \ + uninstall-man1 uninstall-man8 uninstall-sbinPROGRAMS + + +install-data-local: install-html + +$(srcdir)/ntpdc-opts.h: $(srcdir)/ntpdc-opts.c + @: do-nothing action to avoid default SCCS get, .h built with .c + +$(srcdir)/ntpdc-opts.c: $(srcdir)/ntpdc-opts.def $(std_def_list) + $(run_ag) ntpdc-opts.def + +### + +$(srcdir)/ntpdc.1ntpdcman: $(srcdir)/ntpdc-opts.def $(std_def_list) + $(run_ag) -DMAN_SECTION=1ntpdcman -Tagman-cmd.tpl ntpdc-opts.def + +$(srcdir)/ntpdc.man.in: $(srcdir)/ntpdc.1ntpdcman $(top_srcdir)/sntp/scripts/mansec2subst.sed + sed -f $(top_srcdir)/sntp/scripts/mansec2subst.sed $(srcdir)/ntpdc.1ntpdcman > $(srcdir)/ntpdc.man.in+ + mv $(srcdir)/ntpdc.man.in+ $(srcdir)/ntpdc.man.in + +### + +$(srcdir)/ntpdc.1ntpdcmdoc: $(srcdir)/ntpdc-opts.def $(std_def_list) + $(run_ag) -DMAN_SECTION=1ntpdcmdoc -Tagmdoc-cmd.tpl ntpdc-opts.def + +$(srcdir)/ntpdc.mdoc.in: $(srcdir)/ntpdc.1ntpdcmdoc $(top_srcdir)/sntp/scripts/mansec2subst.sed + sed -f $(top_srcdir)/sntp/scripts/mansec2subst.sed $(srcdir)/ntpdc.1ntpdcmdoc > $(srcdir)/ntpdc.mdoc.in+ + mv $(srcdir)/ntpdc.mdoc.in+ $(srcdir)/ntpdc.mdoc.in + +### + +ntpdc.$(NTPDC_MS): $(srcdir)/ntpdc.$(MANTAGFMT).in $(top_builddir)/config.status + $(top_builddir)/config.status --file=ntpdc.$(NTPDC_MS)+:$(srcdir)/ntpdc.$(MANTAGFMT).in + mv ntpdc.$(NTPDC_MS)+ ntpdc.$(NTPDC_MS) + +### + +$(srcdir)/invoke-ntpdc.menu: $(srcdir)/invoke-ntpdc.texi + @: do-nothing action to avoid default SCCS get, .menu built with .texi + +$(srcdir)/invoke-ntpdc.texi: $(srcdir)/ntpdc-opts.def $(std_def_list) + $(run_ag) -Tagtexi-cmd.tpl -DLEVEL=section ntpdc-opts.def + $(top_srcdir)/scripts/build/check--help $@ + +$(srcdir)/ntpdc.html: $(srcdir)/invoke-ntpdc.menu $(srcdir)/invoke-ntpdc.texi $(srcdir)/ntpdc.texi $(top_srcdir)/sntp/include/version.texi + cd $(srcdir) && ( makeinfo --force --html --no-split -I ../sntp -o ntpdc.html ntpdc.texi || true ) + +ntpdc-layout.o: nl.c + +layout.here: ntpdc-layout + ./ntpdc-layout > $@ + +check-layout: ntpdc-layout $(srcdir)/layout.std layout.here + cmp $(srcdir)/layout.std layout.here && echo stamp > $@ + +$(PROGRAMS): version.o + +$(top_srcdir)/sntp/scm-rev: + cd ../sntp && $(MAKE) $(AM_MAKEFLAGS) check-scm-rev + +version.c: $(ntpdc_OBJECTS) ../libntp/libntp.a Makefile $(top_srcdir)/sntp/scm-rev + env CSET=`cat $(top_srcdir)/sntp/scm-rev` $(top_builddir)/scripts/build/mkver ntpdc + +version.o: version.c + env CCACHE_DISABLE=1 $(COMPILE) -c version.c -o version.o + +# I ran nl_in.c (attached, to be installed into ntpdc) through +# $(CC) -E nl_in.c | nl.pl > nl.c +nl.c: nl_in.c nl.pl Makefile.am ../config.h ../include/ntp_request.h ntpdc.h + $(CC) -E $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(srcdir)/nl_in.c | ./nl.pl > nl.c + +install-exec-hook: + @test -z "${bin_PROGRAMS}${bin_SCRIPTS}" \ + || for i in ${bin_PROGRAMS} ${bin_SCRIPTS} " "; do \ + test ! -f ${sbindir}/$$i \ + || echo "*** $$i is also in ${sbindir}!"; \ + done + @test -z "${sbin_PROGRAMS}${asbin_SCRIPTS}" \ + || for i in ${sbin_PROGRAMS} ${sbin_SCRIPTS} " "; do \ + test ! -f ${bindir}/$$i \ + || echo "*** $$i is also in ${bindir}!"; \ + done + +# + +check-libopts: ../sntp/libopts/libopts.la + @echo stamp > $@ + +../sntp/libopts/libopts.la: + -cd ../sntp/libopts && $(MAKE) $(AM_MAKEFLAGS) libopts.la + +check-libntp: ../libntp/libntp.a + @echo stamp > $@ + +../libntp/libntp.a: + cd ../libntp && $(MAKE) $(AM_MAKEFLAGS) libntp.a +$(DEPDIR)/deps-ver: $(top_srcdir)/deps-ver + @[ -f $@ ] || \ + cp $(top_srcdir)/deps-ver $@ + @[ -w $@ ] || \ + chmod ug+w $@ + @cmp $(top_srcdir)/deps-ver $@ > /dev/null || ( \ + $(MAKE) $(AM_MAKEFLAGS) clean && \ + echo -n "Prior $(subdir)/$(DEPDIR) version " && \ + cat $@ && \ + rm -rf $(DEPDIR) && \ + mkdir $(DEPDIR) && \ + case "$(top_builddir)" in \ + .) \ + ./config.status Makefile depfiles \ + ;; \ + *) \ + cd "$(top_builddir)" && \ + ./config.status $(subdir)/Makefile depfiles && \ + cd $(subdir) \ + ;; \ + esac && \ + echo -n "Cleaned $(subdir)/$(DEPDIR) version " && \ + cat $(top_srcdir)/deps-ver \ + ) + cp $(top_srcdir)/deps-ver $@ + +.deps-ver: $(top_srcdir)/deps-ver + @[ ! -d $(DEPDIR) ] || $(MAKE) $(AM_MAKEFLAGS) $(DEPDIR)/deps-ver + @touch $@ + +# +# depsver.mf included in Makefile.am for directories with .deps +# +# When building in the same directory with sources that change over +# time, such as when tracking using bk, the .deps files can become +# stale with respect to moved, deleted, or superceded headers. Most +# commonly, this would exhibit as make reporting a failure to make a +# header file which is no longer in the location given. To address +# this issue, we use a deps-ver file which is updated with each change +# that breaks old .deps files. A copy of deps-ver is made into +# $(DEPDIR) if not already present. If $(DEPDIR)/deps-ver is present +# with different contents than deps-ver, we make clean to ensure all +# .o files built before the incompatible change are rebuilt along with +# their updated .deps files, then remove $(DEPDIR) and recreate it as +# empty stubs. +# +# It is normal when configured with --disable-dependency-tracking for +# the DEPDIR to not have been created. For this reason, we use the +# intermediate target .deps-ver, which invokes make recursively if +# DEPDIR exists. +# +# If you modify depsver.mf, please make the changes to the master +# copy, the one in sntp is copied by the bootstrap script from it. +# +# This comment block follows rather than leads the related code so that +# it stays with it in the generated Makefile.in and Makefile. +# + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/ntpdc/README b/ntpdc/README new file mode 100644 index 0000000..618e846 --- /dev/null +++ b/ntpdc/README @@ -0,0 +1,6 @@ +README file for directory ./xntpdc of the NTP Version 4 distribution + +This directory contains the sources for the xntpdc utility program. See +the README and RELNOTES files in the parent directory for directions on +how to make and install this program. The current version number of this +program is in the version.c file. diff --git a/ntpdc/invoke-ntpdc.menu b/ntpdc/invoke-ntpdc.menu new file mode 100644 index 0000000..42ca3b4 --- /dev/null +++ b/ntpdc/invoke-ntpdc.menu @@ -0,0 +1 @@ +* ntpdc Invocation:: Invoking ntpdc diff --git a/ntpdc/invoke-ntpdc.texi b/ntpdc/invoke-ntpdc.texi new file mode 100644 index 0000000..57c73e5 --- /dev/null +++ b/ntpdc/invoke-ntpdc.texi @@ -0,0 +1,349 @@ +@node ntpdc Invocation +@section Invoking ntpdc +@pindex ntpdc +@cindex vendor-specific NTPD control program +@ignore +# +# EDIT THIS FILE WITH CAUTION (invoke-ntpdc.texi) +# +# It has been AutoGen-ed December 2, 2014 at 08:57:32 AM by AutoGen 5.18.5pre4 +# From the definitions ntpdc-opts.def +# and the template file agtexi-cmd.tpl +@end ignore + + + +@code{ntpdc} +is deprecated. +Please use +@code{ntpq(1ntpqmdoc)} instead - it can do everything +@code{ntpdc} +used to do, and it does so using a much more sane interface. + +@code{ntpdc} +is a utility program used to query +@code{ntpd(1ntpdmdoc)} +about its +current state and to request changes in that state. +It uses NTP mode 7 control message formats described in the source code. +The program may +be run either in interactive mode or controlled using command line +arguments. +Extensive state and statistics information is available +through the +@code{ntpdc} +interface. +In addition, nearly all the +configuration options which can be specified at startup using +ntpd's configuration file may also be specified at run time using +@code{ntpdc} + +This section was generated by @strong{AutoGen}, +using the @code{agtexi-cmd} template and the option descriptions for the @code{ntpdc} program. +This software is released under the NTP license, <http://ntp.org/license>. + +@menu +* ntpdc usage:: ntpdc help/usage (@option{--help}) +* ntpdc ipv4:: ipv4 option (-4) +* ntpdc ipv6:: ipv6 option (-6) +* ntpdc command:: command option (-c) +* ntpdc interactive:: interactive option (-i) +* ntpdc listpeers:: listpeers option (-l) +* ntpdc numeric:: numeric option (-n) +* ntpdc peers:: peers option (-p) +* ntpdc showpeers:: showpeers option (-s) +* ntpdc config:: presetting/configuring ntpdc +* ntpdc exit status:: exit status +* ntpdc Usage:: Usage +* ntpdc See Also:: See Also +* ntpdc Authors:: Authors +* ntpdc Bugs:: Bugs +@end menu + +@node ntpdc usage +@subsection ntpdc help/usage (@option{--help}) +@cindex ntpdc help + +This is the automatically generated usage text for ntpdc. + +The text printed is the same whether selected with the @code{help} option +(@option{--help}) or the @code{more-help} option (@option{--more-help}). @code{more-help} will print +the usage text by passing it through a pager program. +@code{more-help} is disabled on platforms without a working +@code{fork(2)} function. The @code{PAGER} environment variable is +used to select the program, defaulting to @file{more}. Both will exit +with a status code of 0. + +@exampleindent 0 +@example +ntpdc - vendor-specific NTPD control program - Ver. 4.2.7p482 +Usage: ntpdc [ -<flag> [<val>] | --<name>[@{=| @}<val>] ]... [ host ...] + Flg Arg Option-Name Description + -4 no ipv4 Force IPv4 DNS name resolution + - prohibits the option 'ipv6' + -6 no ipv6 Force IPv6 DNS name resolution + - prohibits the option 'ipv4' + -c Str command run a command and exit + - may appear multiple times + -d no debug-level Increase debug verbosity level + - may appear multiple times + -D Num set-debug-level Set the debug verbosity level + - may appear multiple times + -i no interactive Force ntpq to operate in interactive mode + - prohibits these options: + command + listpeers + peers + showpeers + -l no listpeers Print a list of the peers + - prohibits the option 'command' + -n no numeric numeric host addresses + -p no peers Print a list of the peers + - prohibits the option 'command' + -s no showpeers Show a list of the peers + - prohibits the option 'command' + opt version output version information and exit + -? no help display extended usage information and exit + -! no more-help extended usage information passed thru pager + -> opt save-opts save the option state to a config file + -< Str load-opts load options from a config file + - disabled as '--no-load-opts' + - may appear multiple times + +Options are specified by doubled hyphens and their name or by a single +hyphen and the flag character. + + +The following option preset mechanisms are supported: + - reading file $HOME/.ntprc + - reading file ./.ntprc + - examining environment variables named NTPDC_* + +Please send bug reports to: <http://bugs.ntp.org, bugs@@ntp.org> +@end example +@exampleindent 4 + +@node ntpdc ipv4 +@subsection ipv4 option (-4) +@cindex ntpdc-ipv4 + +This is the ``force ipv4 dns name resolution'' option. + +@noindent +This option has some usage constraints. It: +@itemize @bullet +@item +must not appear in combination with any of the following options: +ipv6. +@end itemize + +Force DNS resolution of following host names on the command line +to the IPv4 namespace. +@node ntpdc ipv6 +@subsection ipv6 option (-6) +@cindex ntpdc-ipv6 + +This is the ``force ipv6 dns name resolution'' option. + +@noindent +This option has some usage constraints. It: +@itemize @bullet +@item +must not appear in combination with any of the following options: +ipv4. +@end itemize + +Force DNS resolution of following host names on the command line +to the IPv6 namespace. +@node ntpdc command +@subsection command option (-c) +@cindex ntpdc-command + +This is the ``run a command and exit'' option. +This option takes a string argument @file{cmd}. + +@noindent +This option has some usage constraints. It: +@itemize @bullet +@item +may appear an unlimited number of times. +@end itemize + +The following argument is interpreted as an interactive format command +and is added to the list of commands to be executed on the specified +host(s). +@node ntpdc interactive +@subsection interactive option (-i) +@cindex ntpdc-interactive + +This is the ``force ntpq to operate in interactive mode'' option. + +@noindent +This option has some usage constraints. It: +@itemize @bullet +@item +must not appear in combination with any of the following options: +command, listpeers, peers, showpeers. +@end itemize + +Force ntpq to operate in interactive mode. Prompts will be written +to the standard output and commands read from the standard input. +@node ntpdc listpeers +@subsection listpeers option (-l) +@cindex ntpdc-listpeers + +This is the ``print a list of the peers'' option. + +@noindent +This option has some usage constraints. It: +@itemize @bullet +@item +must not appear in combination with any of the following options: +command. +@end itemize + +Print a list of the peers known to the server as well as a summary of +their state. This is equivalent to the 'listpeers' interactive command. +@node ntpdc numeric +@subsection numeric option (-n) +@cindex ntpdc-numeric + +This is the ``numeric host addresses'' option. +Output all host addresses in dotted-quad numeric format rather than +converting to the canonical host names. +@node ntpdc peers +@subsection peers option (-p) +@cindex ntpdc-peers + +This is the ``print a list of the peers'' option. + +@noindent +This option has some usage constraints. It: +@itemize @bullet +@item +must not appear in combination with any of the following options: +command. +@end itemize + +Print a list of the peers known to the server as well as a summary +of their state. This is equivalent to the 'peers' interactive command. +@node ntpdc showpeers +@subsection showpeers option (-s) +@cindex ntpdc-showpeers + +This is the ``show a list of the peers'' option. + +@noindent +This option has some usage constraints. It: +@itemize @bullet +@item +must not appear in combination with any of the following options: +command. +@end itemize + +Print a list of the peers known to the server as well as a summary +of their state. This is equivalent to the 'dmpeers' interactive command. + + +@node ntpdc config +@subsection presetting/configuring ntpdc + +Any option that is not marked as @i{not presettable} may be preset by +loading values from configuration ("rc" or "ini") files, and values from environment variables named @code{NTPDC} and @code{NTPDC_<OPTION_NAME>}. @code{<OPTION_NAME>} must be one of +the options listed above in upper case and segmented with underscores. +The @code{NTPDC} variable will be tokenized and parsed like +the command line. The remaining variables are tested for existence and their +values are treated like option arguments. + + +@noindent +@code{libopts} will search in 2 places for configuration files: +@itemize @bullet +@item +$HOME +@item +$PWD +@end itemize +The environment variables @code{HOME}, and @code{PWD} +are expanded and replaced when @file{ntpdc} runs. +For any of these that are plain files, they are simply processed. +For any that are directories, then a file named @file{.ntprc} is searched for +within that directory and processed. + +Configuration files may be in a wide variety of formats. +The basic format is an option name followed by a value (argument) on the +same line. Values may be separated from the option name with a colon, +equal sign or simply white space. Values may be continued across multiple +lines by escaping the newline with a backslash. + +Multiple programs may also share the same initialization file. +Common options are collected at the top, followed by program specific +segments. The segments are separated by lines like: +@example +[NTPDC] +@end example +@noindent +or by +@example +<?program ntpdc> +@end example +@noindent +Do not mix these styles within one configuration file. + +Compound values and carefully constructed string values may also be +specified using XML syntax: +@example +<option-name> + <sub-opt>...<...>...</sub-opt> +</option-name> +@end example +@noindent +yielding an @code{option-name.sub-opt} string value of +@example +"...<...>..." +@end example +@code{AutoOpts} does not track suboptions. You simply note that it is a +hierarchicly valued option. @code{AutoOpts} does provide a means for searching +the associated name/value pair list (see: optionFindValue). + +The command line options relating to configuration and/or usage help are: + +@subsubheading version (-) + +Print the program version to standard out, optionally with licensing +information, then exit 0. The optional argument specifies how much licensing +detail to provide. The default is to print just the version. The licensing infomation may be selected with an option argument. +Only the first letter of the argument is examined: + +@table @samp +@item version +Only print the version. This is the default. +@item copyright +Name the copyright usage licensing terms. +@item verbose +Print the full copyright usage licensing terms. +@end table + +@node ntpdc exit status +@subsection ntpdc exit status + +One of the following exit values will be returned: +@table @samp +@item 0 (EXIT_SUCCESS) +Successful program execution. +@item 1 (EXIT_FAILURE) +The operation failed or the command syntax was not valid. +@item 66 (EX_NOINPUT) +A specified configuration file could not be loaded. +@item 70 (EX_SOFTWARE) +libopts had an internal operational error. Please report +it to autogen-users@@lists.sourceforge.net. Thank you. +@end table +@node ntpdc Usage +@subsection ntpdc Usage +@node ntpdc See Also +@subsection ntpdc See Also +@node ntpdc Authors +@subsection ntpdc Authors +@node ntpdc Bugs +@subsection ntpdc Bugs diff --git a/ntpdc/layout.std b/ntpdc/layout.std new file mode 100644 index 0000000..6117f52 --- /dev/null +++ b/ntpdc/layout.std @@ -0,0 +1,447 @@ +sizeof(union req_data_u_tag) = 176 +offsetof(u32) = 0 +offsetof(data) = 0 + +sizeof(struct req_pkt) = 216 +offsetof(rm_vn_mode) = 0 +offsetof(auth_seq) = 1 +offsetof(implementation) = 2 +offsetof(request) = 3 +offsetof(err_nitems) = 4 +offsetof(mbz_itemsize) = 6 +offsetof(u) = 8 +offsetof(tstamp) = 184 +offsetof(keyid) = 192 +offsetof(mac) = 196 + +sizeof(struct req_pkt_tail) = 32 +offsetof(tstamp) = 0 +offsetof(keyid) = 8 +offsetof(mac) = 12 + +sizeof(union resp_pkt_u_tag) = 500 +offsetof(data) = 0 +offsetof(u32) = 0 + +sizeof(struct resp_pkt) = 508 +offsetof(rm_vn_mode) = 0 +offsetof(auth_seq) = 1 +offsetof(implementation) = 2 +offsetof(request) = 3 +offsetof(err_nitems) = 4 +offsetof(mbz_itemsize) = 6 +offsetof(u) = 8 + +sizeof(struct info_peer_list) = 32 +offsetof(addr) = 0 +offsetof(port) = 4 +offsetof(hmode) = 6 +offsetof(flags) = 7 +offsetof(v6_flag) = 8 +offsetof(unused1) = 12 +offsetof(addr6) = 16 + +sizeof(struct info_peer_summary) = 72 +offsetof(dstadr) = 0 +offsetof(srcadr) = 4 +offsetof(srcport) = 8 +offsetof(stratum) = 10 +offsetof(hpoll) = 11 +offsetof(ppoll) = 12 +offsetof(reach) = 13 +offsetof(flags) = 14 +offsetof(hmode) = 15 +offsetof(delay) = 16 +offsetof(offset) = 20 +offsetof(dispersion) = 28 +offsetof(v6_flag) = 32 +offsetof(unused1) = 36 +offsetof(dstadr6) = 40 +offsetof(srcadr6) = 56 + +sizeof(struct info_peer) = 280 +offsetof(dstadr) = 0 +offsetof(srcadr) = 4 +offsetof(srcport) = 8 +offsetof(flags) = 10 +offsetof(leap) = 11 +offsetof(hmode) = 12 +offsetof(pmode) = 13 +offsetof(stratum) = 14 +offsetof(ppoll) = 15 +offsetof(hpoll) = 16 +offsetof(precision) = 17 +offsetof(version) = 18 +offsetof(unused8) = 19 +offsetof(reach) = 20 +offsetof(unreach) = 21 +offsetof(flash) = 22 +offsetof(ttl) = 23 +offsetof(flash2) = 24 +offsetof(associd) = 26 +offsetof(keyid) = 28 +offsetof(pkeyid) = 32 +offsetof(refid) = 36 +offsetof(timer) = 40 +offsetof(rootdelay) = 44 +offsetof(rootdispersion) = 48 +offsetof(reftime) = 52 +offsetof(org) = 60 +offsetof(rec) = 68 +offsetof(xmt) = 76 +offsetof(filtdelay) = 84 +offsetof(filtoffset) = 116 +offsetof(order) = 180 +offsetof(delay) = 188 +offsetof(dispersion) = 192 +offsetof(offset) = 196 +offsetof(selectdisp) = 204 +offsetof(unused1) = 208 +offsetof(unused2) = 212 +offsetof(unused3) = 216 +offsetof(unused4) = 220 +offsetof(unused5) = 224 +offsetof(unused6) = 228 +offsetof(unused7) = 232 +offsetof(estbdelay) = 236 +offsetof(v6_flag) = 240 +offsetof(unused9) = 244 +offsetof(dstadr6) = 248 +offsetof(srcadr6) = 264 + +sizeof(struct info_peer_stats) = 120 +offsetof(dstadr) = 0 +offsetof(srcadr) = 4 +offsetof(srcport) = 8 +offsetof(flags) = 10 +offsetof(timereset) = 12 +offsetof(timereceived) = 16 +offsetof(timetosend) = 20 +offsetof(timereachable) = 24 +offsetof(sent) = 28 +offsetof(unused1) = 32 +offsetof(processed) = 36 +offsetof(unused2) = 40 +offsetof(badauth) = 44 +offsetof(bogusorg) = 48 +offsetof(oldpkt) = 52 +offsetof(unused3) = 56 +offsetof(unused4) = 60 +offsetof(seldisp) = 64 +offsetof(selbroken) = 68 +offsetof(unused5) = 72 +offsetof(candidate) = 76 +offsetof(unused6) = 77 +offsetof(unused7) = 78 +offsetof(unused8) = 79 +offsetof(v6_flag) = 80 +offsetof(unused9) = 84 +offsetof(dstadr6) = 88 +offsetof(srcadr6) = 104 + +sizeof(struct info_loop) = 24 +offsetof(last_offset) = 0 +offsetof(drift_comp) = 8 +offsetof(compliance) = 16 +offsetof(watchdog_timer) = 20 + +sizeof(struct info_sys) = 80 +offsetof(peer) = 0 +offsetof(peer_mode) = 4 +offsetof(leap) = 5 +offsetof(stratum) = 6 +offsetof(precision) = 7 +offsetof(rootdelay) = 8 +offsetof(rootdispersion) = 12 +offsetof(refid) = 16 +offsetof(reftime) = 20 +offsetof(poll) = 28 +offsetof(flags) = 32 +offsetof(unused1) = 33 +offsetof(unused2) = 34 +offsetof(unused3) = 35 +offsetof(bdelay) = 36 +offsetof(frequency) = 40 +offsetof(authdelay) = 44 +offsetof(stability) = 52 +offsetof(v6_flag) = 56 +offsetof(unused4) = 60 +offsetof(peer6) = 64 + +sizeof(struct info_sys_stats) = 44 +offsetof(timeup) = 0 +offsetof(timereset) = 4 +offsetof(denied) = 8 +offsetof(oldversionpkt) = 12 +offsetof(newversionpkt) = 16 +offsetof(unknownversion) = 20 +offsetof(badlength) = 24 +offsetof(processed) = 28 +offsetof(badauth) = 32 +offsetof(received) = 36 +offsetof(limitrejected) = 40 + +sizeof(struct old_info_sys_stats) = 40 +offsetof(timeup) = 0 +offsetof(timereset) = 4 +offsetof(denied) = 8 +offsetof(oldversionpkt) = 12 +offsetof(newversionpkt) = 16 +offsetof(unknownversion) = 20 +offsetof(badlength) = 24 +offsetof(processed) = 28 +offsetof(badauth) = 32 +offsetof(wanderhold) = 36 + +sizeof(struct info_mem_stats) = 148 +offsetof(timereset) = 0 +offsetof(totalpeermem) = 4 +offsetof(freepeermem) = 6 +offsetof(findpeer_calls) = 8 +offsetof(allocations) = 12 +offsetof(demobilizations) = 16 +offsetof(hashcount) = 20 + +sizeof(struct info_io_stats) = 40 +offsetof(timereset) = 0 +offsetof(totalrecvbufs) = 4 +offsetof(freerecvbufs) = 6 +offsetof(fullrecvbufs) = 8 +offsetof(lowwater) = 10 +offsetof(dropped) = 12 +offsetof(ignored) = 16 +offsetof(received) = 20 +offsetof(sent) = 24 +offsetof(notsent) = 28 +offsetof(interrupts) = 32 +offsetof(int_received) = 36 + +sizeof(struct info_timer_stats) = 16 +offsetof(timereset) = 0 +offsetof(alarms) = 4 +offsetof(overflows) = 8 +offsetof(xmtcalls) = 12 + +sizeof(struct old_conf_peer) = 16 +offsetof(peeraddr) = 0 +offsetof(hmode) = 4 +offsetof(version) = 5 +offsetof(minpoll) = 6 +offsetof(maxpoll) = 7 +offsetof(flags) = 8 +offsetof(ttl) = 9 +offsetof(unused) = 10 +offsetof(keyid) = 12 + +sizeof(struct conf_peer) = 168 +offsetof(peeraddr) = 0 +offsetof(hmode) = 4 +offsetof(version) = 5 +offsetof(minpoll) = 6 +offsetof(maxpoll) = 7 +offsetof(flags) = 8 +offsetof(ttl) = 9 +offsetof(unused1) = 10 +offsetof(keyid) = 12 +offsetof(keystr) = 16 +offsetof(v6_flag) = 144 +offsetof(unused2) = 148 +offsetof(peeraddr6) = 152 + +sizeof(struct conf_unpeer) = 24 +offsetof(peeraddr) = 0 +offsetof(v6_flag) = 4 +offsetof(peeraddr6) = 8 + +sizeof(struct conf_sys_flags) = 4 +offsetof(flags) = 0 + +sizeof(struct info_restrict) = 56 +offsetof(addr) = 0 +offsetof(mask) = 4 +offsetof(count) = 8 +offsetof(flags) = 12 +offsetof(mflags) = 14 +offsetof(v6_flag) = 16 +offsetof(unused1) = 20 +offsetof(addr6) = 24 +offsetof(mask6) = 40 + +sizeof(struct conf_restrict) = 48 +offsetof(addr) = 0 +offsetof(mask) = 4 +offsetof(flags) = 8 +offsetof(mflags) = 10 +offsetof(v6_flag) = 12 +offsetof(addr6) = 16 +offsetof(mask6) = 32 + +sizeof(struct info_monitor_1) = 72 +offsetof(avg_int) = 0 +offsetof(last_int) = 4 +offsetof(restr) = 8 +offsetof(count) = 12 +offsetof(addr) = 16 +offsetof(daddr) = 20 +offsetof(flags) = 24 +offsetof(port) = 28 +offsetof(mode) = 30 +offsetof(version) = 31 +offsetof(v6_flag) = 32 +offsetof(unused1) = 36 +offsetof(addr6) = 40 +offsetof(daddr6) = 56 + +sizeof(struct info_monitor) = 48 +offsetof(avg_int) = 0 +offsetof(last_int) = 4 +offsetof(restr) = 8 +offsetof(count) = 12 +offsetof(addr) = 16 +offsetof(port) = 20 +offsetof(mode) = 22 +offsetof(version) = 23 +offsetof(v6_flag) = 24 +offsetof(unused1) = 28 +offsetof(addr6) = 32 + +sizeof(struct old_info_monitor) = 40 +offsetof(lasttime) = 0 +offsetof(firsttime) = 4 +offsetof(count) = 8 +offsetof(addr) = 12 +offsetof(port) = 16 +offsetof(mode) = 18 +offsetof(version) = 19 +offsetof(v6_flag) = 20 +offsetof(addr6) = 24 + +sizeof(struct reset_flags) = 4 +offsetof(flags) = 0 + +sizeof(struct info_auth) = 36 +offsetof(timereset) = 0 +offsetof(numkeys) = 4 +offsetof(numfreekeys) = 8 +offsetof(keylookups) = 12 +offsetof(keynotfound) = 16 +offsetof(encryptions) = 20 +offsetof(decryptions) = 24 +offsetof(expired) = 28 +offsetof(keyuncached) = 32 + +sizeof(struct info_trap) = 64 +offsetof(local_address) = 0 +offsetof(trap_address) = 4 +offsetof(trap_port) = 8 +offsetof(sequence) = 10 +offsetof(settime) = 12 +offsetof(origtime) = 16 +offsetof(resets) = 20 +offsetof(flags) = 24 +offsetof(v6_flag) = 28 +offsetof(local_address6) = 32 +offsetof(trap_address6) = 48 + +sizeof(struct conf_trap) = 48 +offsetof(local_address) = 0 +offsetof(trap_address) = 4 +offsetof(trap_port) = 8 +offsetof(unused) = 10 +offsetof(v6_flag) = 12 +offsetof(local_address6) = 16 +offsetof(trap_address6) = 32 + +sizeof(struct info_control) = 60 +offsetof(ctltimereset) = 0 +offsetof(numctlreq) = 4 +offsetof(numctlbadpkts) = 8 +offsetof(numctlresponses) = 12 +offsetof(numctlfrags) = 16 +offsetof(numctlerrors) = 20 +offsetof(numctltooshort) = 24 +offsetof(numctlinputresp) = 28 +offsetof(numctlinputfrag) = 32 +offsetof(numctlinputerr) = 36 +offsetof(numctlbadoffset) = 40 +offsetof(numctlbadversion) = 44 +offsetof(numctldatatooshort) = 48 +offsetof(numctlbadop) = 52 +offsetof(numasyncmsgs) = 56 + +sizeof(struct info_clock) = 52 +offsetof(clockadr) = 0 +offsetof(type) = 4 +offsetof(flags) = 5 +offsetof(lastevent) = 6 +offsetof(currentstatus) = 7 +offsetof(polls) = 8 +offsetof(noresponse) = 12 +offsetof(badformat) = 16 +offsetof(baddata) = 20 +offsetof(timestarted) = 24 +offsetof(fudgetime1) = 28 +offsetof(fudgetime2) = 36 +offsetof(fudgeval1) = 44 +offsetof(fudgeval2) = 48 + +sizeof(struct conf_fudge) = 20 +offsetof(clockadr) = 0 +offsetof(which) = 4 +offsetof(fudgetime) = 8 +offsetof(fudgeval_flags) = 16 + +sizeof(struct info_clkbug) = 332 +offsetof(clockadr) = 0 +offsetof(nvalues) = 4 +offsetof(ntimes) = 5 +offsetof(svalues) = 6 +offsetof(stimes) = 8 +offsetof(values) = 12 +offsetof(times) = 76 + +sizeof(struct info_kernel) = 60 +offsetof(offset) = 0 +offsetof(freq) = 4 +offsetof(maxerror) = 8 +offsetof(esterror) = 12 +offsetof(status) = 16 +offsetof(shift) = 18 +offsetof(constant) = 20 +offsetof(precision) = 24 +offsetof(tolerance) = 28 +offsetof(ppsfreq) = 32 +offsetof(jitter) = 36 +offsetof(stabil) = 40 +offsetof(jitcnt) = 44 +offsetof(calcnt) = 48 +offsetof(errcnt) = 52 +offsetof(stbcnt) = 56 + +sizeof(struct info_if_stats) = 136 +offsetof(unaddr) = 0 +offsetof(unbcast) = 16 +offsetof(unmask) = 32 +offsetof(v6_flag) = 48 +offsetof(name) = 52 +offsetof(flags) = 84 +offsetof(last_ttl) = 88 +offsetof(num_mcast) = 92 +offsetof(received) = 96 +offsetof(sent) = 100 +offsetof(notsent) = 104 +offsetof(uptime) = 108 +offsetof(scopeid) = 112 +offsetof(ifindex) = 116 +offsetof(ifnum) = 120 +offsetof(peercnt) = 124 +offsetof(family) = 128 +offsetof(ignore_packets) = 130 +offsetof(action) = 131 +offsetof(_filler0) = 132 + +sizeof(struct info_dns_assoc) = 32 +offsetof(peeraddr) = 0 +offsetof(associd) = 4 +offsetof(hostname) = 6 + diff --git a/ntpdc/nl.pl b/ntpdc/nl.pl new file mode 100755 index 0000000..4a418fb --- /dev/null +++ b/ntpdc/nl.pl @@ -0,0 +1,43 @@ +#! /usr/local/perl-5.8.8/bin/perl -w + +$found = 0; +$last = 0; +$debug = 0; + +while (<>) { + next if /^#/; + next if /^\s*$/; + if (/^typedef union req_data_u_tag/) { + $found = 1; + } + if (/^struct info_dns_assoc/) { + $last = 1; + } + if ($found) { + if (/^(struct\s*\w*)\s*{\s*$/) { + $type = $1; + print STDERR "type = '$type'\n" if $debug; + printf " printf(\"sizeof($type) = %%d\\n\", \n\t (int) sizeof($type));\n"; + next; + } + if (/^typedef (union\s*\w*)\s*{\s*$/) { + $type = $1; + print STDERR "union = '$type'\n" if $debug; + printf " printf(\"sizeof($type) = %%d\\n\", \n\t (int) sizeof($type));\n"; + next; + } + if (/\s*\w+\s+(\w*)\s*(\[.*\])?\s*;\s*$/) { + $field = $1; + print STDERR "\tfield = '$field'\n" if $debug; + printf " printf(\"offsetof($field) = %%d\\n\", \n\t (int) offsetof($type, $field));\n"; + next; + } + if (/^}\s*\w*\s*;\s*$/) { + printf " printf(\"\\n\");\n\n"; + $found = 0 if $last; + next; + } + print STDERR "Unmatched line: $_"; + exit 1; + } +} diff --git a/ntpdc/nl.pl.in b/ntpdc/nl.pl.in new file mode 100644 index 0000000..8007538 --- /dev/null +++ b/ntpdc/nl.pl.in @@ -0,0 +1,43 @@ +#! @PATH_PERL@ -w + +$found = 0; +$last = 0; +$debug = 0; + +while (<>) { + next if /^#/; + next if /^\s*$/; + if (/^typedef union req_data_u_tag/) { + $found = 1; + } + if (/^struct info_dns_assoc/) { + $last = 1; + } + if ($found) { + if (/^(struct\s*\w*)\s*{\s*$/) { + $type = $1; + print STDERR "type = '$type'\n" if $debug; + printf " printf(\"sizeof($type) = %%d\\n\", \n\t (int) sizeof($type));\n"; + next; + } + if (/^typedef (union\s*\w*)\s*{\s*$/) { + $type = $1; + print STDERR "union = '$type'\n" if $debug; + printf " printf(\"sizeof($type) = %%d\\n\", \n\t (int) sizeof($type));\n"; + next; + } + if (/\s*\w+\s+(\w*)\s*(\[.*\])?\s*;\s*$/) { + $field = $1; + print STDERR "\tfield = '$field'\n" if $debug; + printf " printf(\"offsetof($field) = %%d\\n\", \n\t (int) offsetof($type, $field));\n"; + next; + } + if (/^}\s*\w*\s*;\s*$/) { + printf " printf(\"\\n\");\n\n"; + $found = 0 if $last; + next; + } + print STDERR "Unmatched line: $_"; + exit 1; + } +} diff --git a/ntpdc/nl_in.c b/ntpdc/nl_in.c new file mode 100644 index 0000000..3df8c78 --- /dev/null +++ b/ntpdc/nl_in.c @@ -0,0 +1,3 @@ +#include <config.h> +#include "ntpdc.h" +#include "ntp_request.h" diff --git a/ntpdc/ntpdc-layout.c b/ntpdc/ntpdc-layout.c new file mode 100644 index 0000000..0171488 --- /dev/null +++ b/ntpdc/ntpdc-layout.c @@ -0,0 +1,22 @@ +/* + * ntpdc-layout - print layout of NTP mode 7 request/response packets + */ + +#include <config.h> +#include <stdio.h> +#include <stddef.h> + +#include "ntpdc.h" +#include "ntp_stdlib.h" + +#if defined(IMPL_XNTPD_OLD) && IMPL_XNTPD != 3 +#error Unexpected IMPL_XNTPD +#endif + +int +main(void) +{ +#include "nl.c" + + return (EXIT_SUCCESS); +} diff --git a/ntpdc/ntpdc-opts.c b/ntpdc/ntpdc-opts.c new file mode 100644 index 0000000..8e595a4 --- /dev/null +++ b/ntpdc/ntpdc-opts.c @@ -0,0 +1,1173 @@ +/* + * EDIT THIS FILE WITH CAUTION (ntpdc-opts.c) + * + * It has been AutoGen-ed December 2, 2014 at 08:57:15 AM by AutoGen 5.18.5pre4 + * From the definitions ntpdc-opts.def + * and the template file options + * + * Generated from AutoOpts 41:0:16 templates. + * + * AutoOpts is a copyrighted work. This source file is not encumbered + * by AutoOpts licensing, but is provided under the licensing terms chosen + * by the ntpdc author or copyright holder. AutoOpts is + * licensed under the terms of the LGPL. The redistributable library + * (``libopts'') is licensed under the terms of either the LGPL or, at the + * users discretion, the BSD license. See the AutoOpts and/or libopts sources + * for details. + * + * The ntpdc program is copyrighted and licensed + * under the following terms: + * + * Copyright (C) 1970-2014 The University of Delaware, all rights reserved. + * This is free software. It is licensed for use, modification and + * redistribution under the terms of the NTP License, copies of which + * can be seen at: + * <http://ntp.org/license> + * <http://opensource.org/licenses/ntp-license.php> + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose with or without fee is hereby granted, + * provided that the above copyright notice appears in all copies and that + * both the copyright notice and this permission notice appear in + * supporting documentation, and that the name The University of Delaware not be used in + * advertising or publicity pertaining to distribution of the software + * without specific, written prior permission. The University of Delaware makes no + * representations about the suitability this software for any purpose. It + * is provided "as is" without express or implied warranty. + */ + +#ifndef __doxygen__ +#define OPTION_CODE_COMPILE 1 +#include "ntpdc-opts.h" +#include <sys/types.h> + +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> + +#ifdef __cplusplus +extern "C" { +#endif +extern FILE * option_usage_fp; +#define zCopyright (ntpdc_opt_strs+0) +#define zLicenseDescrip (ntpdc_opt_strs+315) + +/* + * global included definitions + */ +#ifdef __windows + extern int atoi(const char*); +#else +# include <stdlib.h> +#endif + +#ifndef NULL +# define NULL 0 +#endif + +/** + * static const strings for ntpdc options + */ +static char const ntpdc_opt_strs[1861] = +/* 0 */ "ntpdc 4.2.7p482\n" + "Copyright (C) 1970-2014 The University of Delaware, all rights reserved.\n" + "This is free software. It is licensed for use, modification and\n" + "redistribution under the terms of the NTP License, copies of which\n" + "can be seen at:\n" + " <http://ntp.org/license>\n" + " <http://opensource.org/licenses/ntp-license.php>\n\0" +/* 315 */ "Permission to use, copy, modify, and distribute this software and its\n" + "documentation for any purpose with or without fee is hereby granted,\n" + "provided that the above copyright notice appears in all copies and that\n" + "both the copyright notice and this permission notice appear in supporting\n" + "documentation, and that the name The University of Delaware not be used in\n" + "advertising or publicity pertaining to distribution of the software without\n" + "specific, written prior permission. The University of Delaware makes no\n" + "representations about the suitability this software for any purpose. It is\n" + "provided \"as is\" without express or implied warranty.\n\0" +/* 955 */ "Force IPv4 DNS name resolution\0" +/* 986 */ "IPV4\0" +/* 991 */ "ipv4\0" +/* 996 */ "Force IPv6 DNS name resolution\0" +/* 1027 */ "IPV6\0" +/* 1032 */ "ipv6\0" +/* 1037 */ "run a command and exit\0" +/* 1060 */ "COMMAND\0" +/* 1068 */ "command\0" +/* 1076 */ "Increase debug verbosity level\0" +/* 1107 */ "DEBUG_LEVEL\0" +/* 1119 */ "debug-level\0" +/* 1131 */ "Set the debug verbosity level\0" +/* 1161 */ "SET_DEBUG_LEVEL\0" +/* 1177 */ "set-debug-level\0" +/* 1193 */ "Force ntpq to operate in interactive mode\0" +/* 1235 */ "INTERACTIVE\0" +/* 1247 */ "interactive\0" +/* 1259 */ "Print a list of the peers\0" +/* 1285 */ "LISTPEERS\0" +/* 1295 */ "listpeers\0" +/* 1305 */ "numeric host addresses\0" +/* 1328 */ "NUMERIC\0" +/* 1336 */ "numeric\0" +/* 1344 */ "PEERS\0" +/* 1350 */ "peers\0" +/* 1356 */ "Show a list of the peers\0" +/* 1381 */ "SHOWPEERS\0" +/* 1391 */ "showpeers\0" +/* 1401 */ "display extended usage information and exit\0" +/* 1445 */ "help\0" +/* 1450 */ "extended usage information passed thru pager\0" +/* 1495 */ "more-help\0" +/* 1505 */ "output version information and exit\0" +/* 1541 */ "version\0" +/* 1549 */ "save the option state to a config file\0" +/* 1588 */ "save-opts\0" +/* 1598 */ "load options from a config file\0" +/* 1630 */ "LOAD_OPTS\0" +/* 1640 */ "no-load-opts\0" +/* 1653 */ "no\0" +/* 1656 */ "NTPDC\0" +/* 1662 */ "ntpdc - vendor-specific NTPD control program - Ver. 4.2.7p482\n" + "Usage: %s [ -<flag> [<val>] | --<name>[{=| }<val>] ]... [ host ...]\n\0" +/* 1794 */ "$HOME\0" +/* 1800 */ ".\0" +/* 1802 */ ".ntprc\0" +/* 1809 */ "http://bugs.ntp.org, bugs@ntp.org\0" +/* 1843 */ "\n\0" +/* 1845 */ "ntpdc 4.2.7p482"; + +/** + * ipv4 option description with + * "Must also have options" and "Incompatible options": + */ +/** Descriptive text for the ipv4 option */ +#define IPV4_DESC (ntpdc_opt_strs+955) +/** Upper-cased name for the ipv4 option */ +#define IPV4_NAME (ntpdc_opt_strs+986) +/** Name string for the ipv4 option */ +#define IPV4_name (ntpdc_opt_strs+991) +/** Other options that appear in conjunction with the ipv4 option */ +static int const aIpv4CantList[] = { + INDEX_OPT_IPV6, NO_EQUIVALENT }; +/** Compiled in flag settings for the ipv4 option */ +#define IPV4_FLAGS (OPTST_DISABLED) + +/** + * ipv6 option description with + * "Must also have options" and "Incompatible options": + */ +/** Descriptive text for the ipv6 option */ +#define IPV6_DESC (ntpdc_opt_strs+996) +/** Upper-cased name for the ipv6 option */ +#define IPV6_NAME (ntpdc_opt_strs+1027) +/** Name string for the ipv6 option */ +#define IPV6_name (ntpdc_opt_strs+1032) +/** Other options that appear in conjunction with the ipv6 option */ +static int const aIpv6CantList[] = { + INDEX_OPT_IPV4, NO_EQUIVALENT }; +/** Compiled in flag settings for the ipv6 option */ +#define IPV6_FLAGS (OPTST_DISABLED) + +/** + * command option description: + */ +/** Descriptive text for the command option */ +#define COMMAND_DESC (ntpdc_opt_strs+1037) +/** Upper-cased name for the command option */ +#define COMMAND_NAME (ntpdc_opt_strs+1060) +/** Name string for the command option */ +#define COMMAND_name (ntpdc_opt_strs+1068) +/** Compiled in flag settings for the command option */ +#define COMMAND_FLAGS (OPTST_DISABLED | OPTST_STACKED \ + | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING)) + +/** + * debug-level option description: + */ +/** Descriptive text for the debug-level option */ +#define DEBUG_LEVEL_DESC (ntpdc_opt_strs+1076) +/** Upper-cased name for the debug-level option */ +#define DEBUG_LEVEL_NAME (ntpdc_opt_strs+1107) +/** Name string for the debug-level option */ +#define DEBUG_LEVEL_name (ntpdc_opt_strs+1119) +/** Compiled in flag settings for the debug-level option */ +#define DEBUG_LEVEL_FLAGS (OPTST_DISABLED) + +/** + * set-debug-level option description: + */ +/** Descriptive text for the set-debug-level option */ +#define SET_DEBUG_LEVEL_DESC (ntpdc_opt_strs+1131) +/** Upper-cased name for the set-debug-level option */ +#define SET_DEBUG_LEVEL_NAME (ntpdc_opt_strs+1161) +/** Name string for the set-debug-level option */ +#define SET_DEBUG_LEVEL_name (ntpdc_opt_strs+1177) +/** Compiled in flag settings for the set-debug-level option */ +#define SET_DEBUG_LEVEL_FLAGS (OPTST_DISABLED \ + | OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC)) + +/** + * interactive option description with + * "Must also have options" and "Incompatible options": + */ +/** Descriptive text for the interactive option */ +#define INTERACTIVE_DESC (ntpdc_opt_strs+1193) +/** Upper-cased name for the interactive option */ +#define INTERACTIVE_NAME (ntpdc_opt_strs+1235) +/** Name string for the interactive option */ +#define INTERACTIVE_name (ntpdc_opt_strs+1247) +/** Other options that appear in conjunction with the interactive option */ +static int const aInteractiveCantList[] = { + INDEX_OPT_COMMAND, + INDEX_OPT_LISTPEERS, + INDEX_OPT_PEERS, + INDEX_OPT_SHOWPEERS, NO_EQUIVALENT }; +/** Compiled in flag settings for the interactive option */ +#define INTERACTIVE_FLAGS (OPTST_DISABLED) + +/** + * listpeers option description with + * "Must also have options" and "Incompatible options": + */ +/** Descriptive text for the listpeers option */ +#define LISTPEERS_DESC (ntpdc_opt_strs+1259) +/** Upper-cased name for the listpeers option */ +#define LISTPEERS_NAME (ntpdc_opt_strs+1285) +/** Name string for the listpeers option */ +#define LISTPEERS_name (ntpdc_opt_strs+1295) +/** Other options that appear in conjunction with the listpeers option */ +static int const aListpeersCantList[] = { + INDEX_OPT_COMMAND, NO_EQUIVALENT }; +/** Compiled in flag settings for the listpeers option */ +#define LISTPEERS_FLAGS (OPTST_DISABLED) + +/** + * numeric option description: + */ +/** Descriptive text for the numeric option */ +#define NUMERIC_DESC (ntpdc_opt_strs+1305) +/** Upper-cased name for the numeric option */ +#define NUMERIC_NAME (ntpdc_opt_strs+1328) +/** Name string for the numeric option */ +#define NUMERIC_name (ntpdc_opt_strs+1336) +/** Compiled in flag settings for the numeric option */ +#define NUMERIC_FLAGS (OPTST_DISABLED) + +/** + * peers option description with + * "Must also have options" and "Incompatible options": + */ +/** Descriptive text for the peers option */ +#define PEERS_DESC (ntpdc_opt_strs+1259) +/** Upper-cased name for the peers option */ +#define PEERS_NAME (ntpdc_opt_strs+1344) +/** Name string for the peers option */ +#define PEERS_name (ntpdc_opt_strs+1350) +/** Other options that appear in conjunction with the peers option */ +static int const aPeersCantList[] = { + INDEX_OPT_COMMAND, NO_EQUIVALENT }; +/** Compiled in flag settings for the peers option */ +#define PEERS_FLAGS (OPTST_DISABLED) + +/** + * showpeers option description with + * "Must also have options" and "Incompatible options": + */ +/** Descriptive text for the showpeers option */ +#define SHOWPEERS_DESC (ntpdc_opt_strs+1356) +/** Upper-cased name for the showpeers option */ +#define SHOWPEERS_NAME (ntpdc_opt_strs+1381) +/** Name string for the showpeers option */ +#define SHOWPEERS_name (ntpdc_opt_strs+1391) +/** Other options that appear in conjunction with the showpeers option */ +static int const aShowpeersCantList[] = { + INDEX_OPT_COMMAND, NO_EQUIVALENT }; +/** Compiled in flag settings for the showpeers option */ +#define SHOWPEERS_FLAGS (OPTST_DISABLED) + +/* + * Help/More_Help/Version option descriptions: + */ +#define HELP_DESC (ntpdc_opt_strs+1401) +#define HELP_name (ntpdc_opt_strs+1445) +#ifdef HAVE_WORKING_FORK +#define MORE_HELP_DESC (ntpdc_opt_strs+1450) +#define MORE_HELP_name (ntpdc_opt_strs+1495) +#define MORE_HELP_FLAGS (OPTST_IMM | OPTST_NO_INIT) +#else +#define MORE_HELP_DESC HELP_DESC +#define MORE_HELP_name HELP_name +#define MORE_HELP_FLAGS (OPTST_OMITTED | OPTST_NO_INIT) +#endif +#ifdef NO_OPTIONAL_OPT_ARGS +# define VER_FLAGS (OPTST_IMM | OPTST_NO_INIT) +#else +# define VER_FLAGS (OPTST_SET_ARGTYPE(OPARG_TYPE_STRING) | \ + OPTST_ARG_OPTIONAL | OPTST_IMM | OPTST_NO_INIT) +#endif +#define VER_DESC (ntpdc_opt_strs+1505) +#define VER_name (ntpdc_opt_strs+1541) +#define SAVE_OPTS_DESC (ntpdc_opt_strs+1549) +#define SAVE_OPTS_name (ntpdc_opt_strs+1588) +#define LOAD_OPTS_DESC (ntpdc_opt_strs+1598) +#define LOAD_OPTS_NAME (ntpdc_opt_strs+1630) +#define NO_LOAD_OPTS_name (ntpdc_opt_strs+1640) +#define LOAD_OPTS_pfx (ntpdc_opt_strs+1653) +#define LOAD_OPTS_name (NO_LOAD_OPTS_name + 3) +/** + * Declare option callback procedures + */ +extern tOptProc + ntpOptionPrintVersion, optionBooleanVal, optionNestedVal, + optionNumericVal, optionPagedUsage, optionResetOpt, + optionStackArg, optionTimeDate, optionTimeVal, + optionUnstackArg, optionVendorOption; +static tOptProc + doOptDebug_Level, doUsageOpt; +#define VER_PROC ntpOptionPrintVersion + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** + * Define the ntpdc Option Descriptions. + * This is an array of OPTION_CT entries, one for each + * option that the ntpdc program responds to. + */ +static tOptDesc optDesc[OPTION_CT] = { + { /* entry idx, value */ 0, VALUE_OPT_IPV4, + /* equiv idx, value */ 0, VALUE_OPT_IPV4, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, 1, 0, + /* opt state flags */ IPV4_FLAGS, 0, + /* last opt argumnt */ { NULL }, /* --ipv4 */ + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, aIpv4CantList, + /* option proc */ NULL, + /* desc, NAME, name */ IPV4_DESC, IPV4_NAME, IPV4_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ 1, VALUE_OPT_IPV6, + /* equiv idx, value */ 1, VALUE_OPT_IPV6, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, 1, 0, + /* opt state flags */ IPV6_FLAGS, 0, + /* last opt argumnt */ { NULL }, /* --ipv6 */ + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, aIpv6CantList, + /* option proc */ NULL, + /* desc, NAME, name */ IPV6_DESC, IPV6_NAME, IPV6_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ 2, VALUE_OPT_COMMAND, + /* equiv idx, value */ 2, VALUE_OPT_COMMAND, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, NOLIMIT, 0, + /* opt state flags */ COMMAND_FLAGS, 0, + /* last opt argumnt */ { NULL }, /* --command */ + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, NULL, + /* option proc */ optionStackArg, + /* desc, NAME, name */ COMMAND_DESC, COMMAND_NAME, COMMAND_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ 3, VALUE_OPT_DEBUG_LEVEL, + /* equiv idx, value */ 3, VALUE_OPT_DEBUG_LEVEL, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, NOLIMIT, 0, + /* opt state flags */ DEBUG_LEVEL_FLAGS, 0, + /* last opt argumnt */ { NULL }, /* --debug-level */ + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, NULL, + /* option proc */ doOptDebug_Level, + /* desc, NAME, name */ DEBUG_LEVEL_DESC, DEBUG_LEVEL_NAME, DEBUG_LEVEL_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ 4, VALUE_OPT_SET_DEBUG_LEVEL, + /* equiv idx, value */ 4, VALUE_OPT_SET_DEBUG_LEVEL, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, NOLIMIT, 0, + /* opt state flags */ SET_DEBUG_LEVEL_FLAGS, 0, + /* last opt argumnt */ { NULL }, /* --set-debug-level */ + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, NULL, + /* option proc */ optionNumericVal, + /* desc, NAME, name */ SET_DEBUG_LEVEL_DESC, SET_DEBUG_LEVEL_NAME, SET_DEBUG_LEVEL_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ 5, VALUE_OPT_INTERACTIVE, + /* equiv idx, value */ 5, VALUE_OPT_INTERACTIVE, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, 1, 0, + /* opt state flags */ INTERACTIVE_FLAGS, 0, + /* last opt argumnt */ { NULL }, /* --interactive */ + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, aInteractiveCantList, + /* option proc */ NULL, + /* desc, NAME, name */ INTERACTIVE_DESC, INTERACTIVE_NAME, INTERACTIVE_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ 6, VALUE_OPT_LISTPEERS, + /* equiv idx, value */ 6, VALUE_OPT_LISTPEERS, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, 1, 0, + /* opt state flags */ LISTPEERS_FLAGS, 0, + /* last opt argumnt */ { NULL }, /* --listpeers */ + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, aListpeersCantList, + /* option proc */ NULL, + /* desc, NAME, name */ LISTPEERS_DESC, LISTPEERS_NAME, LISTPEERS_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ 7, VALUE_OPT_NUMERIC, + /* equiv idx, value */ 7, VALUE_OPT_NUMERIC, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, 1, 0, + /* opt state flags */ NUMERIC_FLAGS, 0, + /* last opt argumnt */ { NULL }, /* --numeric */ + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, NULL, + /* option proc */ NULL, + /* desc, NAME, name */ NUMERIC_DESC, NUMERIC_NAME, NUMERIC_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ 8, VALUE_OPT_PEERS, + /* equiv idx, value */ 8, VALUE_OPT_PEERS, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, 1, 0, + /* opt state flags */ PEERS_FLAGS, 0, + /* last opt argumnt */ { NULL }, /* --peers */ + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, aPeersCantList, + /* option proc */ NULL, + /* desc, NAME, name */ PEERS_DESC, PEERS_NAME, PEERS_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ 9, VALUE_OPT_SHOWPEERS, + /* equiv idx, value */ 9, VALUE_OPT_SHOWPEERS, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, 1, 0, + /* opt state flags */ SHOWPEERS_FLAGS, 0, + /* last opt argumnt */ { NULL }, /* --showpeers */ + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, aShowpeersCantList, + /* option proc */ NULL, + /* desc, NAME, name */ SHOWPEERS_DESC, SHOWPEERS_NAME, SHOWPEERS_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ INDEX_OPT_VERSION, VALUE_OPT_VERSION, + /* equiv idx value */ NO_EQUIVALENT, VALUE_OPT_VERSION, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, 1, 0, + /* opt state flags */ VER_FLAGS, AOUSE_VERSION, + /* last opt argumnt */ { NULL }, + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, NULL, + /* option proc */ VER_PROC, + /* desc, NAME, name */ VER_DESC, NULL, VER_name, + /* disablement strs */ NULL, NULL }, + + + + { /* entry idx, value */ INDEX_OPT_HELP, VALUE_OPT_HELP, + /* equiv idx value */ NO_EQUIVALENT, VALUE_OPT_HELP, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, 1, 0, + /* opt state flags */ OPTST_IMM | OPTST_NO_INIT, AOUSE_HELP, + /* last opt argumnt */ { NULL }, + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, NULL, + /* option proc */ doUsageOpt, + /* desc, NAME, name */ HELP_DESC, NULL, HELP_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ INDEX_OPT_MORE_HELP, VALUE_OPT_MORE_HELP, + /* equiv idx value */ NO_EQUIVALENT, VALUE_OPT_MORE_HELP, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, 1, 0, + /* opt state flags */ MORE_HELP_FLAGS, AOUSE_MORE_HELP, + /* last opt argumnt */ { NULL }, + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, NULL, + /* option proc */ optionPagedUsage, + /* desc, NAME, name */ MORE_HELP_DESC, NULL, MORE_HELP_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ INDEX_OPT_SAVE_OPTS, VALUE_OPT_SAVE_OPTS, + /* equiv idx value */ NO_EQUIVALENT, VALUE_OPT_SAVE_OPTS, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, 1, 0, + /* opt state flags */ OPTST_SET_ARGTYPE(OPARG_TYPE_STRING) + | OPTST_ARG_OPTIONAL | OPTST_NO_INIT, AOUSE_SAVE_OPTS, + /* last opt argumnt */ { NULL }, + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, NULL, + /* option proc */ NULL, + /* desc, NAME, name */ SAVE_OPTS_DESC, NULL, SAVE_OPTS_name, + /* disablement strs */ NULL, NULL }, + + { /* entry idx, value */ INDEX_OPT_LOAD_OPTS, VALUE_OPT_LOAD_OPTS, + /* equiv idx value */ NO_EQUIVALENT, VALUE_OPT_LOAD_OPTS, + /* equivalenced to */ NO_EQUIVALENT, + /* min, max, act ct */ 0, NOLIMIT, 0, + /* opt state flags */ OPTST_SET_ARGTYPE(OPARG_TYPE_STRING) + | OPTST_DISABLE_IMM, AOUSE_LOAD_OPTS, + /* last opt argumnt */ { NULL }, + /* arg list/cookie */ NULL, + /* must/cannot opts */ NULL, NULL, + /* option proc */ optionLoadOpt, + /* desc, NAME, name */ LOAD_OPTS_DESC, LOAD_OPTS_NAME, LOAD_OPTS_name, + /* disablement strs */ NO_LOAD_OPTS_name, LOAD_OPTS_pfx } +}; + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** Reference to the upper cased version of ntpdc. */ +#define zPROGNAME (ntpdc_opt_strs+1656) +/** Reference to the title line for ntpdc usage. */ +#define zUsageTitle (ntpdc_opt_strs+1662) +/** ntpdc configuration file name. */ +#define zRcName (ntpdc_opt_strs+1802) +/** Directories to search for ntpdc config files. */ +static char const * const apzHomeList[3] = { + ntpdc_opt_strs+1794, + ntpdc_opt_strs+1800, + NULL }; +/** The ntpdc program bug email address. */ +#define zBugsAddr (ntpdc_opt_strs+1809) +/** Clarification/explanation of what ntpdc does. */ +#define zExplain (ntpdc_opt_strs+1843) +/** Extra detail explaining what ntpdc does. */ +#define zDetail (NULL) +/** The full version string for ntpdc. */ +#define zFullVersion (ntpdc_opt_strs+1845) +/* extracted from optcode.tlib near line 364 */ + +#if defined(ENABLE_NLS) +# define OPTPROC_BASE OPTPROC_TRANSLATE + static tOptionXlateProc translate_option_strings; +#else +# define OPTPROC_BASE OPTPROC_NONE +# define translate_option_strings NULL +#endif /* ENABLE_NLS */ + +#define ntpdc_full_usage (NULL) +#define ntpdc_short_usage (NULL) + +#endif /* not defined __doxygen__ */ + +/* + * Create the static procedure(s) declared above. + */ +/** + * The callout function that invokes the optionUsage function. + * + * @param[in] opts the AutoOpts option description structure + * @param[in] od the descriptor for the "help" (usage) option. + * @noreturn + */ +static void +doUsageOpt(tOptions * opts, tOptDesc * od) +{ + int ex_code; + ex_code = NTPDC_EXIT_SUCCESS; + optionUsage(&ntpdcOptions, ex_code); + /* NOTREACHED */ + exit(1); + (void)opts; + (void)od; +} + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** + * Code to handle the debug-level option. + * + * @param[in] pOptions the ntpdc options data structure + * @param[in,out] pOptDesc the option descriptor for this option. + */ +static void +doOptDebug_Level(tOptions* pOptions, tOptDesc* pOptDesc) +{ + /* + * Be sure the flag-code[0] handles special values for the options pointer + * viz. (poptions <= OPTPROC_EMIT_LIMIT) *and also* the special flag bit + * ((poptdesc->fOptState & OPTST_RESET) != 0) telling the option to + * reset its state. + */ + /* extracted from debug-opt.def, line 15 */ +OPT_VALUE_SET_DEBUG_LEVEL++; + (void)pOptDesc; + (void)pOptions; +} +/* extracted from optmain.tlib near line 1245 */ + +/** + * The directory containing the data associated with ntpdc. + */ +#ifndef PKGDATADIR +# define PKGDATADIR "" +#endif + +/** + * Information about the person or institution that packaged ntpdc + * for the current distribution. + */ +#ifndef WITH_PACKAGER +# define ntpdc_packager_info NULL +#else +/** Packager information for ntpdc. */ +static char const ntpdc_packager_info[] = + "Packaged by " WITH_PACKAGER + +# ifdef WITH_PACKAGER_VERSION + " ("WITH_PACKAGER_VERSION")" +# endif + +# ifdef WITH_PACKAGER_BUG_REPORTS + "\nReport ntpdc bugs to " WITH_PACKAGER_BUG_REPORTS +# endif + "\n"; +#endif +#ifndef __doxygen__ + +#endif /* __doxygen__ */ +/** + * The option definitions for ntpdc. The one structure that + * binds them all. + */ +tOptions ntpdcOptions = { + OPTIONS_STRUCT_VERSION, + 0, NULL, /* original argc + argv */ + ( OPTPROC_BASE + + OPTPROC_ERRSTOP + + OPTPROC_SHORTOPT + + OPTPROC_LONGOPT + + OPTPROC_NO_REQ_OPT + + OPTPROC_ENVIRON + + OPTPROC_MISUSE ), + 0, NULL, /* current option index, current option */ + NULL, NULL, zPROGNAME, + zRcName, zCopyright, zLicenseDescrip, + zFullVersion, apzHomeList, zUsageTitle, + zExplain, zDetail, optDesc, + zBugsAddr, /* address to send bugs to */ + NULL, NULL, /* extensions/saved state */ + optionUsage, /* usage procedure */ + translate_option_strings, /* translation procedure */ + /* + * Indexes to special options + */ + { INDEX_OPT_MORE_HELP, /* more-help option index */ + INDEX_OPT_SAVE_OPTS, /* save option index */ + NO_EQUIVALENT, /* '-#' option index */ + NO_EQUIVALENT /* index of default opt */ + }, + 15 /* full option count */, 10 /* user option count */, + ntpdc_full_usage, ntpdc_short_usage, + NULL, NULL, + PKGDATADIR, ntpdc_packager_info +}; + +#if ENABLE_NLS +/** + * This code is designed to translate translatable option text for the + * ntpdc program. These translations happen upon entry + * to optionProcess(). + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#ifdef HAVE_DCGETTEXT +# include <gettext.h> +#endif +#include <autoopts/usage-txt.h> + +static char * AO_gettext(char const * pz); +static void coerce_it(void ** s); + +/** + * AutoGen specific wrapper function for gettext. It relies on the macro _() + * to convert from English to the target language, then strdup-duplicates the + * result string. It tries the "libopts" domain first, then whatever has been + * set via the \a textdomain(3) call. + * + * @param[in] pz the input text used as a lookup key. + * @returns the translated text (if there is one), + * or the original text (if not). + */ +static char * +AO_gettext(char const * pz) +{ + char * res; + if (pz == NULL) + return NULL; +#ifdef HAVE_DCGETTEXT + /* + * While processing the option_xlateable_txt data, try to use the + * "libopts" domain. Once we switch to the option descriptor data, + * do *not* use that domain. + */ + if (option_xlateable_txt.field_ct != 0) { + res = dgettext("libopts", pz); + if (res == pz) + res = (char *)(void *)_(pz); + } else + res = (char *)(void *)_(pz); +#else + res = (char *)(void *)_(pz); +#endif + if (res == pz) + return res; + res = strdup(res); + if (res == NULL) { + fputs(_("No memory for duping translated strings\n"), stderr); + exit(NTPDC_EXIT_FAILURE); + } + return res; +} + +/** + * All the pointers we use are marked "* const", but they are stored in + * writable memory. Coerce the mutability and set the pointer. + */ +static void coerce_it(void ** s) { *s = AO_gettext(*s); +} + +/** + * Translate all the translatable strings in the ntpdcOptions + * structure defined above. This is done only once. + */ +static void +translate_option_strings(void) +{ + tOptions * const opts = &ntpdcOptions; + + /* + * Guard against re-translation. It won't work. The strings will have + * been changed by the first pass through this code. One shot only. + */ + if (option_xlateable_txt.field_ct != 0) { + /* + * Do the translations. The first pointer follows the field count + * field. The field count field is the size of a pointer. + */ + char ** ppz = (char**)(void*)&(option_xlateable_txt); + int ix = option_xlateable_txt.field_ct; + + do { + ppz++; /* skip over field_ct */ + *ppz = AO_gettext(*ppz); + } while (--ix > 0); + /* prevent re-translation and disable "libopts" domain lookup */ + option_xlateable_txt.field_ct = 0; + + coerce_it((void*)&(opts->pzCopyright)); + coerce_it((void*)&(opts->pzCopyNotice)); + coerce_it((void*)&(opts->pzFullVersion)); + coerce_it((void*)&(opts->pzUsageTitle)); + coerce_it((void*)&(opts->pzExplain)); + coerce_it((void*)&(opts->pzDetail)); + { + tOptDesc * od = opts->pOptDesc; + for (ix = opts->optCt; ix > 0; ix--, od++) + coerce_it((void*)&(od->pzText)); + } + } +} +#endif /* ENABLE_NLS */ + +#ifdef DO_NOT_COMPILE_THIS_CODE_IT_IS_FOR_GETTEXT +/** I18N function strictly for xgettext. Do not compile. */ +static void bogus_function(void) { + /* TRANSLATORS: + + The following dummy function was crated solely so that xgettext can + extract the correct strings. These strings are actually referenced + by a field name in the ntpdcOptions structure noted in the + comments below. The literal text is defined in ntpdc_opt_strs. + + NOTE: the strings below are segmented with respect to the source string + ntpdc_opt_strs. The strings above are handed off for translation + at run time a paragraph at a time. Consequently, they are presented here + for translation a paragraph at a time. + + ALSO: often the description for an option will reference another option + by name. These are set off with apostrophe quotes (I hope). Do not + translate option names. + */ + /* referenced via ntpdcOptions.pzCopyright */ + puts(_("ntpdc 4.2.7p482\n\ +Copyright (C) 1970-2014 The University of Delaware, all rights reserved.\n\ +This is free software. It is licensed for use, modification and\n\ +redistribution under the terms of the NTP License, copies of which\n\ +can be seen at:\n")); + puts(_(" <http://ntp.org/license>\n\ + <http://opensource.org/licenses/ntp-license.php>\n")); + + /* referenced via ntpdcOptions.pzCopyNotice */ + puts(_("Permission to use, copy, modify, and distribute this software and its\n\ +documentation for any purpose with or without fee is hereby granted,\n\ +provided that the above copyright notice appears in all copies and that\n\ +both the copyright notice and this permission notice appear in supporting\n\ +documentation, and that the name The University of Delaware not be used in\n\ +advertising or publicity pertaining to distribution of the software without\n\ +specific, written prior permission. The University of Delaware makes no\n\ +representations about the suitability this software for any purpose. It is\n\ +provided \"as is\" without express or implied warranty.\n")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("Force IPv4 DNS name resolution")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("Force IPv6 DNS name resolution")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("run a command and exit")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("Increase debug verbosity level")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("Set the debug verbosity level")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("Force ntpq to operate in interactive mode")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("Print a list of the peers")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("numeric host addresses")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("Print a list of the peers")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("Show a list of the peers")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("display extended usage information and exit")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("extended usage information passed thru pager")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("output version information and exit")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("save the option state to a config file")); + + /* referenced via ntpdcOptions.pOptDesc->pzText */ + puts(_("load options from a config file")); + + /* referenced via ntpdcOptions.pzUsageTitle */ + puts(_("ntpdc - vendor-specific NTPD control program - Ver. 4.2.7p482\n\ +Usage: %s [ -<flag> [<val>] | --<name>[{=| }<val>] ]... [ host ...]\n")); + + /* referenced via ntpdcOptions.pzExplain */ + puts(_("\n")); + + /* referenced via ntpdcOptions.pzFullVersion */ + puts(_("ntpdc 4.2.7p482")); + + /* referenced via ntpdcOptions.pzFullUsage */ + puts(_("<<<NOT-FOUND>>>")); + + /* referenced via ntpdcOptions.pzShortUsage */ + puts(_("<<<NOT-FOUND>>>")); + /* LIBOPTS-MESSAGES: */ +#line 67 "../autoopts.c" + puts(_("allocation of %d bytes failed\n")); +#line 93 "../autoopts.c" + puts(_("allocation of %d bytes failed\n")); +#line 53 "../init.c" + puts(_("AutoOpts function called without option descriptor\n")); +#line 86 "../init.c" + puts(_("\tThis exceeds the compiled library version: ")); +#line 84 "../init.c" + puts(_("Automated Options Processing Error!\n" + "\t%s called AutoOpts function with structure version %d:%d:%d.\n")); +#line 80 "../autoopts.c" + puts(_("realloc of %d bytes at 0x%p failed\n")); +#line 88 "../init.c" + puts(_("\tThis is less than the minimum library version: ")); +#line 121 "../version.c" + puts(_("Automated Options version %s\n" + "\tCopyright (C) 1999-2014 by Bruce Korb - all rights reserved\n")); +#line 82 "../makeshell.c" + puts(_("(AutoOpts bug): %s.\n")); +#line 90 "../reset.c" + puts(_("optionResetOpt() called, but reset-option not configured")); +#line 292 "../usage.c" + puts(_("could not locate the 'help' option")); +#line 336 "../autoopts.c" + puts(_("optionProcess() was called with invalid data")); +#line 748 "../usage.c" + puts(_("invalid argument type specified")); +#line 598 "../find.c" + puts(_("defaulted to option with optional arg")); +#line 76 "../alias.c" + puts(_("aliasing option is out of range.")); +#line 234 "../enum.c" + puts(_("%s error: the keyword '%s' is ambiguous for %s\n")); +#line 108 "../find.c" + puts(_(" The following options match:\n")); +#line 293 "../find.c" + puts(_("%s: ambiguous option name: %s (matches %d options)\n")); +#line 161 "../check.c" + puts(_("%s: Command line arguments required\n")); +#line 43 "../alias.c" + puts(_("%d %s%s options allowed\n")); +#line 89 "../makeshell.c" + puts(_("%s error %d (%s) calling %s for '%s'\n")); +#line 301 "../makeshell.c" + puts(_("interprocess pipe")); +#line 168 "../version.c" + puts(_("error: version option argument '%c' invalid. Use:\n" + "\t'v' - version only\n" + "\t'c' - version and copyright\n" + "\t'n' - version and full copyright notice\n")); +#line 58 "../check.c" + puts(_("%s error: the '%s' and '%s' options conflict\n")); +#line 217 "../find.c" + puts(_("%s: The '%s' option has been disabled.")); +#line 430 "../find.c" + puts(_("%s: The '%s' option has been disabled.")); +#line 38 "../alias.c" + puts(_("-equivalence")); +#line 469 "../find.c" + puts(_("%s: illegal option -- %c\n")); +#line 110 "../reset.c" + puts(_("%s: illegal option -- %c\n")); +#line 271 "../find.c" + puts(_("%s: illegal option -- %s\n")); +#line 755 "../find.c" + puts(_("%s: illegal option -- %s\n")); +#line 118 "../reset.c" + puts(_("%s: illegal option -- %s\n")); +#line 335 "../find.c" + puts(_("%s: unknown vendor extension option -- %s\n")); +#line 159 "../enum.c" + puts(_(" or an integer from %d through %d\n")); +#line 169 "../enum.c" + puts(_(" or an integer from %d through %d\n")); +#line 747 "../usage.c" + puts(_("%s error: invalid option descriptor for %s\n")); +#line 1081 "../usage.c" + puts(_("%s error: invalid option descriptor for %s\n")); +#line 385 "../find.c" + puts(_("%s: invalid option name: %s\n")); +#line 527 "../find.c" + puts(_("%s: The '%s' option requires an argument.\n")); +#line 156 "../autoopts.c" + puts(_("(AutoOpts bug): Equivalenced option '%s' was equivalenced to both\n" + "\t'%s' and '%s'.")); +#line 94 "../check.c" + puts(_("%s error: The %s option is required\n")); +#line 632 "../find.c" + puts(_("%s: The '%s' option cannot have an argument.\n")); +#line 151 "../check.c" + puts(_("%s: Command line arguments are not allowed.\n")); +#line 535 "../save.c" + puts(_("error %d (%s) creating %s\n")); +#line 234 "../enum.c" + puts(_("%s error: '%s' does not match any %s keywords.\n")); +#line 93 "../reset.c" + puts(_("%s error: The '%s' option requires an argument.\n")); +#line 184 "../save.c" + puts(_("error %d (%s) stat-ing %s\n")); +#line 238 "../save.c" + puts(_("error %d (%s) stat-ing %s\n")); +#line 143 "../restore.c" + puts(_("%s error: no saved option state\n")); +#line 231 "../autoopts.c" + puts(_("'%s' is not a command line option.\n")); +#line 111 "../time.c" + puts(_("%s error: '%s' is not a recognizable date/time.\n")); +#line 132 "../save.c" + puts(_("'%s' not defined\n")); +#line 50 "../time.c" + puts(_("%s error: '%s' is not a recognizable time duration.\n")); +#line 92 "../check.c" + puts(_("%s error: The %s option must appear %d times.\n")); +#line 164 "../numeric.c" + puts(_("%s error: '%s' is not a recognizable number.\n")); +#line 200 "../enum.c" + puts(_("%s error: %s exceeds %s keyword count\n")); +#line 330 "../usage.c" + puts(_("Try '%s %s' for more information.\n")); +#line 45 "../alias.c" + puts(_("one %s%s option allowed\n")); +#line 203 "../makeshell.c" + puts(_("standard output")); +#line 938 "../makeshell.c" + puts(_("standard output")); +#line 274 "../usage.c" + puts(_("standard output")); +#line 415 "../usage.c" + puts(_("standard output")); +#line 625 "../usage.c" + puts(_("standard output")); +#line 175 "../version.c" + puts(_("standard output")); +#line 274 "../usage.c" + puts(_("standard error")); +#line 415 "../usage.c" + puts(_("standard error")); +#line 625 "../usage.c" + puts(_("standard error")); +#line 175 "../version.c" + puts(_("standard error")); +#line 203 "../makeshell.c" + puts(_("write")); +#line 938 "../makeshell.c" + puts(_("write")); +#line 273 "../usage.c" + puts(_("write")); +#line 414 "../usage.c" + puts(_("write")); +#line 624 "../usage.c" + puts(_("write")); +#line 174 "../version.c" + puts(_("write")); +#line 60 "../numeric.c" + puts(_("%s error: %s option value %ld is out of range.\n")); +#line 44 "../check.c" + puts(_("%s error: %s option requires the %s option\n")); +#line 131 "../save.c" + puts(_("%s warning: cannot save options - %s not regular file\n")); +#line 183 "../save.c" + puts(_("%s warning: cannot save options - %s not regular file\n")); +#line 237 "../save.c" + puts(_("%s warning: cannot save options - %s not regular file\n")); +#line 256 "../save.c" + puts(_("%s warning: cannot save options - %s not regular file\n")); +#line 534 "../save.c" + puts(_("%s warning: cannot save options - %s not regular file\n")); + /* END-LIBOPTS-MESSAGES */ + + /* USAGE-TEXT: */ +#line 873 "../usage.c" + puts(_("\t\t\t\t- an alternate for '%s'\n")); +#line 1148 "../usage.c" + puts(_("Version, usage and configuration options:")); +#line 924 "../usage.c" + puts(_("\t\t\t\t- default option for unnamed options\n")); +#line 837 "../usage.c" + puts(_("\t\t\t\t- disabled as '--%s'\n")); +#line 1117 "../usage.c" + puts(_(" --- %-14s %s\n")); +#line 1115 "../usage.c" + puts(_("This option has been disabled")); +#line 864 "../usage.c" + puts(_("\t\t\t\t- enabled by default\n")); +#line 40 "../alias.c" + puts(_("%s error: only ")); +#line 1194 "../usage.c" + puts(_(" - examining environment variables named %s_*\n")); +#line 168 "../file.c" + puts(_("\t\t\t\t- file must not pre-exist\n")); +#line 172 "../file.c" + puts(_("\t\t\t\t- file must pre-exist\n")); +#line 380 "../usage.c" + puts(_("Options are specified by doubled hyphens and their name or by a single\n" + "hyphen and the flag character.\n")); +#line 916 "../makeshell.c" + puts(_("\n" + "= = = = = = = =\n\n" + "This incarnation of genshell will produce\n" + "a shell script to parse the options for %s:\n\n")); +#line 166 "../enum.c" + puts(_(" or an integer mask with any of the lower %d bits set\n")); +#line 897 "../usage.c" + puts(_("\t\t\t\t- is a set membership option\n")); +#line 918 "../usage.c" + puts(_("\t\t\t\t- must appear between %d and %d times\n")); +#line 382 "../usage.c" + puts(_("Options are specified by single or double hyphens and their name.\n")); +#line 904 "../usage.c" + puts(_("\t\t\t\t- may appear multiple times\n")); +#line 891 "../usage.c" + puts(_("\t\t\t\t- may not be preset\n")); +#line 1309 "../usage.c" + puts(_(" Arg Option-Name Description\n")); +#line 1245 "../usage.c" + puts(_(" Flg Arg Option-Name Description\n")); +#line 1303 "../usage.c" + puts(_(" Flg Arg Option-Name Description\n")); +#line 1304 "../usage.c" + puts(_(" %3s %s")); +#line 1310 "../usage.c" + puts(_(" %3s %s")); +#line 387 "../usage.c" + puts(_("The '-#<number>' option may omit the hash char\n")); +#line 383 "../usage.c" + puts(_("All arguments are named options.\n")); +#line 971 "../usage.c" + puts(_(" - reading file %s")); +#line 409 "../usage.c" + puts(_("\n" + "Please send bug reports to: <%s>\n")); +#line 100 "../version.c" + puts(_("\n" + "Please send bug reports to: <%s>\n")); +#line 129 "../version.c" + puts(_("\n" + "Please send bug reports to: <%s>\n")); +#line 903 "../usage.c" + puts(_("\t\t\t\t- may NOT appear - preset only\n")); +#line 944 "../usage.c" + puts(_("\n" + "The following option preset mechanisms are supported:\n")); +#line 1192 "../usage.c" + puts(_("\n" + "The following option preset mechanisms are supported:\n")); +#line 682 "../usage.c" + puts(_("prohibits these options:\n")); +#line 677 "../usage.c" + puts(_("prohibits the option '%s'\n")); +#line 81 "../numeric.c" + puts(_("%s%ld to %ld")); +#line 79 "../numeric.c" + puts(_("%sgreater than or equal to %ld")); +#line 75 "../numeric.c" + puts(_("%s%ld exactly")); +#line 68 "../numeric.c" + puts(_("%sit must lie in one of the ranges:\n")); +#line 68 "../numeric.c" + puts(_("%sit must be in the range:\n")); +#line 88 "../numeric.c" + puts(_(", or\n")); +#line 66 "../numeric.c" + puts(_("%sis scalable with a suffix: k/K/m/M/g/G/t/T\n")); +#line 77 "../numeric.c" + puts(_("%sless than or equal to %ld")); +#line 390 "../usage.c" + puts(_("Operands and options may be intermixed. They will be reordered.\n")); +#line 652 "../usage.c" + puts(_("requires the option '%s'\n")); +#line 655 "../usage.c" + puts(_("requires these options:\n")); +#line 1321 "../usage.c" + puts(_(" Arg Option-Name Req? Description\n")); +#line 1315 "../usage.c" + puts(_(" Flg Arg Option-Name Req? Description\n")); +#line 167 "../enum.c" + puts(_("or you may use a numeric representation. Preceding these with a '!'\n" + "will clear the bits, specifying 'none' will clear all bits, and 'all'\n" + "will set them all. Multiple entries may be passed as an option\n" + "argument list.\n")); +#line 910 "../usage.c" + puts(_("\t\t\t\t- may appear up to %d times\n")); +#line 77 "../enum.c" + puts(_("The valid \"%s\" option keywords are:\n")); +#line 1152 "../usage.c" + puts(_("The next option supports vendor supported extra options:")); +#line 773 "../usage.c" + puts(_("These additional options are:")); + /* END-USAGE-TEXT */ +} +#endif /* uncompilable code */ +#ifdef __cplusplus +} +#endif +/* ntpdc-opts.c ends here */ diff --git a/ntpdc/ntpdc-opts.def b/ntpdc/ntpdc-opts.def new file mode 100644 index 0000000..df3350e --- /dev/null +++ b/ntpdc/ntpdc-opts.def @@ -0,0 +1,812 @@ +/* -*- Mode: Text -*- */ + +autogen definitions options; + +#include autogen-version.def +#include copyright.def + +prog-name = "ntpdc"; +prog-title = "vendor-specific NTPD control program"; +argument = '[ host ...]'; + +#include homerc.def + +flag = { + name = ipv4; + value = 4; + flags-cant = ipv6; + 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; + flags-cant = 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 = command; + value = c; + arg-type = string; + descrip = "run a command and exit"; + max = NOLIMIT; + arg-name = cmd; + stack-arg; + doc = <<- _EndOfDoc_ + The following argument is interpreted as an interactive format command + and is added to the list of commands to be executed on the specified + host(s). + _EndOfDoc_; +}; + +#include debug-opt.def + +flag = { + name = interactive; + value = i; + flags-cant = command, listpeers, peers, showpeers; + descrip = "Force ntpq to operate in interactive mode"; + doc = <<- _EndOfDoc_ + Force ntpq to operate in interactive mode. Prompts will be written + to the standard output and commands read from the standard input. + _EndOfDoc_; +}; + +flag = { + name = listpeers; + value = l; + descrip = "Print a list of the peers"; + flags-cant = command; + doc = <<- _EndOfDoc_ + Print a list of the peers known to the server as well as a summary of + their state. This is equivalent to the 'listpeers' interactive command. + _EndOfDoc_; +}; + +flag = { + name = numeric; + value = n; + descrip = "numeric host addresses"; + doc = <<- _EndOfDoc_ + Output all host addresses in dotted-quad numeric format rather than + converting to the canonical host names. + _EndOfDoc_; +}; + +flag = { + name = peers; + value = p; + descrip = "Print a list of the peers"; + flags-cant = command; + doc = <<- _EndOfDoc_ + Print a list of the peers known to the server as well as a summary + of their state. This is equivalent to the 'peers' interactive command. + _EndOfDoc_; +}; + +flag = { + name = showpeers; + value = s; + descrip = "Show a list of the peers"; + flags-cant = command; + doc = <<- _EndOfDoc_ + Print a list of the peers known to the server as well as a summary + of their state. This is equivalent to the 'dmpeers' interactive command. + _EndOfDoc_; +}; + +/* explain: Additional information whenever the usage routine is invoked */ +explain = <<- _END_EXPLAIN + _END_EXPLAIN; + +doc-section = { + ds-type = 'DESCRIPTION'; + ds-format = 'mdoc'; + ds-text = <<- _END_PROG_MDOC_DESCRIP +.Nm +is deprecated. +Please use +.Xr ntpq 1ntpqmdoc instead - it can do everything +.Nm +used to do, and it does so using a much more sane interface. +.Pp +.Nm +is a utility program used to query +.Xr ntpd 1ntpdmdoc +about its +current state and to request changes in that state. +It uses NTP mode 7 control message formats described in the source code. +The program may +be run either in interactive mode or controlled using command line +arguments. +Extensive state and statistics information is available +through the +.Nm +interface. +In addition, nearly all the +configuration options which can be specified at startup using +ntpd's configuration file may also be specified at run time using +.Nm . + _END_PROG_MDOC_DESCRIP; +}; + + +doc-section = { + ds-type = 'USAGE'; + ds-format = 'mdoc'; + ds-text = <<- _END_MDOC_USAGE +If one or more request options are included on the command line +when +.Nm +is executed, each of the requests will be sent +to the NTP servers running on each of the hosts given as command +line arguments, or on localhost by default. +If no request options +are given, +.Nm +will attempt to read commands from the +standard input and execute these on the NTP server running on the +first host given on the command line, again defaulting to localhost +when no other host is specified. +The +.Nm +utility will prompt for +commands if the standard input is a terminal device. +.Pp +The +.Nm +utility uses NTP mode 7 packets to communicate with the +NTP server, and hence can be used to query any compatible server on +the network which permits it. +Note that since NTP is a UDP protocol +this communication will be somewhat unreliable, especially over +large distances in terms of network topology. +The +.Nm +utility makes +no attempt to retransmit requests, and will time requests out if +the remote host is not heard from within a suitable timeout +time. +.Pp +The operation of +.Nm +are specific to the particular +implementation of the +.Xr ntpd 1ntpdmdoc +daemon and can be expected to +work only with this and maybe some previous versions of the daemon. +Requests from a remote +.Nm +utility which affect the +state of the local server must be authenticated, which requires +both the remote program and local server share a common key and key +identifier. +.Pp +Note that in contexts where a host name is expected, a +.Fl 4 +qualifier preceding the host name forces DNS resolution to the IPv4 namespace, +while a +.Fl 6 +qualifier forces DNS resolution to the IPv6 namespace. +Specifying a command line option other than +.Fl i +or +.Fl n +will cause the specified query (queries) to be sent to +the indicated host(s) immediately. +Otherwise, +.Nm +will +attempt to read interactive format commands from the standard +input. +.Ss "Interactive Commands" +Interactive format commands consist of a keyword followed by zero +to four arguments. +Only enough characters of the full keyword to +uniquely identify the command need be typed. +The output of a +command is normally sent to the standard output, but optionally the +output of individual commands may be sent to a file by appending a +.Ql \&> , +followed by a file name, to the command line. +.Pp +A number of interactive format commands are executed entirely +within the +.Nm +utility itself and do not result in NTP +mode 7 requests being sent to a server. +These are described +following. +.Bl -tag -width indent +.It Ic \&? Ar command_keyword +.It Ic help Ar command_keyword +A +.Sq Ic \&? +will print a list of all the command +keywords known to this incarnation of +.Nm . +A +.Sq Ic \&? +followed by a command keyword will print function and usage +information about the command. +This command is probably a better +source of information about +.Xr ntpq 1ntpqmdoc +than this manual +page. +.It Ic delay Ar milliseconds +Specify a time interval to be added to timestamps included in +requests which require authentication. +This is used to enable +(unreliable) server reconfiguration over long delay network paths +or between machines whose clocks are unsynchronized. +Actually the +server does not now require timestamps in authenticated requests, +so this command may be obsolete. +.It Ic host Ar hostname +Set the host to which future queries will be sent. +Hostname may +be either a host name or a numeric address. +.It Ic hostnames Op Cm yes | Cm no +If +.Cm yes +is specified, host names are printed in +information displays. +If +.Cm no +is specified, numeric +addresses are printed instead. +The default is +.Cm yes , +unless +modified using the command line +.Fl n +switch. +.It Ic keyid Ar keyid +This command allows the specification of a key number to be +used to authenticate configuration requests. +This must correspond +to a key number the server has been configured to use for this +purpose. +.It Ic quit +Exit +.Nm . +.It Ic passwd +This command prompts you to type in a password (which will not +be echoed) which will be used to authenticate configuration +requests. +The password must correspond to the key configured for +use by the NTP server for this purpose if such requests are to be +successful. +.It Ic timeout Ar milliseconds +Specify a timeout period for responses to server queries. +The +default is about 8000 milliseconds. +Note that since +.Nm +retries each query once after a timeout, the total waiting time for +a timeout will be twice the timeout value set. +.El +.Ss "Control Message Commands" +Query commands result in NTP mode 7 packets containing requests for +information being sent to the server. +These are read-only commands +in that they make no modification of the server configuration +state. +.Bl -tag -width indent +.It Ic listpeers +Obtains and prints a brief list of the peers for which the +server is maintaining state. +These should include all configured +peer associations as well as those peers whose stratum is such that +they are considered by the server to be possible future +synchronization candidates. +.It Ic peers +Obtains a list of peers for which the server is maintaining +state, along with a summary of that state. +Summary information +includes the address of the remote peer, the local interface +address (0.0.0.0 if a local address has yet to be determined), the +stratum of the remote peer (a stratum of 16 indicates the remote +peer is unsynchronized), the polling interval, in seconds, the +reachability register, in octal, and the current estimated delay, +offset and dispersion of the peer, all in seconds. +.Pp +The character in the left margin indicates the mode this peer +entry is operating in. +A +.Ql \&+ +denotes symmetric active, a +.Ql \&- +indicates symmetric passive, a +.Ql \&= +means the +remote server is being polled in client mode, a +.Ql \&^ +indicates that the server is broadcasting to this address, a +.Ql \&~ +denotes that the remote peer is sending broadcasts and a +.Ql \&~ +denotes that the remote peer is sending broadcasts and a +.Ql \&* +marks the peer the server is currently synchronizing +to. +.Pp +The contents of the host field may be one of four forms. +It may +be a host name, an IP address, a reference clock implementation +name with its parameter or +.Fn REFCLK "implementation_number" "parameter" . +On +.Ic hostnames +.Cm no +only IP-addresses +will be displayed. +.It Ic dmpeers +A slightly different peer summary list. +Identical to the output +of the +.Ic peers +command, except for the character in the +leftmost column. +Characters only appear beside peers which were +included in the final stage of the clock selection algorithm. +A +.Ql \&. +indicates that this peer was cast off in the falseticker +detection, while a +.Ql \&+ +indicates that the peer made it +through. +A +.Ql \&* +denotes the peer the server is currently +synchronizing with. +.It Ic showpeer Ar peer_address Oo Ar ... Oc +Shows a detailed display of the current peer variables for one +or more peers. +Most of these values are described in the NTP +Version 2 specification. +.It Ic pstats Ar peer_address Oo Ar ... Oc +Show per-peer statistic counters associated with the specified +peer(s). +.It Ic clockstat Ar clock_peer_address Oo Ar ... Oc +Obtain and print information concerning a peer clock. +The +values obtained provide information on the setting of fudge factors +and other clock performance information. +.It Ic kerninfo +Obtain and print kernel phase-lock loop operating parameters. +This information is available only if the kernel has been specially +modified for a precision timekeeping function. +.It Ic loopinfo Op Cm oneline | Cm multiline +Print the values of selected loop filter variables. +The loop +filter is the part of NTP which deals with adjusting the local +system clock. +The +.Sq offset +is the last offset given to the +loop filter by the packet processing code. +The +.Sq frequency +is the frequency error of the local clock in parts-per-million +(ppm). +The +.Sq time_const +controls the stiffness of the +phase-lock loop and thus the speed at which it can adapt to +oscillator drift. +The +.Sq watchdog timer +value is the number +of seconds which have elapsed since the last sample offset was +given to the loop filter. +The +.Cm oneline +and +.Cm multiline +options specify the format in which this +information is to be printed, with +.Cm multiline +as the +default. +.It Ic sysinfo +Print a variety of system state variables, i.e., state related +to the local server. +All except the last four lines are described +in the NTP Version 3 specification, RFC-1305. +.Pp +The +.Sq system flags +show various system flags, some of +which can be set and cleared by the +.Ic enable +and +.Ic disable +configuration commands, respectively. +These are +the +.Cm auth , +.Cm bclient , +.Cm monitor , +.Cm pll , +.Cm pps +and +.Cm stats +flags. +See the +.Xr ntpd 1ntpdmdoc +documentation for the meaning of these flags. +There +are two additional flags which are read only, the +.Cm kernel_pll +and +.Cm kernel_pps . +These flags indicate +the synchronization status when the precision time kernel +modifications are in use. +The +.Sq kernel_pll +indicates that +the local clock is being disciplined by the kernel, while the +.Sq kernel_pps +indicates the kernel discipline is provided by the PPS +signal. +.Pp +The +.Sq stability +is the residual frequency error remaining +after the system frequency correction is applied and is intended for +maintenance and debugging. +In most architectures, this value will +initially decrease from as high as 500 ppm to a nominal value in +the range .01 to 0.1 ppm. +If it remains high for some time after +starting the daemon, something may be wrong with the local clock, +or the value of the kernel variable +.Va kern.clockrate.tick +may be +incorrect. +.Pp +The +.Sq broadcastdelay +shows the default broadcast delay, +as set by the +.Ic broadcastdelay +configuration command. +.Pp +The +.Sq authdelay +shows the default authentication delay, +as set by the +.Ic authdelay +configuration command. +.It Ic sysstats +Print statistics counters maintained in the protocol +module. +.It Ic memstats +Print statistics counters related to memory allocation +code. +.It Ic iostats +Print statistics counters maintained in the input-output +module. +.It Ic timerstats +Print statistics counters maintained in the timer/event queue +support code. +.It Ic reslist +Obtain and print the server's restriction list. +This list is +(usually) printed in sorted order and may help to understand how +the restrictions are applied. +.It Ic monlist Op Ar version +Obtain and print traffic counts collected and maintained by the +monitor facility. +The version number should not normally need to be +specified. +.It Ic clkbug Ar clock_peer_address Oo Ar ... Oc +Obtain debugging information for a reference clock driver. +This +information is provided only by some clock drivers and is mostly +undecodable without a copy of the driver source in hand. +.El +.Ss "Runtime Configuration Requests" +All requests which cause state changes in the server are +authenticated by the server using a configured NTP key (the +facility can also be disabled by the server by not configuring a +key). +The key number and the corresponding key must also be made +known to +.Nm . +This can be done using the +.Ic keyid +and +.Ic passwd +commands, the latter of which will prompt at the terminal for a +password to use as the encryption key. +You will also be prompted +automatically for both the key number and password the first time a +command which would result in an authenticated request to the +server is given. +Authentication not only provides verification that +the requester has permission to make such changes, but also gives +an extra degree of protection again transmission errors. +.Pp +Authenticated requests always include a timestamp in the packet +data, which is included in the computation of the authentication +code. +This timestamp is compared by the server to its receive time +stamp. +If they differ by more than a small amount the request is +rejected. +This is done for two reasons. +First, it makes simple +replay attacks on the server, by someone who might be able to +overhear traffic on your LAN, much more difficult. +Second, it makes +it more difficult to request configuration changes to your server +from topologically remote hosts. +While the reconfiguration facility +will work well with a server on the local host, and may work +adequately between time-synchronized hosts on the same LAN, it will +work very poorly for more distant hosts. +As such, if reasonable +passwords are chosen, care is taken in the distribution and +protection of keys and appropriate source address restrictions are +applied, the run time reconfiguration facility should provide an +adequate level of security. +.Pp +The following commands all make authenticated requests. +.Bl -tag -width indent +.It Xo Ic addpeer Ar peer_address +.Op Ar keyid +.Op Ar version +.Op Cm prefer +.Xc +Add a configured peer association at the given address and +operating in symmetric active mode. +Note that an existing +association with the same peer may be deleted when this command is +executed, or may simply be converted to conform to the new +configuration, as appropriate. +If the optional +.Ar keyid +is a +nonzero integer, all outgoing packets to the remote server will +have an authentication field attached encrypted with this key. +If +the value is 0 (or not given) no authentication will be done. +The +.Ar version +can be 1, 2 or 3 and defaults to 3. +The +.Cm prefer +keyword indicates a preferred peer (and thus will +be used primarily for clock synchronisation if possible). +The +preferred peer also determines the validity of the PPS signal - if +the preferred peer is suitable for synchronisation so is the PPS +signal. +.It Xo Ic addserver Ar peer_address +.Op Ar keyid +.Op Ar version +.Op Cm prefer +.Xc +Identical to the addpeer command, except that the operating +mode is client. +.It Xo Ic broadcast Ar peer_address +.Op Ar keyid +.Op Ar version +.Op Cm prefer +.Xc +Identical to the addpeer command, except that the operating +mode is broadcast. +In this case a valid key identifier and key are +required. +The +.Ar peer_address +parameter can be the broadcast +address of the local network or a multicast group address assigned +to NTP. +If a multicast address, a multicast-capable kernel is +required. +.It Ic unconfig Ar peer_address Oo Ar ... Oc +This command causes the configured bit to be removed from the +specified peer(s). +In many cases this will cause the peer +association to be deleted. +When appropriate, however, the +association may persist in an unconfigured mode if the remote peer +is willing to continue on in this fashion. +.It Xo Ic fudge Ar peer_address +.Op Cm time1 +.Op Cm time2 +.Op Ar stratum +.Op Ar refid +.Xc +This command provides a way to set certain data for a reference +clock. +See the source listing for further information. +.It Xo Ic enable +.Oo +.Cm auth | Cm bclient | +.Cm calibrate | Cm kernel | +.Cm monitor | Cm ntp | +.Cm pps | Cm stats +.Oc +.Xc +.It Xo Ic disable +.Oo +.Cm auth | Cm bclient | +.Cm calibrate | Cm kernel | +.Cm monitor | Cm ntp | +.Cm pps | Cm stats +.Oc +.Xc +These commands operate in the same way as the +.Ic enable +and +.Ic disable +configuration file commands of +.Xr ntpd 1ntpdmdoc . +.Bl -tag -width indent +.It Cm auth +Enables the server to synchronize with unconfigured peers only +if the peer has been correctly authenticated using either public key +or private key cryptography. +The default for this flag is enable. +.It Cm bclient +Enables the server to listen for a message from a broadcast or +multicast server, as in the multicastclient command with +default address. +The default for this flag is disable. +.It Cm calibrate +Enables the calibrate feature for reference clocks. +The default for this flag is disable. +.It Cm kernel +Enables the kernel time discipline, if available. +The default for this flag is enable if support is available, otherwise disable. +.It Cm monitor +Enables the monitoring facility. +See the documentation here about the +.Cm monlist +command or further information. +The default for this flag is enable. +.It Cm ntp +Enables time and frequency discipline. +In effect, this switch opens and closes the feedback loop, +which is useful for testing. +The default for this flag is enable. +.It Cm pps +Enables the pulse-per-second (PPS) signal when frequency +and time is disciplined by the precision time kernel modifications. +See the +.Qq A Kernel Model for Precision Timekeeping +(available as part of the HTML documentation +provided in +.Pa /usr/share/doc/ntp ) +page for further information. +The default for this flag is disable. +.It Cm stats +Enables the statistics facility. +See the +.Sx Monitoring Options +section of +.Xr ntp.conf 5 +for further information. +The default for this flag is disable. +.El +.It Xo Ic restrict Ar address Ar mask +.Ar flag Oo Ar ... Oc +.Xc +This command operates in the same way as the +.Ic restrict +configuration file commands of +.Xr ntpd 1ntpdmdoc . +.It Xo Ic unrestrict Ar address Ar mask +.Ar flag Oo Ar ... Oc +.Xc +Unrestrict the matching entry from the restrict list. +.It Xo Ic delrestrict Ar address Ar mask +.Op Cm ntpport +.Xc +Delete the matching entry from the restrict list. +.It Ic readkeys +Causes the current set of authentication keys to be purged and +a new set to be obtained by rereading the keys file (which must +have been specified in the +.Xr ntpd 1ntpdmdoc +configuration file). +This +allows encryption keys to be changed without restarting the +server. +.It Ic trustedkey Ar keyid Oo Ar ... Oc +.It Ic untrustedkey Ar keyid Oo Ar ... Oc +These commands operate in the same way as the +.Ic trustedkey +and +.Ic untrustedkey +configuration file +commands of +.Xr ntpd 1ntpdmdoc . +.It Ic authinfo +Returns information concerning the authentication module, +including known keys and counts of encryptions and decryptions +which have been done. +.It Ic traps +Display the traps set in the server. +See the source listing for +further information. +.It Xo Ic addtrap Ar address +.Op Ar port +.Op Ar interface +.Xc +Set a trap for asynchronous messages. +See the source listing +for further information. +.It Xo Ic clrtrap Ar address +.Op Ar port +.Op Ar interface +.Xc +Clear a trap for asynchronous messages. +See the source listing +for further information. +.It Ic reset +Clear the statistics counters in various modules of the server. +See the source listing for further information. +.El + _END_MDOC_USAGE; +}; + + +doc-section = { + ds-type = 'SEE ALSO'; + ds-format = 'mdoc'; + ds-text = <<- _END_MDOC_SEEALSO +.Xr ntp.conf 5 , +.Xr ntpd 1ntpdmdoc +.Rs +.%A David L. Mills +.%T Network Time Protocol (Version 3) +.%O RFC1305 +.Re + _END_MDOC_SEEALSO; +}; + + +doc-section = { + ds-type = 'AUTHORS'; + ds-format = 'mdoc'; + ds-text = <<- _END_MDOC_AUTHORS +The formatting directives in this document came from FreeBSD. + _END_MDOC_AUTHORS; +}; + + +doc-section = { + ds-type = 'BUGS'; + ds-format = 'mdoc'; + ds-text = <<- _END_MDOC_BUGS +The +.Nm +utility is a crude hack. +Much of the information it shows is +deadly boring and could only be loved by its implementer. +The +program was designed so that new (and temporary) features were easy +to hack in, at great expense to the program's ease of use. +Despite +this, the program is occasionally useful. +.Pp +Please report bugs to http://bugs.ntp.org . + _END_MDOC_BUGS; +}; diff --git a/ntpdc/ntpdc-opts.h b/ntpdc/ntpdc-opts.h new file mode 100644 index 0000000..182f77a --- /dev/null +++ b/ntpdc/ntpdc-opts.h @@ -0,0 +1,294 @@ +/* + * EDIT THIS FILE WITH CAUTION (ntpdc-opts.h) + * + * It has been AutoGen-ed December 2, 2014 at 08:57:15 AM by AutoGen 5.18.5pre4 + * From the definitions ntpdc-opts.def + * and the template file options + * + * Generated from AutoOpts 41:0:16 templates. + * + * AutoOpts is a copyrighted work. This header file is not encumbered + * by AutoOpts licensing, but is provided under the licensing terms chosen + * by the ntpdc author or copyright holder. AutoOpts is + * licensed under the terms of the LGPL. The redistributable library + * (``libopts'') is licensed under the terms of either the LGPL or, at the + * users discretion, the BSD license. See the AutoOpts and/or libopts sources + * for details. + * + * The ntpdc program is copyrighted and licensed + * under the following terms: + * + * Copyright (C) 1970-2014 The University of Delaware, all rights reserved. + * This is free software. It is licensed for use, modification and + * redistribution under the terms of the NTP License, copies of which + * can be seen at: + * <http://ntp.org/license> + * <http://opensource.org/licenses/ntp-license.php> + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose with or without fee is hereby granted, + * provided that the above copyright notice appears in all copies and that + * both the copyright notice and this permission notice appear in + * supporting documentation, and that the name The University of Delaware not be used in + * advertising or publicity pertaining to distribution of the software + * without specific, written prior permission. The University of Delaware makes no + * representations about the suitability this software for any purpose. It + * is provided "as is" without express or implied warranty. + */ +/** + * This file contains the programmatic interface to the Automated + * Options generated for the ntpdc program. + * These macros are documented in the AutoGen info file in the + * "AutoOpts" chapter. Please refer to that doc for usage help. + */ +#ifndef AUTOOPTS_NTPDC_OPTS_H_GUARD +#define AUTOOPTS_NTPDC_OPTS_H_GUARD 1 +#include "config.h" +#include <autoopts/options.h> + +/** + * Ensure that the library used for compiling this generated header is at + * least as new as the version current when the header template was released + * (not counting patch version increments). Also ensure that the oldest + * tolerable version is at least as old as what was current when the header + * template was released. + */ +#define AO_TEMPLATE_VERSION 167936 +#if (AO_TEMPLATE_VERSION < OPTIONS_MINIMUM_VERSION) \ + || (AO_TEMPLATE_VERSION > OPTIONS_STRUCT_VERSION) +# error option template version mismatches autoopts/options.h header + Choke Me. +#endif + +/** + * Enumeration of each option type for ntpdc + */ +typedef enum { + INDEX_OPT_IPV4 = 0, + INDEX_OPT_IPV6 = 1, + INDEX_OPT_COMMAND = 2, + INDEX_OPT_DEBUG_LEVEL = 3, + INDEX_OPT_SET_DEBUG_LEVEL = 4, + INDEX_OPT_INTERACTIVE = 5, + INDEX_OPT_LISTPEERS = 6, + INDEX_OPT_NUMERIC = 7, + INDEX_OPT_PEERS = 8, + INDEX_OPT_SHOWPEERS = 9, + INDEX_OPT_VERSION = 10, + INDEX_OPT_HELP = 11, + INDEX_OPT_MORE_HELP = 12, + INDEX_OPT_SAVE_OPTS = 13, + INDEX_OPT_LOAD_OPTS = 14 +} teOptIndex; +/** count of all options for ntpdc */ +#define OPTION_CT 15 +/** ntpdc version */ +#define NTPDC_VERSION "4.2.7p482" +/** Full ntpdc version text */ +#define NTPDC_FULL_VERSION "ntpdc 4.2.7p482" + +/** + * Interface defines for all options. Replace "n" with the UPPER_CASED + * option name (as in the teOptIndex enumeration above). + * e.g. HAVE_OPT(IPV4) + */ +#define DESC(n) (ntpdcOptions.pOptDesc[INDEX_OPT_## n]) +/** 'true' if an option has been specified in any way */ +#define HAVE_OPT(n) (! UNUSED_OPT(& DESC(n))) +/** The string argument to an option. The argument type must be \"string\". */ +#define OPT_ARG(n) (DESC(n).optArg.argString) +/** Mask the option state revealing how an option was specified. + * It will be one and only one of \a OPTST_SET, \a OPTST_PRESET, + * \a OPTST_DEFINED, \a OPTST_RESET or zero. + */ +#define STATE_OPT(n) (DESC(n).fOptState & OPTST_SET_MASK) +/** Count of option's occurrances *on the command line*. */ +#define COUNT_OPT(n) (DESC(n).optOccCt) +/** mask of \a OPTST_SET and \a OPTST_DEFINED. */ +#define ISSEL_OPT(n) (SELECTED_OPT(&DESC(n))) +/** 'true' if \a HAVE_OPT would yield 'false'. */ +#define ISUNUSED_OPT(n) (UNUSED_OPT(& DESC(n))) +/** 'true' if OPTST_DISABLED bit not set. */ +#define ENABLED_OPT(n) (! DISABLED_OPT(& DESC(n))) +/** number of stacked option arguments. + * Valid only for stacked option arguments. */ +#define STACKCT_OPT(n) (((tArgList*)(DESC(n).optCookie))->useCt) +/** stacked argument vector. + * Valid only for stacked option arguments. */ +#define STACKLST_OPT(n) (((tArgList*)(DESC(n).optCookie))->apzArgs) +/** Reset an option. */ +#define CLEAR_OPT(n) STMTS( \ + DESC(n).fOptState &= OPTST_PERSISTENT_MASK; \ + if ((DESC(n).fOptState & OPTST_INITENABLED) == 0) \ + DESC(n).fOptState |= OPTST_DISABLED; \ + DESC(n).optCookie = NULL ) +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/** + * Enumeration of ntpdc exit codes + */ +typedef enum { + NTPDC_EXIT_SUCCESS = 0, + NTPDC_EXIT_FAILURE = 1, + NTPDC_EXIT_USAGE_ERROR = 64, + NTPDC_EXIT_NO_CONFIG_INPUT = 66, + NTPDC_EXIT_LIBOPTS_FAILURE = 70 +} ntpdc_exit_code_t; +/** @} */ +/** + * Make sure there are no #define name conflicts with the option names + */ +#ifndef NO_OPTION_NAME_WARNINGS +# ifdef IPV4 +# warning undefining IPV4 due to option name conflict +# undef IPV4 +# endif +# ifdef IPV6 +# warning undefining IPV6 due to option name conflict +# undef IPV6 +# endif +# ifdef COMMAND +# warning undefining COMMAND due to option name conflict +# undef COMMAND +# endif +# ifdef DEBUG_LEVEL +# warning undefining DEBUG_LEVEL due to option name conflict +# undef DEBUG_LEVEL +# endif +# ifdef SET_DEBUG_LEVEL +# warning undefining SET_DEBUG_LEVEL due to option name conflict +# undef SET_DEBUG_LEVEL +# endif +# ifdef INTERACTIVE +# warning undefining INTERACTIVE due to option name conflict +# undef INTERACTIVE +# endif +# ifdef LISTPEERS +# warning undefining LISTPEERS due to option name conflict +# undef LISTPEERS +# endif +# ifdef NUMERIC +# warning undefining NUMERIC due to option name conflict +# undef NUMERIC +# endif +# ifdef PEERS +# warning undefining PEERS due to option name conflict +# undef PEERS +# endif +# ifdef SHOWPEERS +# warning undefining SHOWPEERS due to option name conflict +# undef SHOWPEERS +# endif +#else /* NO_OPTION_NAME_WARNINGS */ +# undef IPV4 +# undef IPV6 +# undef COMMAND +# undef DEBUG_LEVEL +# undef SET_DEBUG_LEVEL +# undef INTERACTIVE +# undef LISTPEERS +# undef NUMERIC +# undef PEERS +# undef SHOWPEERS +#endif /* NO_OPTION_NAME_WARNINGS */ + +/** + * Interface defines for specific options. + * @{ + */ +#define VALUE_OPT_IPV4 '4' +#define VALUE_OPT_IPV6 '6' +#define VALUE_OPT_COMMAND 'c' +#define VALUE_OPT_DEBUG_LEVEL 'd' +#define VALUE_OPT_SET_DEBUG_LEVEL 'D' + +#define OPT_VALUE_SET_DEBUG_LEVEL (DESC(SET_DEBUG_LEVEL).optArg.argInt) +#define VALUE_OPT_INTERACTIVE 'i' +#define VALUE_OPT_LISTPEERS 'l' +#define VALUE_OPT_NUMERIC 'n' +#define VALUE_OPT_PEERS 'p' +#define VALUE_OPT_SHOWPEERS 's' +/** option flag (value) for help-value option */ +#define VALUE_OPT_HELP '?' +/** option flag (value) for more-help-value option */ +#define VALUE_OPT_MORE_HELP '!' +/** option flag (value) for version-value option */ +#define VALUE_OPT_VERSION 0x1001 +/** option flag (value) for save-opts-value option */ +#define VALUE_OPT_SAVE_OPTS '>' +/** option flag (value) for load-opts-value option */ +#define VALUE_OPT_LOAD_OPTS '<' +#define SET_OPT_SAVE_OPTS(a) STMTS( \ + DESC(SAVE_OPTS).fOptState &= OPTST_PERSISTENT_MASK; \ + DESC(SAVE_OPTS).fOptState |= OPTST_SET; \ + DESC(SAVE_OPTS).optArg.argString = (char const*)(a)) +/* + * Interface defines not associated with particular options + */ +#define ERRSKIP_OPTERR STMTS(ntpdcOptions.fOptSet &= ~OPTPROC_ERRSTOP) +#define ERRSTOP_OPTERR STMTS(ntpdcOptions.fOptSet |= OPTPROC_ERRSTOP) +#define RESTART_OPT(n) STMTS( \ + ntpdcOptions.curOptIdx = (n); \ + ntpdcOptions.pzCurOpt = NULL ) +#define START_OPT RESTART_OPT(1) +#define USAGE(c) (*ntpdcOptions.pUsageProc)(&ntpdcOptions, c) + +#ifdef __cplusplus +extern "C" { +#endif + + +/* * * * * * + * + * Declare the ntpdc option descriptor. + */ +extern tOptions ntpdcOptions; + +#if defined(ENABLE_NLS) +# ifndef _ +# include <stdio.h> +# ifndef HAVE_GETTEXT + extern char * gettext(char const *); +# else +# include <libintl.h> +# endif + +# ifndef ATTRIBUTE_FORMAT_ARG +# define ATTRIBUTE_FORMAT_ARG(_a) +# endif + +static inline char* aoGetsText(char const* pz) ATTRIBUTE_FORMAT_ARG(1); +static inline char* aoGetsText(char const* pz) { + if (pz == NULL) return NULL; + return (char*)gettext(pz); +} +# define _(s) aoGetsText(s) +# endif /* _() */ + +# define OPT_NO_XLAT_CFG_NAMES STMTS(ntpdcOptions.fOptSet |= \ + OPTPROC_NXLAT_OPT_CFG;) +# define OPT_NO_XLAT_OPT_NAMES STMTS(ntpdcOptions.fOptSet |= \ + OPTPROC_NXLAT_OPT|OPTPROC_NXLAT_OPT_CFG;) + +# define OPT_XLAT_CFG_NAMES STMTS(ntpdcOptions.fOptSet &= \ + ~(OPTPROC_NXLAT_OPT|OPTPROC_NXLAT_OPT_CFG);) +# define OPT_XLAT_OPT_NAMES STMTS(ntpdcOptions.fOptSet &= \ + ~OPTPROC_NXLAT_OPT;) + +#else /* ENABLE_NLS */ +# define OPT_NO_XLAT_CFG_NAMES +# define OPT_NO_XLAT_OPT_NAMES + +# define OPT_XLAT_CFG_NAMES +# define OPT_XLAT_OPT_NAMES + +# ifndef _ +# define _(_s) _s +# endif +#endif /* ENABLE_NLS */ + +#ifdef __cplusplus +} +#endif +#endif /* AUTOOPTS_NTPDC_OPTS_H_GUARD */ + +/* ntpdc-opts.h ends here */ diff --git a/ntpdc/ntpdc.1ntpdcman b/ntpdc/ntpdc.1ntpdcman new file mode 100644 index 0000000..a3579bb --- /dev/null +++ b/ntpdc/ntpdc.1ntpdcman @@ -0,0 +1,874 @@ +.de1 NOP +. it 1 an-trap +. if \\n[.$] \,\\$*\/ +.. +.ie t \ +.ds B-Font [CB] +.ds I-Font [CI] +.ds R-Font [CR] +.el \ +.ds B-Font B +.ds I-Font I +.ds R-Font R +.TH ntpdc 1ntpdcman "02 Dec 2014" "4.2.7p482" "User Commands" +.\" +.\" EDIT THIS FILE WITH CAUTION (/tmp/.ag-6QaWHN/ag-hRaOGN) +.\" +.\" It has been AutoGen-ed December 2, 2014 at 08:57:28 AM by AutoGen 5.18.5pre4 +.\" From the definitions ntpdc-opts.def +.\" and the template file agman-cmd.tpl +.SH NAME +\f\*[B-Font]ntpdc\fP +\- vendor-specific NTPD control program +.SH SYNOPSIS +\f\*[B-Font]ntpdc\fP +.\" Mixture of short (flag) options and long options +[\f\*[B-Font]\-flags\f[]] +[\f\*[B-Font]\-flag\f[] [\f\*[I-Font]value\f[]]] +[\f\*[B-Font]\-\-option-name\f[][[=| ]\f\*[I-Font]value\f[]]] +[ host ...] +.sp \n(Ppu +.ne 2 + +.SH DESCRIPTION +\f\*[B-Font]ntpdc\fP +is deprecated. +Please use +\fCntpq\fR(1ntpqmdoc)\f[] instead \- it can do everything +\f\*[B-Font]ntpdc\fP +used to do, and it does so using a much more sane interface. +.sp \n(Ppu +.ne 2 + +\f\*[B-Font]ntpdc\fP +is a utility program used to query +\fCntpd\fR(1ntpdmdoc)\f[] +about its +current state and to request changes in that state. +It uses NTP mode 7 control message formats described in the source code. +The program may +be run either in interactive mode or controlled using command line +arguments. +Extensive state and statistics information is available +through the +\f\*[B-Font]ntpdc\fP +interface. +In addition, nearly all the +configuration options which can be specified at startup using +ntpd's configuration file may also be specified at run time using +\f\*[B-Font]ntpdc\fP. +.SH "OPTIONS" +.TP +.NOP \f\*[B-Font]\-4\f[], \f\*[B-Font]\-\-ipv4\f[] +Force IPv4 DNS name resolution. +This option must not appear in combination with any of the following options: +ipv6. +.sp +Force DNS resolution of following host names on the command line +to the IPv4 namespace. +.TP +.NOP \f\*[B-Font]\-6\f[], \f\*[B-Font]\-\-ipv6\f[] +Force IPv6 DNS name resolution. +This option must not appear in combination with any of the following options: +ipv4. +.sp +Force DNS resolution of following host names on the command line +to the IPv6 namespace. +.TP +.NOP \f\*[B-Font]\-c\f[] \f\*[I-Font]cmd\f[], \f\*[B-Font]\-\-command\f[]=\f\*[I-Font]cmd\f[] +run a command and exit. +This option may appear an unlimited number of times. +.sp +The following argument is interpreted as an interactive format command +and is added to the list of commands to be executed on the specified +host(s). +.TP +.NOP \f\*[B-Font]\-d\f[], \f\*[B-Font]\-\-debug\-level\f[] +Increase debug verbosity level. +This option may appear an unlimited number of times. +.sp +.TP +.NOP \f\*[B-Font]\-D\f[] \f\*[I-Font]number\f[], \f\*[B-Font]\-\-set\-debug\-level\f[]=\f\*[I-Font]number\f[] +Set the debug verbosity level. +This option may appear an unlimited number of times. +This option takes an integer number as its argument. +.sp +.TP +.NOP \f\*[B-Font]\-i\f[], \f\*[B-Font]\-\-interactive\f[] +Force ntpq to operate in interactive mode. +This option must not appear in combination with any of the following options: +command, listpeers, peers, showpeers. +.sp +Force ntpq to operate in interactive mode. Prompts will be written +to the standard output and commands read from the standard input. +.TP +.NOP \f\*[B-Font]\-l\f[], \f\*[B-Font]\-\-listpeers\f[] +Print a list of the peers. +This option must not appear in combination with any of the following options: +command. +.sp +Print a list of the peers known to the server as well as a summary of +their state. This is equivalent to the 'listpeers' interactive command. +.TP +.NOP \f\*[B-Font]\-n\f[], \f\*[B-Font]\-\-numeric\f[] +numeric host addresses. +.sp +Output all host addresses in dotted-quad numeric format rather than +converting to the canonical host names. +.TP +.NOP \f\*[B-Font]\-p\f[], \f\*[B-Font]\-\-peers\f[] +Print a list of the peers. +This option must not appear in combination with any of the following options: +command. +.sp +Print a list of the peers known to the server as well as a summary +of their state. This is equivalent to the 'peers' interactive command. +.TP +.NOP \f\*[B-Font]\-s\f[], \f\*[B-Font]\-\-showpeers\f[] +Show a list of the peers. +This option must not appear in combination with any of the following options: +command. +.sp +Print a list of the peers known to the server as well as a summary +of their state. This is equivalent to the 'dmpeers' interactive command. +.TP +.NOP \f\*[B-Font]\-\&?\f[], \f\*[B-Font]\-\-help\f[] +Display usage information and exit. +.TP +.NOP \f\*[B-Font]\-\&!\f[], \f\*[B-Font]\-\-more-help\f[] +Pass the extended usage information through a pager. +.TP +.NOP \f\*[B-Font]\->\f[] [\f\*[I-Font]cfgfile\f[]], \f\*[B-Font]\-\-save-opts\f[] [=\f\*[I-Font]cfgfile\f[]] +Save the option state to \fIcfgfile\fP. The default is the \fIlast\fP +configuration file listed in the \fBOPTION PRESETS\fP section, below. +The command will exit after updating the config file. +.TP +.NOP \f\*[B-Font]\-<\f[] \f\*[I-Font]cfgfile\f[], \f\*[B-Font]\-\-load-opts\f[]=\f\*[I-Font]cfgfile\f[], \f\*[B-Font]\-\-no-load-opts\f[] +Load options from \fIcfgfile\fP. +The \fIno-load-opts\fP form will disable the loading +of earlier config/rc/ini files. \fI\-\-no-load-opts\fP is handled early, +out of order. +.TP +.NOP \f\*[B-Font]\-\-version\f[] [{\f\*[I-Font]v|c|n\f[]}] +Output version of program and exit. The default mode is `v', a simple +version. The `c' mode will print copyright information and `n' will +print the full copyright notice. +.PP +.SH "OPTION PRESETS" +Any option that is not marked as \fInot presettable\fP may be preset +by loading values from configuration ("RC" or ".INI") file(s) and values from +environment variables named: +.nf + \fBNTPDC_<option-name>\fP or \fBNTPDC\fP +.fi +.ad +The environmental presets take precedence (are processed later than) +the configuration files. +The \fIhomerc\fP files are "\fI$HOME\fP", and "\fI.\fP". +If any of these are directories, then the file \fI.ntprc\fP +is searched for within those directories. +.SH USAGE +If one or more request options are included on the command line +when +\f\*[B-Font]ntpdc\fP +is executed, each of the requests will be sent +to the NTP servers running on each of the hosts given as command +line arguments, or on localhost by default. +If no request options +are given, +\f\*[B-Font]ntpdc\fP +will attempt to read commands from the +standard input and execute these on the NTP server running on the +first host given on the command line, again defaulting to localhost +when no other host is specified. +The +\f\*[B-Font]ntpdc\fP +utility will prompt for +commands if the standard input is a terminal device. +.sp \n(Ppu +.ne 2 + +The +\f\*[B-Font]ntpdc\fP +utility uses NTP mode 7 packets to communicate with the +NTP server, and hence can be used to query any compatible server on +the network which permits it. +Note that since NTP is a UDP protocol +this communication will be somewhat unreliable, especially over +large distances in terms of network topology. +The +\f\*[B-Font]ntpdc\fP +utility makes +no attempt to retransmit requests, and will time requests out if +the remote host is not heard from within a suitable timeout +time. +.sp \n(Ppu +.ne 2 + +The operation of +\f\*[B-Font]ntpdc\fP +are specific to the particular +implementation of the +\fCntpd\fR(1ntpdmdoc)\f[] +daemon and can be expected to +work only with this and maybe some previous versions of the daemon. +Requests from a remote +\f\*[B-Font]ntpdc\fP +utility which affect the +state of the local server must be authenticated, which requires +both the remote program and local server share a common key and key +identifier. +.sp \n(Ppu +.ne 2 + +Note that in contexts where a host name is expected, a +\f\*[B-Font]\-4\f[] +qualifier preceding the host name forces DNS resolution to the IPv4 namespace, +while a +\f\*[B-Font]\-6\f[] +qualifier forces DNS resolution to the IPv6 namespace. +Specifying a command line option other than +\f\*[B-Font]\-i\f[] +or +\f\*[B-Font]\-n\f[] +will cause the specified query (queries) to be sent to +the indicated host(s) immediately. +Otherwise, +\f\*[B-Font]ntpdc\fP +will +attempt to read interactive format commands from the standard +input. +.SS "Interactive Commands" +Interactive format commands consist of a keyword followed by zero +to four arguments. +Only enough characters of the full keyword to +uniquely identify the command need be typed. +The output of a +command is normally sent to the standard output, but optionally the +output of individual commands may be sent to a file by appending a +\[oq]\&>\[cq], +followed by a file name, to the command line. +.sp \n(Ppu +.ne 2 + +A number of interactive format commands are executed entirely +within the +\f\*[B-Font]ntpdc\fP +utility itself and do not result in NTP +mode 7 requests being sent to a server. +These are described +following. +.TP 7 +.NOP \f\*[B-Font]\&?\f[] \f\*[I-Font]command_keyword\f[] +.TP 7 +.NOP \f\*[B-Font]help\f[] \f\*[I-Font]command_keyword\f[] +A +\[oq]\f\*[B-Font]\&?\f[]\[cq] +will print a list of all the command +keywords known to this incarnation of +\f\*[B-Font]ntpdc\fP. +A +\[oq]\f\*[B-Font]\&?\f[]\[cq] +followed by a command keyword will print function and usage +information about the command. +This command is probably a better +source of information about +\fCntpq\fR(1ntpqmdoc)\f[] +than this manual +page. +.TP 7 +.NOP \f\*[B-Font]delay\f[] \f\*[I-Font]milliseconds\f[] +Specify a time interval to be added to timestamps included in +requests which require authentication. +This is used to enable +(unreliable) server reconfiguration over long delay network paths +or between machines whose clocks are unsynchronized. +Actually the +server does not now require timestamps in authenticated requests, +so this command may be obsolete. +.TP 7 +.NOP \f\*[B-Font]host\f[] \f\*[I-Font]hostname\f[] +Set the host to which future queries will be sent. +Hostname may +be either a host name or a numeric address. +.TP 7 +.NOP \f\*[B-Font]hostnames\f[] [\f\*[B-Font]yes\f[] | \f\*[B-Font]no\f[]] +If +\f\*[B-Font]yes\f[] +is specified, host names are printed in +information displays. +If +\f\*[B-Font]no\f[] +is specified, numeric +addresses are printed instead. +The default is +\f\*[B-Font]yes\f[], +unless +modified using the command line +\f\*[B-Font]\-n\f[] +switch. +.TP 7 +.NOP \f\*[B-Font]keyid\f[] \f\*[I-Font]keyid\f[] +This command allows the specification of a key number to be +used to authenticate configuration requests. +This must correspond +to a key number the server has been configured to use for this +purpose. +.TP 7 +.NOP \f\*[B-Font]quit\f[] +Exit +\f\*[B-Font]ntpdc\fP. +.TP 7 +.NOP \f\*[B-Font]passwd\f[] +This command prompts you to type in a password (which will not +be echoed) which will be used to authenticate configuration +requests. +The password must correspond to the key configured for +use by the NTP server for this purpose if such requests are to be +successful. +.TP 7 +.NOP \f\*[B-Font]timeout\f[] \f\*[I-Font]milliseconds\f[] +Specify a timeout period for responses to server queries. +The +default is about 8000 milliseconds. +Note that since +\f\*[B-Font]ntpdc\fP +retries each query once after a timeout, the total waiting time for +a timeout will be twice the timeout value set. +.PP +.SS "Control Message Commands" +Query commands result in NTP mode 7 packets containing requests for +information being sent to the server. +These are read-only commands +in that they make no modification of the server configuration +state. +.TP 7 +.NOP \f\*[B-Font]listpeers\f[] +Obtains and prints a brief list of the peers for which the +server is maintaining state. +These should include all configured +peer associations as well as those peers whose stratum is such that +they are considered by the server to be possible future +synchronization candidates. +.TP 7 +.NOP \f\*[B-Font]peers\f[] +Obtains a list of peers for which the server is maintaining +state, along with a summary of that state. +Summary information +includes the address of the remote peer, the local interface +address (0.0.0.0 if a local address has yet to be determined), the +stratum of the remote peer (a stratum of 16 indicates the remote +peer is unsynchronized), the polling interval, in seconds, the +reachability register, in octal, and the current estimated delay, +offset and dispersion of the peer, all in seconds. +.sp \n(Ppu +.ne 2 + +The character in the left margin indicates the mode this peer +entry is operating in. +A +\[oq]\&+\[cq] +denotes symmetric active, a +\[oq]\&-\[cq] +indicates symmetric passive, a +\[oq]\&=\[cq] +means the +remote server is being polled in client mode, a +\[oq]\&^\[cq] +indicates that the server is broadcasting to this address, a +\[oq]\&~\[cq] +denotes that the remote peer is sending broadcasts and a +\[oq]\&~\[cq] +denotes that the remote peer is sending broadcasts and a +\[oq]\&*\[cq] +marks the peer the server is currently synchronizing +to. +.sp \n(Ppu +.ne 2 + +The contents of the host field may be one of four forms. +It may +be a host name, an IP address, a reference clock implementation +name with its parameter or +\fBREFCLK\fR()\f[] +On +\f\*[B-Font]hostnames\f[] +\f\*[B-Font]no\f[] +only IP-addresses +will be displayed. +.TP 7 +.NOP \f\*[B-Font]dmpeers\f[] +A slightly different peer summary list. +Identical to the output +of the +\f\*[B-Font]peers\f[] +command, except for the character in the +leftmost column. +Characters only appear beside peers which were +included in the final stage of the clock selection algorithm. +A +\[oq]\&.\[cq] +indicates that this peer was cast off in the falseticker +detection, while a +\[oq]\&+\[cq] +indicates that the peer made it +through. +A +\[oq]\&*\[cq] +denotes the peer the server is currently +synchronizing with. +.TP 7 +.NOP \f\*[B-Font]showpeer\f[] \f\*[I-Font]peer_address\f[] [\f\*[I-Font]...\f[]] +Shows a detailed display of the current peer variables for one +or more peers. +Most of these values are described in the NTP +Version 2 specification. +.TP 7 +.NOP \f\*[B-Font]pstats\f[] \f\*[I-Font]peer_address\f[] [\f\*[I-Font]...\f[]] +Show per-peer statistic counters associated with the specified +peer(s). +.TP 7 +.NOP \f\*[B-Font]clockstat\f[] \f\*[I-Font]clock_peer_address\f[] [\f\*[I-Font]...\f[]] +Obtain and print information concerning a peer clock. +The +values obtained provide information on the setting of fudge factors +and other clock performance information. +.TP 7 +.NOP \f\*[B-Font]kerninfo\f[] +Obtain and print kernel phase-lock loop operating parameters. +This information is available only if the kernel has been specially +modified for a precision timekeeping function. +.TP 7 +.NOP \f\*[B-Font]loopinfo\f[] [\f\*[B-Font]oneline\f[] | \f\*[B-Font]multiline\f[]] +Print the values of selected loop filter variables. +The loop +filter is the part of NTP which deals with adjusting the local +system clock. +The +\[oq]offset\[cq] +is the last offset given to the +loop filter by the packet processing code. +The +\[oq]frequency\[cq] +is the frequency error of the local clock in parts-per-million +(ppm). +The +\[oq]time_const\[cq] +controls the stiffness of the +phase-lock loop and thus the speed at which it can adapt to +oscillator drift. +The +\[oq]watchdog timer\[cq] +value is the number +of seconds which have elapsed since the last sample offset was +given to the loop filter. +The +\f\*[B-Font]oneline\f[] +and +\f\*[B-Font]multiline\f[] +options specify the format in which this +information is to be printed, with +\f\*[B-Font]multiline\f[] +as the +default. +.TP 7 +.NOP \f\*[B-Font]sysinfo\f[] +Print a variety of system state variables, i.e., state related +to the local server. +All except the last four lines are described +in the NTP Version 3 specification, RFC-1305. +.sp \n(Ppu +.ne 2 + +The +\[oq]system flags\[cq] +show various system flags, some of +which can be set and cleared by the +\f\*[B-Font]enable\f[] +and +\f\*[B-Font]disable\f[] +configuration commands, respectively. +These are +the +\f\*[B-Font]auth\f[], +\f\*[B-Font]bclient\f[], +\f\*[B-Font]monitor\f[], +\f\*[B-Font]pll\f[], +\f\*[B-Font]pps\f[] +and +\f\*[B-Font]stats\f[] +flags. +See the +\fCntpd\fR(1ntpdmdoc)\f[] +documentation for the meaning of these flags. +There +are two additional flags which are read only, the +\f\*[B-Font]kernel_pll\f[] +and +\f\*[B-Font]kernel_pps\f[]. +These flags indicate +the synchronization status when the precision time kernel +modifications are in use. +The +\[oq]kernel_pll\[cq] +indicates that +the local clock is being disciplined by the kernel, while the +\[oq]kernel_pps\[cq] +indicates the kernel discipline is provided by the PPS +signal. +.sp \n(Ppu +.ne 2 + +The +\[oq]stability\[cq] +is the residual frequency error remaining +after the system frequency correction is applied and is intended for +maintenance and debugging. +In most architectures, this value will +initially decrease from as high as 500 ppm to a nominal value in +the range .01 to 0.1 ppm. +If it remains high for some time after +starting the daemon, something may be wrong with the local clock, +or the value of the kernel variable +\fIkern.clockrate.tick\f[] +may be +incorrect. +.sp \n(Ppu +.ne 2 + +The +\[oq]broadcastdelay\[cq] +shows the default broadcast delay, +as set by the +\f\*[B-Font]broadcastdelay\f[] +configuration command. +.sp \n(Ppu +.ne 2 + +The +\[oq]authdelay\[cq] +shows the default authentication delay, +as set by the +\f\*[B-Font]authdelay\f[] +configuration command. +.TP 7 +.NOP \f\*[B-Font]sysstats\f[] +Print statistics counters maintained in the protocol +module. +.TP 7 +.NOP \f\*[B-Font]memstats\f[] +Print statistics counters related to memory allocation +code. +.TP 7 +.NOP \f\*[B-Font]iostats\f[] +Print statistics counters maintained in the input-output +module. +.TP 7 +.NOP \f\*[B-Font]timerstats\f[] +Print statistics counters maintained in the timer/event queue +support code. +.TP 7 +.NOP \f\*[B-Font]reslist\f[] +Obtain and print the server's restriction list. +This list is +(usually) printed in sorted order and may help to understand how +the restrictions are applied. +.TP 7 +.NOP \f\*[B-Font]monlist\f[] [\f\*[I-Font]version\f[]] +Obtain and print traffic counts collected and maintained by the +monitor facility. +The version number should not normally need to be +specified. +.TP 7 +.NOP \f\*[B-Font]clkbug\f[] \f\*[I-Font]clock_peer_address\f[] [\f\*[I-Font]...\f[]] +Obtain debugging information for a reference clock driver. +This +information is provided only by some clock drivers and is mostly +undecodable without a copy of the driver source in hand. +.PP +.SS "Runtime Configuration Requests" +All requests which cause state changes in the server are +authenticated by the server using a configured NTP key (the +facility can also be disabled by the server by not configuring a +key). +The key number and the corresponding key must also be made +known to +\f\*[B-Font]ntpdc\fP. +This can be done using the +\f\*[B-Font]keyid\f[] +and +\f\*[B-Font]passwd\f[] +commands, the latter of which will prompt at the terminal for a +password to use as the encryption key. +You will also be prompted +automatically for both the key number and password the first time a +command which would result in an authenticated request to the +server is given. +Authentication not only provides verification that +the requester has permission to make such changes, but also gives +an extra degree of protection again transmission errors. +.sp \n(Ppu +.ne 2 + +Authenticated requests always include a timestamp in the packet +data, which is included in the computation of the authentication +code. +This timestamp is compared by the server to its receive time +stamp. +If they differ by more than a small amount the request is +rejected. +This is done for two reasons. +First, it makes simple +replay attacks on the server, by someone who might be able to +overhear traffic on your LAN, much more difficult. +Second, it makes +it more difficult to request configuration changes to your server +from topologically remote hosts. +While the reconfiguration facility +will work well with a server on the local host, and may work +adequately between time-synchronized hosts on the same LAN, it will +work very poorly for more distant hosts. +As such, if reasonable +passwords are chosen, care is taken in the distribution and +protection of keys and appropriate source address restrictions are +applied, the run time reconfiguration facility should provide an +adequate level of security. +.sp \n(Ppu +.ne 2 + +The following commands all make authenticated requests. +.TP 7 +.NOP \f\*[B-Font]addpeer\f[] \f\*[I-Font]peer_address\f[] [\f\*[I-Font]keyid\f[]] [\f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] +Add a configured peer association at the given address and +operating in symmetric active mode. +Note that an existing +association with the same peer may be deleted when this command is +executed, or may simply be converted to conform to the new +configuration, as appropriate. +If the optional +\f\*[I-Font]keyid\f[] +is a +nonzero integer, all outgoing packets to the remote server will +have an authentication field attached encrypted with this key. +If +the value is 0 (or not given) no authentication will be done. +The +\f\*[I-Font]version\f[] +can be 1, 2 or 3 and defaults to 3. +The +\f\*[B-Font]prefer\f[] +keyword indicates a preferred peer (and thus will +be used primarily for clock synchronisation if possible). +The +preferred peer also determines the validity of the PPS signal \- if +the preferred peer is suitable for synchronisation so is the PPS +signal. +.TP 7 +.NOP \f\*[B-Font]addserver\f[] \f\*[I-Font]peer_address\f[] [\f\*[I-Font]keyid\f[]] [\f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] +Identical to the addpeer command, except that the operating +mode is client. +.TP 7 +.NOP \f\*[B-Font]broadcast\f[] \f\*[I-Font]peer_address\f[] [\f\*[I-Font]keyid\f[]] [\f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] +Identical to the addpeer command, except that the operating +mode is broadcast. +In this case a valid key identifier and key are +required. +The +\f\*[I-Font]peer_address\f[] +parameter can be the broadcast +address of the local network or a multicast group address assigned +to NTP. +If a multicast address, a multicast-capable kernel is +required. +.TP 7 +.NOP \f\*[B-Font]unconfig\f[] \f\*[I-Font]peer_address\f[] [\f\*[I-Font]...\f[]] +This command causes the configured bit to be removed from the +specified peer(s). +In many cases this will cause the peer +association to be deleted. +When appropriate, however, the +association may persist in an unconfigured mode if the remote peer +is willing to continue on in this fashion. +.TP 7 +.NOP \f\*[B-Font]fudge\f[] \f\*[I-Font]peer_address\f[] [\f\*[B-Font]time1\f[]] [\f\*[B-Font]time2\f[]] [\f\*[I-Font]stratum\f[]] [\f\*[I-Font]refid\f[]] +This command provides a way to set certain data for a reference +clock. +See the source listing for further information. +.TP 7 +.NOP \f\*[B-Font]enable\f[] [\f\*[B-Font]auth\f[] | \f\*[B-Font]bclient\f[] | \f\*[B-Font]calibrate\f[] | \f\*[B-Font]kernel\f[] | \f\*[B-Font]monitor\f[] | \f\*[B-Font]ntp\f[] | \f\*[B-Font]pps\f[] | \f\*[B-Font]stats\f[]] +.TP 7 +.NOP \f\*[B-Font]disable\f[] [\f\*[B-Font]auth\f[] | \f\*[B-Font]bclient\f[] | \f\*[B-Font]calibrate\f[] | \f\*[B-Font]kernel\f[] | \f\*[B-Font]monitor\f[] | \f\*[B-Font]ntp\f[] | \f\*[B-Font]pps\f[] | \f\*[B-Font]stats\f[]] +These commands operate in the same way as the +\f\*[B-Font]enable\f[] +and +\f\*[B-Font]disable\f[] +configuration file commands of +\fCntpd\fR(1ntpdmdoc)\f[]. +.RS +.TP 7 +.NOP \f\*[B-Font]auth\f[] +Enables the server to synchronize with unconfigured peers only +if the peer has been correctly authenticated using either public key +or private key cryptography. +The default for this flag is enable. +.TP 7 +.NOP \f\*[B-Font]bclient\f[] +Enables the server to listen for a message from a broadcast or +multicast server, as in the multicastclient command with +default address. +The default for this flag is disable. +.TP 7 +.NOP \f\*[B-Font]calibrate\f[] +Enables the calibrate feature for reference clocks. +The default for this flag is disable. +.TP 7 +.NOP \f\*[B-Font]kernel\f[] +Enables the kernel time discipline, if available. +The default for this flag is enable if support is available, otherwise disable. +.TP 7 +.NOP \f\*[B-Font]monitor\f[] +Enables the monitoring facility. +See the documentation here about the +\f\*[B-Font]monlist\f[] +command or further information. +The default for this flag is enable. +.TP 7 +.NOP \f\*[B-Font]ntp\f[] +Enables time and frequency discipline. +In effect, this switch opens and closes the feedback loop, +which is useful for testing. +The default for this flag is enable. +.TP 7 +.NOP \f\*[B-Font]pps\f[] +Enables the pulse-per-second (PPS) signal when frequency +and time is disciplined by the precision time kernel modifications. +See the +"A Kernel Model for Precision Timekeeping" +(available as part of the HTML documentation +provided in +\fI/usr/share/doc/ntp\f[]) +page for further information. +The default for this flag is disable. +.TP 7 +.NOP \f\*[B-Font]stats\f[] +Enables the statistics facility. +See the +\fIMonitoring\f[] \fIOptions\f[] +section of +\fCntp.conf\fR(5)\f[] +for further information. +The default for this flag is disable. +.RE +.TP 7 +.NOP \f\*[B-Font]restrict\f[] \f\*[I-Font]address\f[] \f\*[I-Font]mask\f[] \f\*[I-Font]flag\f[] [\f\*[I-Font]...\f[]] +This command operates in the same way as the +\f\*[B-Font]restrict\f[] +configuration file commands of +\fCntpd\fR(1ntpdmdoc)\f[]. +.TP 7 +.NOP \f\*[B-Font]unrestrict\f[] \f\*[I-Font]address\f[] \f\*[I-Font]mask\f[] \f\*[I-Font]flag\f[] [\f\*[I-Font]...\f[]] +Unrestrict the matching entry from the restrict list. +.TP 7 +.NOP \f\*[B-Font]delrestrict\f[] \f\*[I-Font]address\f[] \f\*[I-Font]mask\f[] [\f\*[B-Font]ntpport\f[]] +Delete the matching entry from the restrict list. +.TP 7 +.NOP \f\*[B-Font]readkeys\f[] +Causes the current set of authentication keys to be purged and +a new set to be obtained by rereading the keys file (which must +have been specified in the +\fCntpd\fR(1ntpdmdoc)\f[] +configuration file). +This +allows encryption keys to be changed without restarting the +server. +.TP 7 +.NOP \f\*[B-Font]trustedkey\f[] \f\*[I-Font]keyid\f[] [\f\*[I-Font]...\f[]] +.TP 7 +.NOP \f\*[B-Font]untrustedkey\f[] \f\*[I-Font]keyid\f[] [\f\*[I-Font]...\f[]] +These commands operate in the same way as the +\f\*[B-Font]trustedkey\f[] +and +\f\*[B-Font]untrustedkey\f[] +configuration file +commands of +\fCntpd\fR(1ntpdmdoc)\f[]. +.TP 7 +.NOP \f\*[B-Font]authinfo\f[] +Returns information concerning the authentication module, +including known keys and counts of encryptions and decryptions +which have been done. +.TP 7 +.NOP \f\*[B-Font]traps\f[] +Display the traps set in the server. +See the source listing for +further information. +.TP 7 +.NOP \f\*[B-Font]addtrap\f[] \f\*[I-Font]address\f[] [\f\*[I-Font]port\f[]] [\f\*[I-Font]interface\f[]] +Set a trap for asynchronous messages. +See the source listing +for further information. +.TP 7 +.NOP \f\*[B-Font]clrtrap\f[] \f\*[I-Font]address\f[] [\f\*[I-Font]port\f[]] [\f\*[I-Font]interface\f[]] +Clear a trap for asynchronous messages. +See the source listing +for further information. +.TP 7 +.NOP \f\*[B-Font]reset\f[] +Clear the statistics counters in various modules of the server. +See the source listing for further information. +.PP +.SH "ENVIRONMENT" +See \fBOPTION PRESETS\fP for configuration environment variables. +.SH "FILES" +See \fBOPTION PRESETS\fP for configuration files. +.SH "EXIT STATUS" +One of the following exit values will be returned: +.TP +.NOP 0 " (EXIT_SUCCESS)" +Successful program execution. +.TP +.NOP 1 " (EXIT_FAILURE)" +The operation failed or the command syntax was not valid. +.TP +.NOP 66 " (EX_NOINPUT)" +A specified configuration file could not be loaded. +.TP +.NOP 70 " (EX_SOFTWARE)" +libopts had an internal operational error. Please report +it to autogen-users@lists.sourceforge.net. Thank you. +.PP +.SH "SEE ALSO" +\fCntp.conf\fR(5)\f[], +\fCntpd\fR(1ntpdmdoc)\f[] +David L. Mills, +\fINetwork Time Protocol (Version 3)\fR, +RFC1305 +.PP + +.SH AUTHORS +The formatting directives in this document came from FreeBSD. +.SH "COPYRIGHT" +Copyright (C) 1970-2014 The University of Delaware all rights reserved. +This program is released under the terms of the NTP license, <http://ntp.org/license>. +.SH BUGS +The +\f\*[B-Font]ntpdc\fP +utility is a crude hack. +Much of the information it shows is +deadly boring and could only be loved by its implementer. +The +program was designed so that new (and temporary) features were easy +to hack in, at great expense to the program's ease of use. +Despite +this, the program is occasionally useful. +.sp \n(Ppu +.ne 2 + +Please report bugs to http://bugs.ntp.org . +.sp \n(Ppu +.ne 2 + +Please send bug reports to: http://bugs.ntp.org, bugs@ntp.org +.SH "NOTES" +This manual page was \fIAutoGen\fP-erated from the \fBntpdc\fP +option definitions. diff --git a/ntpdc/ntpdc.1ntpdcmdoc b/ntpdc/ntpdc.1ntpdcmdoc new file mode 100644 index 0000000..46f1fa5 --- /dev/null +++ b/ntpdc/ntpdc.1ntpdcmdoc @@ -0,0 +1,809 @@ +.Dd December 2 2014 +.Dt NTPDC 1ntpdcmdoc User Commands +.Os +.\" EDIT THIS FILE WITH CAUTION (ntpdc-opts.mdoc) +.\" +.\" It has been AutoGen-ed December 2, 2014 at 08:57:34 AM by AutoGen 5.18.5pre4 +.\" From the definitions ntpdc-opts.def +.\" and the template file agmdoc-cmd.tpl +.Sh NAME +.Nm ntpdc +.Nd vendor-specific NTPD control program +.Sh SYNOPSIS +.Nm +.\" Mixture of short (flag) options and long options +.Op Fl flags +.Op Fl flag Op Ar value +.Op Fl \-option\-name Ns Oo Oo Ns "=| " Oc Ns Ar value Oc +[ host ...] +.Pp +.Sh DESCRIPTION +.Nm +is deprecated. +Please use +.Xr ntpq 1ntpqmdoc instead \- it can do everything +.Nm +used to do, and it does so using a much more sane interface. +.Pp +.Nm +is a utility program used to query +.Xr ntpd 1ntpdmdoc +about its +current state and to request changes in that state. +It uses NTP mode 7 control message formats described in the source code. +The program may +be run either in interactive mode or controlled using command line +arguments. +Extensive state and statistics information is available +through the +.Nm +interface. +In addition, nearly all the +configuration options which can be specified at startup using +ntpd's configuration file may also be specified at run time using +.Nm . +.Sh "OPTIONS" +.Bl -tag +.It Fl 4 , Fl \-ipv4 +Force IPv4 DNS name resolution. +This option must not appear in combination with any of the following options: +ipv6. +.sp +Force DNS resolution of following host names on the command line +to the IPv4 namespace. +.It Fl 6 , Fl \-ipv6 +Force IPv6 DNS name resolution. +This option must not appear in combination with any of the following options: +ipv4. +.sp +Force DNS resolution of following host names on the command line +to the IPv6 namespace. +.It Fl c Ar cmd , Fl \-command Ns = Ns Ar cmd +run a command and exit. +This option may appear an unlimited number of times. +.sp +The following argument is interpreted as an interactive format command +and is added to the list of commands to be executed on the specified +host(s). +.It Fl d , Fl \-debug\-level +Increase debug verbosity level. +This option may appear an unlimited number of times. +.sp +.It Fl D Ar number , Fl \-set\-debug\-level Ns = Ns Ar number +Set the debug verbosity level. +This option may appear an unlimited number of times. +This option takes an integer number as its argument. +.sp +.It Fl i , Fl \-interactive +Force ntpq to operate in interactive mode. +This option must not appear in combination with any of the following options: +command, listpeers, peers, showpeers. +.sp +Force ntpq to operate in interactive mode. Prompts will be written +to the standard output and commands read from the standard input. +.It Fl l , Fl \-listpeers +Print a list of the peers. +This option must not appear in combination with any of the following options: +command. +.sp +Print a list of the peers known to the server as well as a summary of +their state. This is equivalent to the 'listpeers' interactive command. +.It Fl n , Fl \-numeric +numeric host addresses. +.sp +Output all host addresses in dotted\-quad numeric format rather than +converting to the canonical host names. +.It Fl p , Fl \-peers +Print a list of the peers. +This option must not appear in combination with any of the following options: +command. +.sp +Print a list of the peers known to the server as well as a summary +of their state. This is equivalent to the 'peers' interactive command. +.It Fl s , Fl \-showpeers +Show a list of the peers. +This option must not appear in combination with any of the following options: +command. +.sp +Print a list of the peers known to the server as well as a summary +of their state. This is equivalent to the 'dmpeers' interactive command. +.It Fl \&? , Fl \-help +Display usage information and exit. +.It Fl \&! , Fl \-more\-help +Pass the extended usage information through a pager. +.It Fl > Oo Ar cfgfile Oc , Fl \-save\-opts Oo Ns = Ns Ar cfgfile Oc +Save the option state to \fIcfgfile\fP. The default is the \fIlast\fP +configuration file listed in the \fBOPTION PRESETS\fP section, below. +The command will exit after updating the config file. +.It Fl < Ar cfgfile , Fl \-load\-opts Ns = Ns Ar cfgfile , Fl \-no\-load\-opts +Load options from \fIcfgfile\fP. +The \fIno\-load\-opts\fP form will disable the loading +of earlier config/rc/ini files. \fI\-\-no\-load\-opts\fP is handled early, +out of order. +.It Fl \-version Op Brq Ar v|c|n +Output version of program and exit. The default mode is `v', a simple +version. The `c' mode will print copyright information and `n' will +print the full copyright notice. +.El +.Sh "OPTION PRESETS" +Any option that is not marked as \fInot presettable\fP may be preset +by loading values from configuration ("RC" or ".INI") file(s) and values from +environment variables named: +.nf + \fBNTPDC_<option\-name>\fP or \fBNTPDC\fP +.fi +.ad +The environmental presets take precedence (are processed later than) +the configuration files. +The \fIhomerc\fP files are "\fI$HOME\fP", and "\fI.\fP". +If any of these are directories, then the file \fI.ntprc\fP +is searched for within those directories. +.Sh USAGE +If one or more request options are included on the command line +when +.Nm +is executed, each of the requests will be sent +to the NTP servers running on each of the hosts given as command +line arguments, or on localhost by default. +If no request options +are given, +.Nm +will attempt to read commands from the +standard input and execute these on the NTP server running on the +first host given on the command line, again defaulting to localhost +when no other host is specified. +The +.Nm +utility will prompt for +commands if the standard input is a terminal device. +.Pp +The +.Nm +utility uses NTP mode 7 packets to communicate with the +NTP server, and hence can be used to query any compatible server on +the network which permits it. +Note that since NTP is a UDP protocol +this communication will be somewhat unreliable, especially over +large distances in terms of network topology. +The +.Nm +utility makes +no attempt to retransmit requests, and will time requests out if +the remote host is not heard from within a suitable timeout +time. +.Pp +The operation of +.Nm +are specific to the particular +implementation of the +.Xr ntpd 1ntpdmdoc +daemon and can be expected to +work only with this and maybe some previous versions of the daemon. +Requests from a remote +.Nm +utility which affect the +state of the local server must be authenticated, which requires +both the remote program and local server share a common key and key +identifier. +.Pp +Note that in contexts where a host name is expected, a +.Fl 4 +qualifier preceding the host name forces DNS resolution to the IPv4 namespace, +while a +.Fl 6 +qualifier forces DNS resolution to the IPv6 namespace. +Specifying a command line option other than +.Fl i +or +.Fl n +will cause the specified query (queries) to be sent to +the indicated host(s) immediately. +Otherwise, +.Nm +will +attempt to read interactive format commands from the standard +input. +.Ss "Interactive Commands" +Interactive format commands consist of a keyword followed by zero +to four arguments. +Only enough characters of the full keyword to +uniquely identify the command need be typed. +The output of a +command is normally sent to the standard output, but optionally the +output of individual commands may be sent to a file by appending a +.Ql \&> , +followed by a file name, to the command line. +.Pp +A number of interactive format commands are executed entirely +within the +.Nm +utility itself and do not result in NTP +mode 7 requests being sent to a server. +These are described +following. +.Bl -tag -width indent +.It Ic \&? Ar command_keyword +.It Ic help Ar command_keyword +A +.Sq Ic \&? +will print a list of all the command +keywords known to this incarnation of +.Nm . +A +.Sq Ic \&? +followed by a command keyword will print function and usage +information about the command. +This command is probably a better +source of information about +.Xr ntpq 1ntpqmdoc +than this manual +page. +.It Ic delay Ar milliseconds +Specify a time interval to be added to timestamps included in +requests which require authentication. +This is used to enable +(unreliable) server reconfiguration over long delay network paths +or between machines whose clocks are unsynchronized. +Actually the +server does not now require timestamps in authenticated requests, +so this command may be obsolete. +.It Ic host Ar hostname +Set the host to which future queries will be sent. +Hostname may +be either a host name or a numeric address. +.It Ic hostnames Op Cm yes | Cm no +If +.Cm yes +is specified, host names are printed in +information displays. +If +.Cm no +is specified, numeric +addresses are printed instead. +The default is +.Cm yes , +unless +modified using the command line +.Fl n +switch. +.It Ic keyid Ar keyid +This command allows the specification of a key number to be +used to authenticate configuration requests. +This must correspond +to a key number the server has been configured to use for this +purpose. +.It Ic quit +Exit +.Nm . +.It Ic passwd +This command prompts you to type in a password (which will not +be echoed) which will be used to authenticate configuration +requests. +The password must correspond to the key configured for +use by the NTP server for this purpose if such requests are to be +successful. +.It Ic timeout Ar milliseconds +Specify a timeout period for responses to server queries. +The +default is about 8000 milliseconds. +Note that since +.Nm +retries each query once after a timeout, the total waiting time for +a timeout will be twice the timeout value set. +.El +.Ss "Control Message Commands" +Query commands result in NTP mode 7 packets containing requests for +information being sent to the server. +These are read\-only commands +in that they make no modification of the server configuration +state. +.Bl -tag -width indent +.It Ic listpeers +Obtains and prints a brief list of the peers for which the +server is maintaining state. +These should include all configured +peer associations as well as those peers whose stratum is such that +they are considered by the server to be possible future +synchronization candidates. +.It Ic peers +Obtains a list of peers for which the server is maintaining +state, along with a summary of that state. +Summary information +includes the address of the remote peer, the local interface +address (0.0.0.0 if a local address has yet to be determined), the +stratum of the remote peer (a stratum of 16 indicates the remote +peer is unsynchronized), the polling interval, in seconds, the +reachability register, in octal, and the current estimated delay, +offset and dispersion of the peer, all in seconds. +.Pp +The character in the left margin indicates the mode this peer +entry is operating in. +A +.Ql \&+ +denotes symmetric active, a +.Ql \&\- +indicates symmetric passive, a +.Ql \&= +means the +remote server is being polled in client mode, a +.Ql \&^ +indicates that the server is broadcasting to this address, a +.Ql \&~ +denotes that the remote peer is sending broadcasts and a +.Ql \&~ +denotes that the remote peer is sending broadcasts and a +.Ql \&* +marks the peer the server is currently synchronizing +to. +.Pp +The contents of the host field may be one of four forms. +It may +be a host name, an IP address, a reference clock implementation +name with its parameter or +.Fn REFCLK "implementation_number" "parameter" . +On +.Ic hostnames +.Cm no +only IP\-addresses +will be displayed. +.It Ic dmpeers +A slightly different peer summary list. +Identical to the output +of the +.Ic peers +command, except for the character in the +leftmost column. +Characters only appear beside peers which were +included in the final stage of the clock selection algorithm. +A +.Ql \&. +indicates that this peer was cast off in the falseticker +detection, while a +.Ql \&+ +indicates that the peer made it +through. +A +.Ql \&* +denotes the peer the server is currently +synchronizing with. +.It Ic showpeer Ar peer_address Oo Ar ... Oc +Shows a detailed display of the current peer variables for one +or more peers. +Most of these values are described in the NTP +Version 2 specification. +.It Ic pstats Ar peer_address Oo Ar ... Oc +Show per\-peer statistic counters associated with the specified +peer(s). +.It Ic clockstat Ar clock_peer_address Oo Ar ... Oc +Obtain and print information concerning a peer clock. +The +values obtained provide information on the setting of fudge factors +and other clock performance information. +.It Ic kerninfo +Obtain and print kernel phase\-lock loop operating parameters. +This information is available only if the kernel has been specially +modified for a precision timekeeping function. +.It Ic loopinfo Op Cm oneline | Cm multiline +Print the values of selected loop filter variables. +The loop +filter is the part of NTP which deals with adjusting the local +system clock. +The +.Sq offset +is the last offset given to the +loop filter by the packet processing code. +The +.Sq frequency +is the frequency error of the local clock in parts\-per\-million +(ppm). +The +.Sq time_const +controls the stiffness of the +phase\-lock loop and thus the speed at which it can adapt to +oscillator drift. +The +.Sq watchdog timer +value is the number +of seconds which have elapsed since the last sample offset was +given to the loop filter. +The +.Cm oneline +and +.Cm multiline +options specify the format in which this +information is to be printed, with +.Cm multiline +as the +default. +.It Ic sysinfo +Print a variety of system state variables, i.e., state related +to the local server. +All except the last four lines are described +in the NTP Version 3 specification, RFC\-1305. +.Pp +The +.Sq system flags +show various system flags, some of +which can be set and cleared by the +.Ic enable +and +.Ic disable +configuration commands, respectively. +These are +the +.Cm auth , +.Cm bclient , +.Cm monitor , +.Cm pll , +.Cm pps +and +.Cm stats +flags. +See the +.Xr ntpd 1ntpdmdoc +documentation for the meaning of these flags. +There +are two additional flags which are read only, the +.Cm kernel_pll +and +.Cm kernel_pps . +These flags indicate +the synchronization status when the precision time kernel +modifications are in use. +The +.Sq kernel_pll +indicates that +the local clock is being disciplined by the kernel, while the +.Sq kernel_pps +indicates the kernel discipline is provided by the PPS +signal. +.Pp +The +.Sq stability +is the residual frequency error remaining +after the system frequency correction is applied and is intended for +maintenance and debugging. +In most architectures, this value will +initially decrease from as high as 500 ppm to a nominal value in +the range .01 to 0.1 ppm. +If it remains high for some time after +starting the daemon, something may be wrong with the local clock, +or the value of the kernel variable +.Va kern.clockrate.tick +may be +incorrect. +.Pp +The +.Sq broadcastdelay +shows the default broadcast delay, +as set by the +.Ic broadcastdelay +configuration command. +.Pp +The +.Sq authdelay +shows the default authentication delay, +as set by the +.Ic authdelay +configuration command. +.It Ic sysstats +Print statistics counters maintained in the protocol +module. +.It Ic memstats +Print statistics counters related to memory allocation +code. +.It Ic iostats +Print statistics counters maintained in the input\-output +module. +.It Ic timerstats +Print statistics counters maintained in the timer/event queue +support code. +.It Ic reslist +Obtain and print the server's restriction list. +This list is +(usually) printed in sorted order and may help to understand how +the restrictions are applied. +.It Ic monlist Op Ar version +Obtain and print traffic counts collected and maintained by the +monitor facility. +The version number should not normally need to be +specified. +.It Ic clkbug Ar clock_peer_address Oo Ar ... Oc +Obtain debugging information for a reference clock driver. +This +information is provided only by some clock drivers and is mostly +undecodable without a copy of the driver source in hand. +.El +.Ss "Runtime Configuration Requests" +All requests which cause state changes in the server are +authenticated by the server using a configured NTP key (the +facility can also be disabled by the server by not configuring a +key). +The key number and the corresponding key must also be made +known to +.Nm . +This can be done using the +.Ic keyid +and +.Ic passwd +commands, the latter of which will prompt at the terminal for a +password to use as the encryption key. +You will also be prompted +automatically for both the key number and password the first time a +command which would result in an authenticated request to the +server is given. +Authentication not only provides verification that +the requester has permission to make such changes, but also gives +an extra degree of protection again transmission errors. +.Pp +Authenticated requests always include a timestamp in the packet +data, which is included in the computation of the authentication +code. +This timestamp is compared by the server to its receive time +stamp. +If they differ by more than a small amount the request is +rejected. +This is done for two reasons. +First, it makes simple +replay attacks on the server, by someone who might be able to +overhear traffic on your LAN, much more difficult. +Second, it makes +it more difficult to request configuration changes to your server +from topologically remote hosts. +While the reconfiguration facility +will work well with a server on the local host, and may work +adequately between time\-synchronized hosts on the same LAN, it will +work very poorly for more distant hosts. +As such, if reasonable +passwords are chosen, care is taken in the distribution and +protection of keys and appropriate source address restrictions are +applied, the run time reconfiguration facility should provide an +adequate level of security. +.Pp +The following commands all make authenticated requests. +.Bl -tag -width indent +.It Xo Ic addpeer Ar peer_address +.Op Ar keyid +.Op Ar version +.Op Cm prefer +.Xc +Add a configured peer association at the given address and +operating in symmetric active mode. +Note that an existing +association with the same peer may be deleted when this command is +executed, or may simply be converted to conform to the new +configuration, as appropriate. +If the optional +.Ar keyid +is a +nonzero integer, all outgoing packets to the remote server will +have an authentication field attached encrypted with this key. +If +the value is 0 (or not given) no authentication will be done. +The +.Ar version +can be 1, 2 or 3 and defaults to 3. +The +.Cm prefer +keyword indicates a preferred peer (and thus will +be used primarily for clock synchronisation if possible). +The +preferred peer also determines the validity of the PPS signal \- if +the preferred peer is suitable for synchronisation so is the PPS +signal. +.It Xo Ic addserver Ar peer_address +.Op Ar keyid +.Op Ar version +.Op Cm prefer +.Xc +Identical to the addpeer command, except that the operating +mode is client. +.It Xo Ic broadcast Ar peer_address +.Op Ar keyid +.Op Ar version +.Op Cm prefer +.Xc +Identical to the addpeer command, except that the operating +mode is broadcast. +In this case a valid key identifier and key are +required. +The +.Ar peer_address +parameter can be the broadcast +address of the local network or a multicast group address assigned +to NTP. +If a multicast address, a multicast\-capable kernel is +required. +.It Ic unconfig Ar peer_address Oo Ar ... Oc +This command causes the configured bit to be removed from the +specified peer(s). +In many cases this will cause the peer +association to be deleted. +When appropriate, however, the +association may persist in an unconfigured mode if the remote peer +is willing to continue on in this fashion. +.It Xo Ic fudge Ar peer_address +.Op Cm time1 +.Op Cm time2 +.Op Ar stratum +.Op Ar refid +.Xc +This command provides a way to set certain data for a reference +clock. +See the source listing for further information. +.It Xo Ic enable +.Oo +.Cm auth | Cm bclient | +.Cm calibrate | Cm kernel | +.Cm monitor | Cm ntp | +.Cm pps | Cm stats +.Oc +.Xc +.It Xo Ic disable +.Oo +.Cm auth | Cm bclient | +.Cm calibrate | Cm kernel | +.Cm monitor | Cm ntp | +.Cm pps | Cm stats +.Oc +.Xc +These commands operate in the same way as the +.Ic enable +and +.Ic disable +configuration file commands of +.Xr ntpd 1ntpdmdoc . +.Bl -tag -width indent +.It Cm auth +Enables the server to synchronize with unconfigured peers only +if the peer has been correctly authenticated using either public key +or private key cryptography. +The default for this flag is enable. +.It Cm bclient +Enables the server to listen for a message from a broadcast or +multicast server, as in the multicastclient command with +default address. +The default for this flag is disable. +.It Cm calibrate +Enables the calibrate feature for reference clocks. +The default for this flag is disable. +.It Cm kernel +Enables the kernel time discipline, if available. +The default for this flag is enable if support is available, otherwise disable. +.It Cm monitor +Enables the monitoring facility. +See the documentation here about the +.Cm monlist +command or further information. +The default for this flag is enable. +.It Cm ntp +Enables time and frequency discipline. +In effect, this switch opens and closes the feedback loop, +which is useful for testing. +The default for this flag is enable. +.It Cm pps +Enables the pulse\-per\-second (PPS) signal when frequency +and time is disciplined by the precision time kernel modifications. +See the +.Qq A Kernel Model for Precision Timekeeping +(available as part of the HTML documentation +provided in +.Pa /usr/share/doc/ntp ) +page for further information. +The default for this flag is disable. +.It Cm stats +Enables the statistics facility. +See the +.Sx Monitoring Options +section of +.Xr ntp.conf 5 +for further information. +The default for this flag is disable. +.El +.It Xo Ic restrict Ar address Ar mask +.Ar flag Oo Ar ... Oc +.Xc +This command operates in the same way as the +.Ic restrict +configuration file commands of +.Xr ntpd 1ntpdmdoc . +.It Xo Ic unrestrict Ar address Ar mask +.Ar flag Oo Ar ... Oc +.Xc +Unrestrict the matching entry from the restrict list. +.It Xo Ic delrestrict Ar address Ar mask +.Op Cm ntpport +.Xc +Delete the matching entry from the restrict list. +.It Ic readkeys +Causes the current set of authentication keys to be purged and +a new set to be obtained by rereading the keys file (which must +have been specified in the +.Xr ntpd 1ntpdmdoc +configuration file). +This +allows encryption keys to be changed without restarting the +server. +.It Ic trustedkey Ar keyid Oo Ar ... Oc +.It Ic untrustedkey Ar keyid Oo Ar ... Oc +These commands operate in the same way as the +.Ic trustedkey +and +.Ic untrustedkey +configuration file +commands of +.Xr ntpd 1ntpdmdoc . +.It Ic authinfo +Returns information concerning the authentication module, +including known keys and counts of encryptions and decryptions +which have been done. +.It Ic traps +Display the traps set in the server. +See the source listing for +further information. +.It Xo Ic addtrap Ar address +.Op Ar port +.Op Ar interface +.Xc +Set a trap for asynchronous messages. +See the source listing +for further information. +.It Xo Ic clrtrap Ar address +.Op Ar port +.Op Ar interface +.Xc +Clear a trap for asynchronous messages. +See the source listing +for further information. +.It Ic reset +Clear the statistics counters in various modules of the server. +See the source listing for further information. +.El +.Sh "ENVIRONMENT" +See \fBOPTION PRESETS\fP for configuration environment variables. +.Sh "FILES" +See \fBOPTION PRESETS\fP for configuration files. +.Sh "EXIT STATUS" +One of the following exit values will be returned: +.Bl -tag +.It 0 " (EXIT_SUCCESS)" +Successful program execution. +.It 1 " (EXIT_FAILURE)" +The operation failed or the command syntax was not valid. +.It 66 " (EX_NOINPUT)" +A specified configuration file could not be loaded. +.It 70 " (EX_SOFTWARE)" +libopts had an internal operational error. Please report +it to autogen\-users@lists.sourceforge.net. Thank you. +.El +.Sh "SEE ALSO" +.Xr ntp.conf 5 , +.Xr ntpd 1ntpdmdoc +.Rs +.%A David L. Mills +.%T Network Time Protocol (Version 3) +.%O RFC1305 +.Re +.Sh AUTHORS +The formatting directives in this document came from FreeBSD. +.Sh "COPYRIGHT" +Copyright (C) 1970\-2014 The University of Delaware all rights reserved. +This program is released under the terms of the NTP license, <http://ntp.org/license>. +.Sh BUGS +The +.Nm +utility is a crude hack. +Much of the information it shows is +deadly boring and could only be loved by its implementer. +The +program was designed so that new (and temporary) features were easy +to hack in, at great expense to the program's ease of use. +Despite +this, the program is occasionally useful. +.Pp +Please report bugs to http://bugs.ntp.org . +.Pp +Please send bug reports to: http://bugs.ntp.org, bugs@ntp.org +.Sh "NOTES" +This manual page was \fIAutoGen\fP\-erated from the \fBntpdc\fP +option definitions. diff --git a/ntpdc/ntpdc.c b/ntpdc/ntpdc.c new file mode 100644 index 0000000..3595184 --- /dev/null +++ b/ntpdc/ntpdc.c @@ -0,0 +1,1934 @@ +/* + * ntpdc - control and monitor your ntpd daemon + */ +#include <config.h> +#include <stdio.h> +#include <stddef.h> +#include <ctype.h> +#include <signal.h> +#include <setjmp.h> +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif +#ifdef HAVE_FCNTL_H +# include <fcntl.h> +#endif +#ifdef SYS_WINNT +# include <mswsock.h> +#endif +#include <isc/net.h> +#include <isc/result.h> + +#include "ntpdc.h" +#include "ntp_select.h" +#include "ntp_stdlib.h" +#include "ntp_assert.h" +#include "ntp_lineedit.h" +#ifdef OPENSSL +#include "openssl/evp.h" +#include "openssl/objects.h" +#endif +#include <ssl_applink.c> + +#include "ntp_libopts.h" +#include "ntpdc-opts.h" + +#ifdef SYS_VXWORKS + /* vxWorks needs mode flag -casey*/ +# define open(name, flags) open(name, flags, 0777) +# define SERVER_PORT_NUM 123 +#endif + +/* We use COMMAND as an autogen keyword */ +#ifdef COMMAND +# undef COMMAND +#endif + +/* + * Because we now potentially understand a lot of commands (and + * it requires a lot of commands to talk to ntpd) we will run + * interactive if connected to a terminal. + */ +static int interactive = 0; /* set to 1 when we should prompt */ +static const char * prompt = "ntpdc> "; /* prompt to ask him about */ + +/* + * Keyid used for authenticated requests. Obtained on the fly. + */ +static u_long info_auth_keyid; +static int keyid_entered = 0; + +static int info_auth_keytype = NID_md5; /* MD5 */ +static size_t info_auth_hashlen = 16; /* MD5 */ +u_long current_time; /* needed by authkeys; not used */ + +/* + * for get_systime() + */ +s_char sys_precision; /* local clock precision (log2 s) */ + +int ntpdcmain (int, char **); +/* + * Built in command handler declarations + */ +static int openhost (const char *); +static int sendpkt (void *, size_t); +static void growpktdata (void); +static int getresponse (int, int, int *, int *, char **, int); +static int sendrequest (int, int, int, u_int, size_t, char *); +static void getcmds (void); +static RETSIGTYPE abortcmd (int); +static void docmd (const char *); +static void tokenize (const char *, char **, int *); +static int findcmd (char *, struct xcmd *, struct xcmd *, struct xcmd **); +static int getarg (char *, int, arg_v *); +static int getnetnum (const char *, sockaddr_u *, char *, int); +static void help (struct parse *, FILE *); +static int helpsort (const void *, const void *); +static void printusage (struct xcmd *, FILE *); +static void timeout (struct parse *, FILE *); +static void my_delay (struct parse *, FILE *); +static void host (struct parse *, FILE *); +static void keyid (struct parse *, FILE *); +static void keytype (struct parse *, FILE *); +static void passwd (struct parse *, FILE *); +static void hostnames (struct parse *, FILE *); +static void setdebug (struct parse *, FILE *); +static void quit (struct parse *, FILE *); +static void version (struct parse *, FILE *); +static void warning (const char *, const char *, const char *); +static void error (const char *, const char *, const char *); +static u_long getkeyid (const char *); + + + +/* + * Built-in commands we understand + */ +static struct xcmd builtins[] = { + { "?", help, { OPT|NTP_STR, NO, NO, NO }, + { "command", "", "", "" }, + "tell the use and syntax of commands" }, + { "help", help, { OPT|NTP_STR, NO, NO, NO }, + { "command", "", "", "" }, + "tell the use and syntax of commands" }, + { "timeout", timeout, { OPT|NTP_UINT, NO, NO, NO }, + { "msec", "", "", "" }, + "set the primary receive time out" }, + { "delay", my_delay, { OPT|NTP_INT, NO, NO, NO }, + { "msec", "", "", "" }, + "set the delay added to encryption time stamps" }, + { "host", host, { OPT|NTP_STR, OPT|NTP_STR, NO, NO }, + { "-4|-6", "hostname", "", "" }, + "specify the host whose NTP server we talk to" }, + { "passwd", passwd, { OPT|NTP_STR, NO, NO, NO }, + { "", "", "", "" }, + "specify a password to use for authenticated requests"}, + { "hostnames", hostnames, { OPT|NTP_STR, NO, NO, NO }, + { "yes|no", "", "", "" }, + "specify whether hostnames or net numbers are printed"}, + { "debug", setdebug, { OPT|NTP_STR, NO, NO, NO }, + { "no|more|less", "", "", "" }, + "set/change debugging level" }, + { "quit", quit, { NO, NO, NO, NO }, + { "", "", "", "" }, + "exit ntpdc" }, + { "exit", quit, { NO, NO, NO, NO }, + { "", "", "", "" }, + "exit ntpdc" }, + { "keyid", keyid, { OPT|NTP_UINT, NO, NO, NO }, + { "key#", "", "", "" }, + "set/show keyid to use for authenticated requests" }, + { "keytype", keytype, { OPT|NTP_STR, NO, NO, NO }, + { "(md5|des)", "", "", "" }, + "set/show key authentication type for authenticated requests (des|md5)" }, + { "version", version, { NO, NO, NO, NO }, + { "", "", "", "" }, + "print version number" }, + { 0, 0, { NO, NO, NO, NO }, + { "", "", "", "" }, "" } +}; + + +/* + * Default values we use. + */ +#define DEFHOST "localhost" /* default host name */ +#define DEFTIMEOUT (5) /* 5 second time out */ +#define DEFSTIMEOUT (2) /* 2 second time out after first */ +#define DEFDELAY 0x51EB852 /* 20 milliseconds, l_fp fraction */ +#define LENHOSTNAME 256 /* host name is 256 characters long */ +#define MAXCMDS 100 /* maximum commands on cmd line */ +#define MAXHOSTS 200 /* maximum hosts on cmd line */ +#define MAXLINE 512 /* maximum line length */ +#define MAXTOKENS (1+1+MAXARGS+MOREARGS+2) /* maximum number of usable tokens */ +#define SCREENWIDTH 78 /* nominal screen width in columns */ + +/* + * Some variables used and manipulated locally + */ +static struct sock_timeval tvout = { DEFTIMEOUT, 0 }; /* time out for reads */ +static struct sock_timeval tvsout = { DEFSTIMEOUT, 0 };/* secondary time out */ +static l_fp delay_time; /* delay time */ +static char currenthost[LENHOSTNAME]; /* current host name */ +int showhostnames = 1; /* show host names by default */ + +static int ai_fam_templ; /* address family */ +static int ai_fam_default; /* default address family */ +static SOCKET sockfd; /* fd socket is opened on */ +static int havehost = 0; /* set to 1 when host open */ +int s_port = 0; + +/* + * Holds data returned from queries. We allocate INITDATASIZE + * octets to begin with, increasing this as we need to. + */ +#define INITDATASIZE (sizeof(struct resp_pkt) * 16) +#define INCDATASIZE (sizeof(struct resp_pkt) * 8) + +static char *pktdata; +static int pktdatasize; + +/* + * These are used to help the magic with old and new versions of ntpd. + */ +int impl_ver = IMPL_XNTPD; +static int req_pkt_size = REQ_LEN_NOMAC; + +/* + * For commands typed on the command line (with the -c option) + */ +static int numcmds = 0; +static const char *ccmds[MAXCMDS]; +#define ADDCMD(cp) if (numcmds < MAXCMDS) ccmds[numcmds++] = (cp) + +/* + * When multiple hosts are specified. + */ +static int numhosts = 0; +static const char *chosts[MAXHOSTS]; +#define ADDHOST(cp) if (numhosts < MAXHOSTS) chosts[numhosts++] = (cp) + +/* + * Error codes for internal use + */ +#define ERR_INCOMPLETE 16 +#define ERR_TIMEOUT 17 + +/* + * Macro definitions we use + */ +#define ISSPACE(c) ((c) == ' ' || (c) == '\t') +#define ISEOL(c) ((c) == '\n' || (c) == '\r' || (c) == '\0') +#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) + +/* + * Jump buffer for longjumping back to the command level + */ +static jmp_buf interrupt_buf; +static volatile int jump = 0; + +/* + * Pointer to current output unit + */ +static FILE *current_output; + +/* + * Command table imported from ntpdc_ops.c + */ +extern struct xcmd opcmds[]; + +char *progname; + +#ifdef NO_MAIN_ALLOWED +CALL(ntpdc,"ntpdc",ntpdcmain); +#else +int +main( + int argc, + char *argv[] + ) +{ + return ntpdcmain(argc, argv); +} +#endif + +#ifdef SYS_VXWORKS +void clear_globals(void) +{ + showhostnames = 0; /* show host names by default */ + havehost = 0; /* set to 1 when host open */ + numcmds = 0; + numhosts = 0; +} +#endif + +/* + * main - parse arguments and handle options + */ +int +ntpdcmain( + int argc, + char *argv[] + ) +{ + + delay_time.l_ui = 0; + delay_time.l_uf = DEFDELAY; + +#ifdef SYS_VXWORKS + clear_globals(); + taskPrioritySet(taskIdSelf(), 100 ); +#endif + + init_lib(); /* sets up ipv4_works, ipv6_works */ + ssl_applink(); + init_auth(); + + /* Check to see if we have IPv6. Otherwise default to IPv4 */ + if (!ipv6_works) + ai_fam_default = AF_INET; + + progname = argv[0]; + + { + int optct = ntpOptionProcess(&ntpdcOptions, argc, argv); + argc -= optct; + argv += optct; + } + + if (HAVE_OPT(IPV4)) + ai_fam_templ = AF_INET; + else if (HAVE_OPT(IPV6)) + ai_fam_templ = AF_INET6; + else + ai_fam_templ = ai_fam_default; + + if (HAVE_OPT(COMMAND)) { + int cmdct = STACKCT_OPT( COMMAND ); + const char** cmds = STACKLST_OPT( COMMAND ); + + while (cmdct-- > 0) { + ADDCMD(*cmds++); + } + } + + debug = OPT_VALUE_SET_DEBUG_LEVEL; + + if (HAVE_OPT(INTERACTIVE)) { + interactive = 1; + } + + if (HAVE_OPT(NUMERIC)) { + showhostnames = 0; + } + + if (HAVE_OPT(LISTPEERS)) { + ADDCMD("listpeers"); + } + + if (HAVE_OPT(PEERS)) { + ADDCMD("peers"); + } + + if (HAVE_OPT(SHOWPEERS)) { + ADDCMD("dmpeers"); + } + + if (ntp_optind == argc) { + ADDHOST(DEFHOST); + } else { + for (; ntp_optind < argc; ntp_optind++) + ADDHOST(argv[ntp_optind]); + } + + if (numcmds == 0 && interactive == 0 + && isatty(fileno(stdin)) && isatty(fileno(stderr))) { + interactive = 1; + } + +#ifndef SYS_WINNT /* Under NT cannot handle SIGINT, WIN32 spawns a handler */ + if (interactive) + (void) signal_no_reset(SIGINT, abortcmd); +#endif /* SYS_WINNT */ + + /* + * Initialize the packet data buffer + */ + pktdatasize = INITDATASIZE; + pktdata = emalloc(INITDATASIZE); + + if (numcmds == 0) { + (void) openhost(chosts[0]); + getcmds(); + } else { + int ihost; + int icmd; + + for (ihost = 0; ihost < numhosts; ihost++) { + if (openhost(chosts[ihost])) + for (icmd = 0; icmd < numcmds; icmd++) { + if (numhosts > 1) + printf ("--- %s ---\n",chosts[ihost]); + docmd(ccmds[icmd]); + } + } + } +#ifdef SYS_WINNT + WSACleanup(); +#endif + return(0); +} /* main end */ + + +/* + * openhost - open a socket to a host + */ +static int +openhost( + const char *hname + ) +{ + char temphost[LENHOSTNAME]; + int a_info, i; + struct addrinfo hints, *ai = NULL; + sockaddr_u addr; + size_t octets; + register const char *cp; + char name[LENHOSTNAME]; + char service[5]; + + /* + * We need to get by the [] if they were entered + */ + + cp = hname; + + if (*cp == '[') { + cp++; + for (i = 0; *cp && *cp != ']'; cp++, i++) + name[i] = *cp; + if (*cp == ']') { + name[i] = '\0'; + hname = name; + } else { + return 0; + } + } + + /* + * First try to resolve it as an ip address and if that fails, + * do a fullblown (dns) lookup. That way we only use the dns + * when it is needed and work around some implementations that + * will return an "IPv4-mapped IPv6 address" address if you + * give it an IPv4 address to lookup. + */ + strlcpy(service, "ntp", sizeof(service)); + ZERO(hints); + hints.ai_family = ai_fam_templ; + hints.ai_protocol = IPPROTO_UDP; + hints.ai_socktype = SOCK_DGRAM; + hints.ai_flags = Z_AI_NUMERICHOST; + + a_info = getaddrinfo(hname, service, &hints, &ai); + if (a_info == EAI_NONAME +#ifdef EAI_NODATA + || a_info == EAI_NODATA +#endif + ) { + hints.ai_flags = AI_CANONNAME; +#ifdef AI_ADDRCONFIG + hints.ai_flags |= AI_ADDRCONFIG; +#endif + a_info = getaddrinfo(hname, service, &hints, &ai); + } + /* Some older implementations don't like AI_ADDRCONFIG. */ + if (a_info == EAI_BADFLAGS) { + hints.ai_flags = AI_CANONNAME; + a_info = getaddrinfo(hname, service, &hints, &ai); + } + if (a_info != 0) { + fprintf(stderr, "%s\n", gai_strerror(a_info)); + if (ai != NULL) + freeaddrinfo(ai); + return 0; + } + + /* + * getaddrinfo() has returned without error so ai should not + * be NULL. + */ + INSIST(ai != NULL); + ZERO(addr); + octets = min(sizeof(addr), ai->ai_addrlen); + memcpy(&addr, ai->ai_addr, octets); + + if (ai->ai_canonname == NULL) + strlcpy(temphost, stoa(&addr), sizeof(temphost)); + else + strlcpy(temphost, ai->ai_canonname, sizeof(temphost)); + + if (debug > 2) + printf("Opening host %s\n", temphost); + + if (havehost == 1) { + if (debug > 2) + printf("Closing old host %s\n", currenthost); + closesocket(sockfd); + havehost = 0; + } + strlcpy(currenthost, temphost, sizeof(currenthost)); + + /* port maps to the same in both families */ + s_port = NSRCPORT(&addr);; +#ifdef SYS_VXWORKS + ((struct sockaddr_in6 *)&hostaddr)->sin6_port = htons(SERVER_PORT_NUM); + if (ai->ai_family == AF_INET) + *(struct sockaddr_in *)&hostaddr= + *((struct sockaddr_in *)ai->ai_addr); + else + *(struct sockaddr_in6 *)&hostaddr= + *((struct sockaddr_in6 *)ai->ai_addr); +#endif /* SYS_VXWORKS */ + +#ifdef SYS_WINNT + { + int optionValue = SO_SYNCHRONOUS_NONALERT; + int err; + + err = setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE, (char *)&optionValue, sizeof(optionValue)); + if (err != NO_ERROR) { + (void) fprintf(stderr, "cannot open nonoverlapped sockets\n"); + exit(1); + } + } +#endif /* SYS_WINNT */ + + sockfd = socket(ai->ai_family, SOCK_DGRAM, 0); + if (sockfd == INVALID_SOCKET) { + error("socket", "", ""); + exit(-1); + } + +#ifdef NEED_RCVBUF_SLOP +# ifdef SO_RCVBUF + { + int rbufsize = INITDATASIZE + 2048; /* 2K for slop */ + + if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, + &rbufsize, sizeof(int)) == -1) + error("setsockopt", "", ""); + } +# endif +#endif + +#ifdef SYS_VXWORKS + if (connect(sockfd, (struct sockaddr *)&hostaddr, + sizeof(hostaddr)) == -1) { +#else + if (connect(sockfd, ai->ai_addr, ai->ai_addrlen) == -1) { +#endif /* SYS_VXWORKS */ + error("connect", "", ""); + exit(-1); + } + + freeaddrinfo(ai); + havehost = 1; + req_pkt_size = REQ_LEN_NOMAC; + impl_ver = IMPL_XNTPD; + return 1; +} + + +/* XXX ELIMINATE sendpkt similar in ntpq.c, ntpdc.c, ntp_io.c, ntptrace.c */ +/* + * sendpkt - send a packet to the remote host + */ +static int +sendpkt( + void * xdata, + size_t xdatalen + ) +{ + if (send(sockfd, xdata, xdatalen, 0) == -1) { + warning("write to %s failed", currenthost, ""); + return -1; + } + + return 0; +} + + +/* + * growpktdata - grow the packet data area + */ +static void +growpktdata(void) +{ + size_t priorsz; + + priorsz = (size_t)pktdatasize; + pktdatasize += INCDATASIZE; + pktdata = erealloc_zero(pktdata, (size_t)pktdatasize, priorsz); +} + + +/* + * getresponse - get a (series of) response packet(s) and return the data + */ +static int +getresponse( + int implcode, + int reqcode, + int *ritems, + int *rsize, + char **rdata, + int esize + ) +{ + struct resp_pkt rpkt; + struct sock_timeval tvo; + int items; + int i; + int size; + int datasize; + char *datap; + char *tmp_data; + char haveseq[MAXSEQ+1]; + int firstpkt; + int lastseq; + int numrecv; + int seq; + fd_set fds; + int n; + int pad; + + /* + * This is pretty tricky. We may get between 1 and many packets + * back in response to the request. We peel the data out of + * each packet and collect it in one long block. When the last + * packet in the sequence is received we'll know how many we + * should have had. Note we use one long time out, should reconsider. + */ + *ritems = 0; + *rsize = 0; + firstpkt = 1; + numrecv = 0; + *rdata = datap = pktdata; + lastseq = 999; /* too big to be a sequence number */ + ZERO(haveseq); + FD_ZERO(&fds); + + again: + if (firstpkt) + tvo = tvout; + else + tvo = tvsout; + + FD_SET(sockfd, &fds); + n = select(sockfd+1, &fds, (fd_set *)0, (fd_set *)0, &tvo); + + if (n == -1) { + warning("select fails", "", ""); + return -1; + } + if (n == 0) { + /* + * Timed out. Return what we have + */ + if (firstpkt) { + (void) fprintf(stderr, + "%s: timed out, nothing received\n", currenthost); + return ERR_TIMEOUT; + } else { + (void) fprintf(stderr, + "%s: timed out with incomplete data\n", + currenthost); + if (debug) { + printf("Received sequence numbers"); + for (n = 0; n <= MAXSEQ; n++) + if (haveseq[n]) + printf(" %d,", n); + if (lastseq != 999) + printf(" last frame received\n"); + else + printf(" last frame not received\n"); + } + return ERR_INCOMPLETE; + } + } + + n = recv(sockfd, (char *)&rpkt, sizeof(rpkt), 0); + if (n == -1) { + warning("read", "", ""); + return -1; + } + + + /* + * Check for format errors. Bug proofing. + */ + if (n < RESP_HEADER_SIZE) { + if (debug) + printf("Short (%d byte) packet received\n", n); + goto again; + } + if (INFO_VERSION(rpkt.rm_vn_mode) > NTP_VERSION || + INFO_VERSION(rpkt.rm_vn_mode) < NTP_OLDVERSION) { + if (debug) + printf("Packet received with version %d\n", + INFO_VERSION(rpkt.rm_vn_mode)); + goto again; + } + if (INFO_MODE(rpkt.rm_vn_mode) != MODE_PRIVATE) { + if (debug) + printf("Packet received with mode %d\n", + INFO_MODE(rpkt.rm_vn_mode)); + goto again; + } + if (INFO_IS_AUTH(rpkt.auth_seq)) { + if (debug) + printf("Encrypted packet received\n"); + goto again; + } + if (!ISRESPONSE(rpkt.rm_vn_mode)) { + if (debug) + printf("Received request packet, wanted response\n"); + goto again; + } + if (INFO_MBZ(rpkt.mbz_itemsize) != 0) { + if (debug) + printf("Received packet with nonzero MBZ field!\n"); + goto again; + } + + /* + * Check implementation/request. Could be old data getting to us. + */ + if (rpkt.implementation != implcode || rpkt.request != reqcode) { + if (debug) + printf( + "Received implementation/request of %d/%d, wanted %d/%d", + rpkt.implementation, rpkt.request, + implcode, reqcode); + goto again; + } + + /* + * Check the error code. If non-zero, return it. + */ + if (INFO_ERR(rpkt.err_nitems) != INFO_OKAY) { + if (debug && ISMORE(rpkt.rm_vn_mode)) { + printf("Error code %d received on not-final packet\n", + INFO_ERR(rpkt.err_nitems)); + } + return (int)INFO_ERR(rpkt.err_nitems); + } + + /* + * Collect items and size. Make sure they make sense. + */ + items = INFO_NITEMS(rpkt.err_nitems); + size = INFO_ITEMSIZE(rpkt.mbz_itemsize); + if (esize > size) + pad = esize - size; + else + pad = 0; + datasize = items * size; + if ((size_t)datasize > (n-RESP_HEADER_SIZE)) { + if (debug) + printf( + "Received items %d, size %d (total %d), data in packet is %lu\n", + items, size, datasize, (u_long)(n-RESP_HEADER_SIZE)); + goto again; + } + + /* + * If this isn't our first packet, make sure the size matches + * the other ones. + */ + if (!firstpkt && size != *rsize) { + if (debug) + printf("Received itemsize %d, previous %d\n", + size, *rsize); + goto again; + } + /* + * If we've received this before, +toss it + */ + seq = INFO_SEQ(rpkt.auth_seq); + if (haveseq[seq]) { + if (debug) + printf("Received duplicate sequence number %d\n", seq); + goto again; + } + haveseq[seq] = 1; + + /* + * If this is the last in the sequence, record that. + */ + if (!ISMORE(rpkt.rm_vn_mode)) { + if (lastseq != 999) { + printf("Received second end sequence packet\n"); + goto again; + } + lastseq = seq; + } + + /* + * So far, so good. Copy this data into the output array. + */ + if ((datap + datasize + (pad * items)) > (pktdata + pktdatasize)) { + int offset = datap - pktdata; + growpktdata(); + *rdata = pktdata; /* might have been realloced ! */ + datap = pktdata + offset; + } + /* + * We now move the pointer along according to size and number of + * items. This is so we can play nice with older implementations + */ + + tmp_data = rpkt.u.data; + for (i = 0; i < items; i++) { + memcpy(datap, tmp_data, (unsigned)size); + tmp_data += size; + zero_mem(datap + size, pad); + datap += size + pad; + } + + if (firstpkt) { + firstpkt = 0; + *rsize = size + pad; + } + *ritems += items; + + /* + * Finally, check the count of received packets. If we've got them + * all, return + */ + ++numrecv; + if (numrecv <= lastseq) + goto again; + return INFO_OKAY; +} + + +/* + * sendrequest - format and send a request packet + * + * Historically, ntpdc has used a fixed-size request packet regardless + * of the actual payload size. When authenticating, the timestamp, key + * ID, and digest have been placed just before the end of the packet. + * With the introduction in late 2009 of support for authenticated + * ntpdc requests using larger 20-octet digests (vs. 16 for MD5), we + * come up four bytes short. + * + * To maintain interop while allowing for larger digests, the behavior + * is unchanged when using 16-octet digests. For larger digests, the + * timestamp, key ID, and digest are placed immediately following the + * request payload, with the overall packet size variable. ntpd can + * distinguish 16-octet digests by the overall request size being + * REQ_LEN_NOMAC + 4 + 16 with the auth bit enabled. When using a + * longer digest, that request size should be avoided. + * + * With the form used with 20-octet and larger digests, the timestamp, + * key ID, and digest are located by ntpd relative to the start of the + * packet, and the size of the digest is then implied by the packet + * size. + */ +static int +sendrequest( + int implcode, + int reqcode, + int auth, + u_int qitems, + size_t qsize, + char *qdata + ) +{ + struct req_pkt qpkt; + size_t datasize; + size_t reqsize; + u_long key_id; + l_fp ts; + l_fp * ptstamp; + int maclen; + char * pass; + + ZERO(qpkt); + qpkt.rm_vn_mode = RM_VN_MODE(0, 0, 0); + qpkt.implementation = (u_char)implcode; + qpkt.request = (u_char)reqcode; + + datasize = qitems * qsize; + if (datasize && qdata != NULL) { + memcpy(qpkt.u.data, qdata, datasize); + qpkt.err_nitems = ERR_NITEMS(0, qitems); + qpkt.mbz_itemsize = MBZ_ITEMSIZE(qsize); + } else { + qpkt.err_nitems = ERR_NITEMS(0, 0); + qpkt.mbz_itemsize = MBZ_ITEMSIZE(qsize); /* allow for optional first item */ + } + + if (!auth || (keyid_entered && info_auth_keyid == 0)) { + qpkt.auth_seq = AUTH_SEQ(0, 0); + return sendpkt(&qpkt, req_pkt_size); + } + + if (info_auth_keyid == 0) { + key_id = getkeyid("Keyid: "); + if (!key_id) { + fprintf(stderr, "Invalid key identifier\n"); + return 1; + } + info_auth_keyid = key_id; + } + if (!authistrusted(info_auth_keyid)) { + pass = getpass_keytype(info_auth_keytype); + if ('\0' == pass[0]) { + fprintf(stderr, "Invalid password\n"); + return 1; + } + authusekey(info_auth_keyid, info_auth_keytype, + (u_char *)pass); + authtrust(info_auth_keyid, 1); + } + qpkt.auth_seq = AUTH_SEQ(1, 0); + if (info_auth_hashlen > 16) { + /* + * Only ntpd which expects REQ_LEN_NOMAC plus maclen + * octets in an authenticated request using a 16 octet + * digest (that is, a newer ntpd) will handle digests + * larger than 16 octets, so for longer digests, do + * not attempt to shorten the requests for downlevel + * ntpd compatibility. + */ + if (REQ_LEN_NOMAC != req_pkt_size) + return 1; + reqsize = REQ_LEN_HDR + datasize + sizeof(*ptstamp); + /* align to 32 bits */ + reqsize = (reqsize + 3) & ~3; + } else + reqsize = req_pkt_size; + ptstamp = (void *)((char *)&qpkt + reqsize); + ptstamp--; + get_systime(&ts); + L_ADD(&ts, &delay_time); + HTONL_FP(&ts, ptstamp); + maclen = authencrypt(info_auth_keyid, (void *)&qpkt, reqsize); + if (!maclen) { + fprintf(stderr, "Key not found\n"); + return 1; + } else if (maclen != (info_auth_hashlen + sizeof(keyid_t))) { + fprintf(stderr, + "%d octet MAC, %lu expected with %lu octet digest\n", + maclen, (u_long)(info_auth_hashlen + sizeof(keyid_t)), + (u_long)info_auth_hashlen); + return 1; + } + return sendpkt(&qpkt, reqsize + maclen); +} + + +/* + * doquery - send a request and process the response + */ +int +doquery( + int implcode, + int reqcode, + int auth, + int qitems, + int qsize, + char *qdata, + int *ritems, + int *rsize, + char **rdata, + int quiet_mask, + int esize + ) +{ + int res; + char junk[512]; + fd_set fds; + struct sock_timeval tvzero; + + /* + * Check to make sure host is open + */ + if (!havehost) { + (void) fprintf(stderr, "***No host open, use `host' command\n"); + return -1; + } + + /* + * Poll the socket and clear out any pending data + */ +again: + do { + tvzero.tv_sec = tvzero.tv_usec = 0; + FD_ZERO(&fds); + FD_SET(sockfd, &fds); + res = select(sockfd+1, &fds, (fd_set *)0, (fd_set *)0, &tvzero); + + if (res == -1) { + warning("polling select", "", ""); + return -1; + } else if (res > 0) + + (void) recv(sockfd, junk, sizeof junk, 0); + } while (res > 0); + + + /* + * send a request + */ + res = sendrequest(implcode, reqcode, auth, qitems, qsize, qdata); + if (res != 0) + return res; + + /* + * Get the response. If we got a standard error, print a message + */ + res = getresponse(implcode, reqcode, ritems, rsize, rdata, esize); + + /* + * Try to be compatible with older implementations of ntpd. + */ + if (res == INFO_ERR_FMT && req_pkt_size != 48) { + int oldsize; + + oldsize = req_pkt_size; + + switch(req_pkt_size) { + case REQ_LEN_NOMAC: + req_pkt_size = 160; + break; + case 160: + req_pkt_size = 48; + break; + } + if (impl_ver == IMPL_XNTPD) { + fprintf(stderr, + "***Warning changing to older implementation\n"); + return INFO_ERR_IMPL; + } + + fprintf(stderr, + "***Warning changing the request packet size from %d to %d\n", + oldsize, req_pkt_size); + goto again; + } + + /* log error message if not told to be quiet */ + if ((res > 0) && (((1 << res) & quiet_mask) == 0)) { + switch(res) { + case INFO_ERR_IMPL: + /* Give us a chance to try the older implementation. */ + if (implcode == IMPL_XNTPD) + break; + (void) fprintf(stderr, + "***Server implementation incompatible with our own\n"); + break; + case INFO_ERR_REQ: + (void) fprintf(stderr, + "***Server doesn't implement this request\n"); + break; + case INFO_ERR_FMT: + (void) fprintf(stderr, + "***Server reports a format error in the received packet (shouldn't happen)\n"); + break; + case INFO_ERR_NODATA: + (void) fprintf(stderr, + "***Server reports data not found\n"); + break; + case INFO_ERR_AUTH: + (void) fprintf(stderr, "***Permission denied\n"); + break; + case ERR_TIMEOUT: + (void) fprintf(stderr, "***Request timed out\n"); + break; + case ERR_INCOMPLETE: + (void) fprintf(stderr, + "***Response from server was incomplete\n"); + break; + default: + (void) fprintf(stderr, + "***Server returns unknown error code %d\n", res); + break; + } + } + return res; +} + + +/* + * getcmds - read commands from the standard input and execute them + */ +static void +getcmds(void) +{ + char * line; + int count; + + ntp_readline_init(interactive ? prompt : NULL); + + for (;;) { + line = ntp_readline(&count); + if (NULL == line) + break; + docmd(line); + free(line); + } + + ntp_readline_uninit(); +} + + +#ifndef SYS_WINNT /* Under NT cannot handle SIGINT, WIN32 spawns a handler */ +/* + * abortcmd - catch interrupts and abort the current command + */ +static RETSIGTYPE +abortcmd( + int sig + ) +{ + + if (current_output == stdout) + (void) fflush(stdout); + putc('\n', stderr); + (void) fflush(stderr); + if (jump) longjmp(interrupt_buf, 1); +} +#endif /* SYS_WINNT */ + +/* + * docmd - decode the command line and execute a command + */ +static void +docmd( + const char *cmdline + ) +{ + char *tokens[1+MAXARGS+MOREARGS+2]; + struct parse pcmd; + int ntok; + int i, ti; + int rval; + struct xcmd *xcmd; + + ai_fam_templ = ai_fam_default; + /* + * Tokenize the command line. If nothing on it, return. + */ + if (strlen(cmdline) >= MAXLINE) { + fprintf(stderr, "***Command ignored, more than %d characters:\n%s\n", + MAXLINE - 1, cmdline); + return; + } + tokenize(cmdline, tokens, &ntok); + if (ntok == 0) + return; + + /* + * Find the appropriate command description. + */ + i = findcmd(tokens[0], builtins, opcmds, &xcmd); + if (i == 0) { + (void) fprintf(stderr, "***Command `%s' unknown\n", + tokens[0]); + return; + } else if (i >= 2) { + (void) fprintf(stderr, "***Command `%s' ambiguous\n", + tokens[0]); + return; + } + + /* + * Save the keyword, then walk through the arguments, interpreting + * as we go. + */ + pcmd.keyword = tokens[0]; + pcmd.nargs = 0; + ti = 1; + for (i = 0; i < MAXARGS && xcmd->arg[i] != NO;) { + if ((i+ti) >= ntok) { + if (!(xcmd->arg[i] & OPT)) { + printusage(xcmd, stderr); + return; + } + break; + } + if ((xcmd->arg[i] & OPT) && (*tokens[i+ti] == '>')) + break; + rval = getarg(tokens[i+ti], (int)xcmd->arg[i], &pcmd.argval[i]); + if (rval == -1) { + ti++; + continue; + } + if (rval == 0) + return; + pcmd.nargs++; + i++; + } + + /* Any extra args are assumed to be "OPT|NTP_STR". */ + for ( ; i < MAXARGS + MOREARGS;) { + if ((i+ti) >= ntok) + break; + rval = getarg(tokens[i+ti], (int)(OPT|NTP_STR), &pcmd.argval[i]); + if (rval == -1) { + ti++; + continue; + } + if (rval == 0) + return; + pcmd.nargs++; + i++; + } + + i += ti; + if (i < ntok && *tokens[i] == '>') { + char *fname; + + if (*(tokens[i]+1) != '\0') + fname = tokens[i]+1; + else if ((i+1) < ntok) + fname = tokens[i+1]; + else { + (void) fprintf(stderr, "***No file for redirect\n"); + return; + } + + current_output = fopen(fname, "w"); + if (current_output == NULL) { + (void) fprintf(stderr, "***Error opening %s: ", fname); + perror(""); + return; + } + } else { + current_output = stdout; + } + + if (interactive && setjmp(interrupt_buf)) { + return; + } else { + jump = 1; + (xcmd->handler)(&pcmd, current_output); + jump = 0; + if (current_output != stdout) + (void) fclose(current_output); + current_output = NULL; + } +} + + +/* + * tokenize - turn a command line into tokens + */ +static void +tokenize( + const char *line, + char **tokens, + int *ntok + ) +{ + register const char *cp; + register char *sp; + static char tspace[MAXLINE]; + + sp = tspace; + cp = line; + for (*ntok = 0; *ntok < MAXTOKENS; (*ntok)++) { + tokens[*ntok] = sp; + while (ISSPACE(*cp)) + cp++; + if (ISEOL(*cp)) + break; + do { + *sp++ = *cp++; + } while (!ISSPACE(*cp) && !ISEOL(*cp)); + + *sp++ = '\0'; + } +} + + + +/* + * findcmd - find a command in a command description table + */ +static int +findcmd( + register char *str, + struct xcmd *clist1, + struct xcmd *clist2, + struct xcmd **cmd + ) +{ + register struct xcmd *cl; + register int clen; + int nmatch; + struct xcmd *nearmatch = NULL; + struct xcmd *clist; + + clen = strlen(str); + nmatch = 0; + if (clist1 != 0) + clist = clist1; + else if (clist2 != 0) + clist = clist2; + else + return 0; + + again: + for (cl = clist; cl->keyword != 0; cl++) { + /* do a first character check, for efficiency */ + if (*str != *(cl->keyword)) + continue; + if (strncmp(str, cl->keyword, (unsigned)clen) == 0) { + /* + * Could be extact match, could be approximate. + * Is exact if the length of the keyword is the + * same as the str. + */ + if (*((cl->keyword) + clen) == '\0') { + *cmd = cl; + return 1; + } + nmatch++; + nearmatch = cl; + } + } + + /* + * See if there is more to do. If so, go again. Sorry about the + * goto, too much looking at BSD sources... + */ + if (clist == clist1 && clist2 != 0) { + clist = clist2; + goto again; + } + + /* + * If we got extactly 1 near match, use it, else return number + * of matches. + */ + if (nmatch == 1) { + *cmd = nearmatch; + return 1; + } + return nmatch; +} + + +/* + * getarg - interpret an argument token + * + * string is always set. + * type is set to the decoded type. + * + * return: 0 - failure + * 1 - success + * -1 - skip to next token + */ +static int +getarg( + char *str, + int code, + arg_v *argp + ) +{ + int isneg; + char *cp, *np; + static const char *digits = "0123456789"; + + ZERO(*argp); + argp->string = str; + argp->type = code & ~OPT; + + switch (argp->type) { + case NTP_STR: + break; + case NTP_ADD: + if (!strcmp("-6", str)) { + ai_fam_templ = AF_INET6; + return -1; + } else if (!strcmp("-4", str)) { + ai_fam_templ = AF_INET; + return -1; + } + if (!getnetnum(str, &(argp->netnum), (char *)0, 0)) { + return 0; + } + break; + case NTP_INT: + case NTP_UINT: + isneg = 0; + np = str; + if (*np == '-') { + np++; + isneg = 1; + } + + argp->uval = 0; + do { + cp = strchr(digits, *np); + if (cp == NULL) { + (void) fprintf(stderr, + "***Illegal integer value %s\n", str); + return 0; + } + argp->uval *= 10; + argp->uval += (cp - digits); + } while (*(++np) != '\0'); + + if (isneg) { + if ((code & ~OPT) == NTP_UINT) { + (void) fprintf(stderr, + "***Value %s should be unsigned\n", str); + return 0; + } + argp->ival = -argp->ival; + } + break; + case IP_VERSION: + if (!strcmp("-6", str)) + argp->ival = 6 ; + else if (!strcmp("-4", str)) + argp->ival = 4 ; + else { + (void) fprintf(stderr, + "***Version must be either 4 or 6\n"); + return 0; + } + break; + } + + return 1; +} + + +/* + * getnetnum - given a host name, return its net number + * and (optional) full name + */ +static int +getnetnum( + const char *hname, + sockaddr_u *num, + char *fullhost, + int af + ) +{ + struct addrinfo hints, *ai = NULL; + + ZERO(hints); + hints.ai_flags = AI_CANONNAME; +#ifdef AI_ADDRCONFIG + hints.ai_flags |= AI_ADDRCONFIG; +#endif + + /* + * decodenetnum only works with addresses, but handles syntax + * that getaddrinfo doesn't: [2001::1]:1234 + */ + if (decodenetnum(hname, num)) { + if (fullhost != NULL) + getnameinfo(&num->sa, SOCKLEN(num), fullhost, + LENHOSTNAME, NULL, 0, 0); + return 1; + } else if (getaddrinfo(hname, "ntp", &hints, &ai) == 0) { + NTP_INSIST(sizeof(*num) >= ai->ai_addrlen); + memcpy(num, ai->ai_addr, ai->ai_addrlen); + if (fullhost != NULL) { + if (ai->ai_canonname != NULL) + strlcpy(fullhost, ai->ai_canonname, + LENHOSTNAME); + else + getnameinfo(&num->sa, SOCKLEN(num), + fullhost, LENHOSTNAME, NULL, + 0, 0); + } + return 1; + } + fprintf(stderr, "***Can't find host %s\n", hname); + + return 0; +} + + +/* + * nntohost - convert network number to host name. This routine enforces + * the showhostnames setting. + */ +const char * +nntohost( + sockaddr_u *netnum + ) +{ + if (!showhostnames || SOCK_UNSPEC(netnum)) + return stoa(netnum); + else if (ISREFCLOCKADR(netnum)) + return refnumtoa(netnum); + else + return socktohost(netnum); +} + + +/* + * Finally, the built in command handlers + */ + +/* + * help - tell about commands, or details of a particular command + */ +static void +help( + struct parse *pcmd, + FILE *fp + ) +{ + struct xcmd *xcp; + char *cmd; + const char *list[100]; + size_t word, words; + size_t row, rows; + size_t col, cols; + size_t length; + + if (pcmd->nargs == 0) { + words = 0; + for (xcp = builtins; xcp->keyword != 0; xcp++) { + if (*(xcp->keyword) != '?') + list[words++] = xcp->keyword; + } + for (xcp = opcmds; xcp->keyword != 0; xcp++) + list[words++] = xcp->keyword; + + qsort((void *)list, words, sizeof(list[0]), helpsort); + col = 0; + for (word = 0; word < words; word++) { + length = strlen(list[word]); + col = max(col, length); + } + + cols = SCREENWIDTH / ++col; + rows = (words + cols - 1) / cols; + + fprintf(fp, "ntpdc commands:\n"); + + for (row = 0; row < rows; row++) { + for (word = row; word < words; word += rows) + fprintf(fp, "%-*.*s", (int)col, + (int)col - 1, list[word]); + fprintf(fp, "\n"); + } + } else { + cmd = pcmd->argval[0].string; + words = findcmd(cmd, builtins, opcmds, &xcp); + if (words == 0) { + fprintf(stderr, + "Command `%s' is unknown\n", cmd); + return; + } else if (words >= 2) { + fprintf(stderr, + "Command `%s' is ambiguous\n", cmd); + return; + } + fprintf(fp, "function: %s\n", xcp->comment); + printusage(xcp, fp); + } +} + + +/* + * helpsort - do hostname qsort comparisons + */ +static int +helpsort( + const void *t1, + const void *t2 + ) +{ + const char * const * name1 = t1; + const char * const * name2 = t2; + + return strcmp(*name1, *name2); +} + + +/* + * printusage - print usage information for a command + */ +static void +printusage( + struct xcmd *xcp, + FILE *fp + ) +{ + int i, opt46; + + opt46 = 0; + (void) fprintf(fp, "usage: %s", xcp->keyword); + for (i = 0; i < MAXARGS && xcp->arg[i] != NO; i++) { + if (opt46 == 0 && (xcp->arg[i] & ~OPT) == NTP_ADD) { + (void) fprintf(fp, " [ -4|-6 ]"); + opt46 = 1; + } + if (xcp->arg[i] & OPT) + (void) fprintf(fp, " [ %s ]", xcp->desc[i]); + else + (void) fprintf(fp, " %s", xcp->desc[i]); + } + (void) fprintf(fp, "\n"); +} + + +/* + * timeout - set time out time + */ +static void +timeout( + struct parse *pcmd, + FILE *fp + ) +{ + int val; + + if (pcmd->nargs == 0) { + val = tvout.tv_sec * 1000 + tvout.tv_usec / 1000; + (void) fprintf(fp, "primary timeout %d ms\n", val); + } else { + tvout.tv_sec = pcmd->argval[0].uval / 1000; + tvout.tv_usec = (pcmd->argval[0].uval - (tvout.tv_sec * 1000)) + * 1000; + } +} + + +/* + * my_delay - set delay for auth requests + */ +static void +my_delay( + struct parse *pcmd, + FILE *fp + ) +{ + int isneg; + u_long val; + + if (pcmd->nargs == 0) { + val = delay_time.l_ui * 1000 + delay_time.l_uf / 4294967; + (void) fprintf(fp, "delay %lu ms\n", val); + } else { + if (pcmd->argval[0].ival < 0) { + isneg = 1; + val = (u_long)(-pcmd->argval[0].ival); + } else { + isneg = 0; + val = (u_long)pcmd->argval[0].ival; + } + + delay_time.l_ui = val / 1000; + val %= 1000; + delay_time.l_uf = val * 4294967; /* 2**32/1000 */ + + if (isneg) + L_NEG(&delay_time); + } +} + + +/* + * host - set the host we are dealing with. + */ +static void +host( + struct parse *pcmd, + FILE *fp + ) +{ + int i; + + if (pcmd->nargs == 0) { + if (havehost) + (void) fprintf(fp, "current host is %s\n", currenthost); + else + (void) fprintf(fp, "no current host\n"); + return; + } + + i = 0; + if (pcmd->nargs == 2) { + if (!strcmp("-4", pcmd->argval[i].string)) + ai_fam_templ = AF_INET; + else if (!strcmp("-6", pcmd->argval[i].string)) + ai_fam_templ = AF_INET6; + else { + if (havehost) + (void) fprintf(fp, + "current host remains %s\n", currenthost); + else + (void) fprintf(fp, "still no current host\n"); + return; + } + i = 1; + } + if (openhost(pcmd->argval[i].string)) { + (void) fprintf(fp, "current host set to %s\n", currenthost); + } else { + if (havehost) + (void) fprintf(fp, + "current host remains %s\n", currenthost); + else + (void) fprintf(fp, "still no current host\n"); + } +} + + +/* + * keyid - get a keyid to use for authenticating requests + */ +static void +keyid( + struct parse *pcmd, + FILE *fp + ) +{ + if (pcmd->nargs == 0) { + if (info_auth_keyid == 0 && !keyid_entered) + (void) fprintf(fp, "no keyid defined\n"); + else if (info_auth_keyid == 0 && keyid_entered) + (void) fprintf(fp, "no keyid will be sent\n"); + else + (void) fprintf(fp, "keyid is %lu\n", (u_long)info_auth_keyid); + } else { + info_auth_keyid = pcmd->argval[0].uval; + keyid_entered = 1; + } +} + + +/* + * keytype - get type of key to use for authenticating requests + */ +static void +keytype( + struct parse *pcmd, + FILE *fp + ) +{ + const char * digest_name; + size_t digest_len; + int key_type; + + if (!pcmd->nargs) { + fprintf(fp, "keytype is %s with %lu octet digests\n", + keytype_name(info_auth_keytype), + (u_long)info_auth_hashlen); + return; + } + + digest_name = pcmd->argval[0].string; + digest_len = 0; + key_type = keytype_from_text(digest_name, &digest_len); + + if (!key_type) { + fprintf(fp, "keytype must be 'md5'%s\n", +#ifdef OPENSSL + " or a digest type provided by OpenSSL"); +#else + ""); +#endif + return; + } + + info_auth_keytype = key_type; + info_auth_hashlen = digest_len; +} + + +/* + * passwd - get an authentication key + */ +/*ARGSUSED*/ +static void +passwd( + struct parse *pcmd, + FILE *fp + ) +{ + char *pass; + + if (info_auth_keyid == 0) { + info_auth_keyid = getkeyid("Keyid: "); + if (info_auth_keyid == 0) { + (void)fprintf(fp, "Keyid must be defined\n"); + return; + } + } + if (pcmd->nargs >= 1) + pass = pcmd->argval[0].string; + else { + pass = getpass_keytype(info_auth_keytype); + if ('\0' == *pass) { + fprintf(fp, "Password unchanged\n"); + return; + } + } + authusekey(info_auth_keyid, info_auth_keytype, (u_char *)pass); + authtrust(info_auth_keyid, 1); +} + + +/* + * hostnames - set the showhostnames flag + */ +static void +hostnames( + struct parse *pcmd, + FILE *fp + ) +{ + if (pcmd->nargs == 0) { + if (showhostnames) + (void) fprintf(fp, "hostnames being shown\n"); + else + (void) fprintf(fp, "hostnames not being shown\n"); + } else { + if (STREQ(pcmd->argval[0].string, "yes")) + showhostnames = 1; + else if (STREQ(pcmd->argval[0].string, "no")) + showhostnames = 0; + else + (void)fprintf(stderr, "What?\n"); + } +} + + +/* + * setdebug - set/change debugging level + */ +static void +setdebug( + struct parse *pcmd, + FILE *fp + ) +{ + if (pcmd->nargs == 0) { + (void) fprintf(fp, "debug level is %d\n", debug); + return; + } else if (STREQ(pcmd->argval[0].string, "no")) { + debug = 0; + } else if (STREQ(pcmd->argval[0].string, "more")) { + debug++; + } else if (STREQ(pcmd->argval[0].string, "less")) { + debug--; + } else { + (void) fprintf(fp, "What?\n"); + return; + } + (void) fprintf(fp, "debug level set to %d\n", debug); +} + + +/* + * quit - stop this nonsense + */ +/*ARGSUSED*/ +static void +quit( + struct parse *pcmd, + FILE *fp + ) +{ + if (havehost) + closesocket(sockfd); + exit(0); +} + + +/* + * version - print the current version number + */ +/*ARGSUSED*/ +static void +version( + struct parse *pcmd, + FILE *fp + ) +{ + + (void) fprintf(fp, "%s\n", Version); + return; +} + + +/* + * warning - print a warning message + */ +static void +warning( + const char *fmt, + const char *st1, + const char *st2 + ) +{ + (void) fprintf(stderr, "%s: ", progname); + (void) fprintf(stderr, fmt, st1, st2); + (void) fprintf(stderr, ": "); + perror(""); +} + + +/* + * error - print a message and exit + */ +static void +error( + const char *fmt, + const char *st1, + const char *st2 + ) +{ + warning(fmt, st1, st2); + exit(1); +} + +/* + * getkeyid - prompt the user for a keyid to use + */ +static u_long +getkeyid( + const char *keyprompt + ) +{ + int c; + FILE *fi; + char pbuf[20]; + size_t i; + size_t ilim; + +#ifndef SYS_WINNT + if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL) +#else + if ((fi = _fdopen(open("CONIN$", _O_TEXT), "r")) == NULL) +#endif /* SYS_WINNT */ + fi = stdin; + else + setbuf(fi, (char *)NULL); + fprintf(stderr, "%s", keyprompt); fflush(stderr); + for (i = 0, ilim = COUNTOF(pbuf) - 1; + i < ilim && (c = getc(fi)) != '\n' && c != EOF; + ) + pbuf[i++] = (char)c; + pbuf[i] = '\0'; + if (fi != stdin) + fclose(fi); + + return (u_long) atoi(pbuf); +} diff --git a/ntpdc/ntpdc.h b/ntpdc/ntpdc.h new file mode 100644 index 0000000..bfc2228 --- /dev/null +++ b/ntpdc/ntpdc.h @@ -0,0 +1,67 @@ +/* + * ntpdc.h - definitions of interest to ntpdc + */ +#include "ntp_fp.h" +#include "ntp.h" +#include "ntp_request.h" +#include "ntp_string.h" +#include "ntp_malloc.h" + +/* + * Maximum number of arguments + */ +#define MAXARGS 4 +#define MOREARGS 10 + +/* + * Flags for forming descriptors. + */ +#define OPT 0x80 /* this argument is optional, or'd with type */ + +#define NO 0x0 +#define NTP_STR 0x1 /* string argument */ +#define NTP_UINT 0x2 /* unsigned integer */ +#define NTP_INT 0x3 /* signed integer */ +#define NTP_ADD 0x4 /* IP network address */ +#define IP_VERSION 0x5 /* IP version */ + +/* + * Arguments are returned in a struct - no + * union space saving is attempted. + */ +typedef struct { + u_char type; + char *string; + long ival; + u_long uval; + sockaddr_u netnum; +} arg_v; + +/* + * Structure for passing parsed command line + */ +struct parse { + char *keyword; + arg_v argval[MAXARGS + MOREARGS]; + int nargs; +}; + +/* + * ntpdc includes a command parser which could charitably be called + * crude. The following structure is used to define the command + * syntax. + */ +struct xcmd { + const char *keyword; /* command key word */ + void (*handler) (struct parse *, FILE *); /* command handler */ + u_char arg[MAXARGS]; /* descriptors for arguments */ + const char *desc[MAXARGS]; /* descriptions for arguments */ + const char *comment; +}; + +extern int impl_ver; +extern int showhostnames; +extern int s_port; + +extern int doquery (int, int, int, int, int, char *, int *, int *, char **, int, int); +extern const char * nntohost (sockaddr_u *); diff --git a/ntpdc/ntpdc.html b/ntpdc/ntpdc.html new file mode 100644 index 0000000..8381a2b --- /dev/null +++ b/ntpdc/ntpdc.html @@ -0,0 +1,515 @@ +<html lang="en"> +<head> +<title>ntpdc: NTPD Control User's Manual</title> +<meta http-equiv="Content-Type" content="text/html"> +<meta name="description" content="ntpdc: NTPD Control User's Manual"> +<meta name="generator" content="makeinfo 4.7"> +<link title="Top" rel="top" href="#Top"> +<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> +<meta http-equiv="Content-Style-Type" content="text/css"> +<style type="text/css"><!-- + pre.display { font-family:inherit } + pre.format { font-family:inherit } + pre.smalldisplay { font-family:inherit; font-size:smaller } + pre.smallformat { font-family:inherit; font-size:smaller } + pre.smallexample { font-size:smaller } + pre.smalllisp { font-size:smaller } + span.sc { font-variant:small-caps } + span.roman { font-family: serif; font-weight: normal; } +--></style> +</head> +<body> +<h1 class="settitle">ntpdc: NTPD Control User's Manual</h1> +<div class="node"> +<p><hr> +<a name="Top"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-Description">ntpdc Description</a>, +Previous: <a rel="previous" accesskey="p" href="#dir">(dir)</a>, +Up: <a rel="up" accesskey="u" href="#dir">(dir)</a> +<br> +</div> + +<h2 class="unnumbered">ntpdc: NTPD Control User Manual</h2> + +<p>This document describes the use of the NTP Project's <code>ntpdc</code> program, +that can be used to query a Network Time Protocol (NTP) server and +display the time offset of the system clock relative to the server +clock. Run as root, it can correct the system clock to this offset as +well. It can be run as an interactive command or from a cron job. + + <p>This document applies to version 4.2.7p482 of <code>ntpdc</code>. + + <p>The program implements the SNTP protocol as defined by RFC 5905, the NTPv4 +IETF specification. + + <div class="shortcontents"> +<h2>Short Contents</h2> +<ul> +<a href="#Top">ntpdc: NTPD Control User Manual</a> +</ul> +</div> + +<ul class="menu"> +<li><a accesskey="1" href="#ntpdc-Description">ntpdc Description</a>: Description +<li><a accesskey="2" href="#ntpdc-Invocation">ntpdc Invocation</a>: Invoking ntpdc +<li><a accesskey="3" href="#Usage">Usage</a>: Usage +</ul> + +<div class="node"> +<p><hr> +<a name="ntpdc-Description"></a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">Description</h3> + +<p>By default, <code>ntpdc</code> writes the local data and time (i.e., not UTC) to the +standard output in the format: + +<pre class="example"> 1996-10-15 20:17:25.123 (+0800) +4.567 +/- 0.089 secs +</pre> + <p>where +YYYY-MM-DD HH:MM:SS.SUBSEC is the local date and time, +(+0800) is the local timezone adjustment (so we would add 8 hours and 0 minutes to convert the reported local time to UTC), +and +the +4.567 +/- 0.089 secs indicates the time offset and +error bound of the system clock relative to the server clock. + +<div class="node"> +<p><hr> +<a name="ntpdc-Invocation"></a> +<br> +</div> + +<h3 class="section">Invoking ntpdc</h3> + +<p><a name="index-ntpdc-1"></a><a name="index-vendor_002dspecific-NTPD-control-program-2"></a> + + <p><code>ntpdc</code> +is deprecated. +Please use +<code>ntpq(1ntpqmdoc)</code> instead - it can do everything +<code>ntpdc</code> +used to do, and it does so using a much more sane interface. + + <p><code>ntpdc</code> +is a utility program used to query +<code>ntpd(1ntpdmdoc)</code> +about its +current state and to request changes in that state. +It uses NTP mode 7 control message formats described in the source code. +The program may +be run either in interactive mode or controlled using command line +arguments. +Extensive state and statistics information is available +through the +<code>ntpdc</code> +interface. +In addition, nearly all the +configuration options which can be specified at startup using +ntpd's configuration file may also be specified at run time using +<code>ntpdc</code> + + <p>This section was generated by <strong>AutoGen</strong>, +using the <code>agtexi-cmd</code> template and the option descriptions for the <code>ntpdc</code> program. +This software is released under the NTP license, <http://ntp.org/license>. + +<ul class="menu"> +<li><a accesskey="1" href="#ntpdc-usage">ntpdc usage</a>: ntpdc help/usage (<span class="option">--help</span>) +<li><a accesskey="2" href="#ntpdc-ipv4">ntpdc ipv4</a>: ipv4 option (-4) +<li><a accesskey="3" href="#ntpdc-ipv6">ntpdc ipv6</a>: ipv6 option (-6) +<li><a accesskey="4" href="#ntpdc-command">ntpdc command</a>: command option (-c) +<li><a accesskey="5" href="#ntpdc-interactive">ntpdc interactive</a>: interactive option (-i) +<li><a accesskey="6" href="#ntpdc-listpeers">ntpdc listpeers</a>: listpeers option (-l) +<li><a accesskey="7" href="#ntpdc-numeric">ntpdc numeric</a>: numeric option (-n) +<li><a accesskey="8" href="#ntpdc-peers">ntpdc peers</a>: peers option (-p) +<li><a accesskey="9" href="#ntpdc-showpeers">ntpdc showpeers</a>: showpeers option (-s) +<li><a href="#ntpdc-config">ntpdc config</a>: presetting/configuring ntpdc +<li><a href="#ntpdc-exit-status">ntpdc exit status</a>: exit status +<li><a href="#ntpdc-Usage">ntpdc Usage</a>: Usage +<li><a href="#ntpdc-See-Also">ntpdc See Also</a>: See Also +<li><a href="#ntpdc-Authors">ntpdc Authors</a>: Authors +<li><a href="#ntpdc-Bugs">ntpdc Bugs</a>: Bugs +</ul> + +<div class="node"> +<p><hr> +<a name="ntpdc-usage"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-ipv4">ntpdc ipv4</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">ntpdc help/usage (<span class="option">--help</span>)</h4> + +<p><a name="index-ntpdc-help-3"></a> +This is the automatically generated usage text for ntpdc. + + <p>The text printed is the same whether selected with the <code>help</code> option +(<span class="option">--help</span>) or the <code>more-help</code> option (<span class="option">--more-help</span>). <code>more-help</code> will print +the usage text by passing it through a pager program. +<code>more-help</code> is disabled on platforms without a working +<code>fork(2)</code> function. The <code>PAGER</code> environment variable is +used to select the program, defaulting to <span class="file">more</span>. Both will exit +with a status code of 0. + +<pre class="example">ntpdc - vendor-specific NTPD control program - Ver. 4.2.7p482 +Usage: ntpdc [ -<flag> [<val>] | --<name>[{=| }<val>] ]... [ host ...] + Flg Arg Option-Name Description + -4 no ipv4 Force IPv4 DNS name resolution + - prohibits the option 'ipv6' + -6 no ipv6 Force IPv6 DNS name resolution + - prohibits the option 'ipv4' + -c Str command run a command and exit + - may appear multiple times + -d no debug-level Increase debug verbosity level + - may appear multiple times + -D Num set-debug-level Set the debug verbosity level + - may appear multiple times + -i no interactive Force ntpq to operate in interactive mode + - prohibits these options: + command + listpeers + peers + showpeers + -l no listpeers Print a list of the peers + - prohibits the option 'command' + -n no numeric numeric host addresses + -p no peers Print a list of the peers + - prohibits the option 'command' + -s no showpeers Show a list of the peers + - prohibits the option 'command' + opt version output version information and exit + -? no help display extended usage information and exit + -! no more-help extended usage information passed thru pager + -> opt save-opts save the option state to a config file + -< Str load-opts load options from a config file + - disabled as '--no-load-opts' + - may appear multiple times + +Options are specified by doubled hyphens and their name or by a single +hyphen and the flag character. + + +The following option preset mechanisms are supported: + - reading file $HOME/.ntprc + - reading file ./.ntprc + - examining environment variables named NTPDC_* + +Please send bug reports to: <http://bugs.ntp.org, bugs@ntp.org> +</pre> + <div class="node"> +<p><hr> +<a name="ntpdc-ipv4"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-ipv6">ntpdc ipv6</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-usage">ntpdc usage</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">ipv4 option (-4)</h4> + +<p><a name="index-ntpdc_002dipv4-4"></a> +This is the “force ipv4 dns name resolution” option. + +<p class="noindent">This option has some usage constraints. It: + <ul> +<li>must not appear in combination with any of the following options: +ipv6. +</ul> + + <p>Force DNS resolution of following host names on the command line +to the IPv4 namespace. +<div class="node"> +<p><hr> +<a name="ntpdc-ipv6"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-command">ntpdc command</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-ipv4">ntpdc ipv4</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">ipv6 option (-6)</h4> + +<p><a name="index-ntpdc_002dipv6-5"></a> +This is the “force ipv6 dns name resolution” option. + +<p class="noindent">This option has some usage constraints. It: + <ul> +<li>must not appear in combination with any of the following options: +ipv4. +</ul> + + <p>Force DNS resolution of following host names on the command line +to the IPv6 namespace. +<div class="node"> +<p><hr> +<a name="ntpdc-command"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-interactive">ntpdc interactive</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-ipv6">ntpdc ipv6</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">command option (-c)</h4> + +<p><a name="index-ntpdc_002dcommand-6"></a> +This is the “run a command and exit” option. +This option takes a string argument <span class="file">cmd</span>. + +<p class="noindent">This option has some usage constraints. It: + <ul> +<li>may appear an unlimited number of times. +</ul> + + <p>The following argument is interpreted as an interactive format command +and is added to the list of commands to be executed on the specified +host(s). +<div class="node"> +<p><hr> +<a name="ntpdc-interactive"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-listpeers">ntpdc listpeers</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-command">ntpdc command</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">interactive option (-i)</h4> + +<p><a name="index-ntpdc_002dinteractive-7"></a> +This is the “force ntpq to operate in interactive mode” option. + +<p class="noindent">This option has some usage constraints. It: + <ul> +<li>must not appear in combination with any of the following options: +command, listpeers, peers, showpeers. +</ul> + + <p>Force ntpq to operate in interactive mode. Prompts will be written +to the standard output and commands read from the standard input. +<div class="node"> +<p><hr> +<a name="ntpdc-listpeers"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-numeric">ntpdc numeric</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-interactive">ntpdc interactive</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">listpeers option (-l)</h4> + +<p><a name="index-ntpdc_002dlistpeers-8"></a> +This is the “print a list of the peers” option. + +<p class="noindent">This option has some usage constraints. It: + <ul> +<li>must not appear in combination with any of the following options: +command. +</ul> + + <p>Print a list of the peers known to the server as well as a summary of +their state. This is equivalent to the 'listpeers' interactive command. +<div class="node"> +<p><hr> +<a name="ntpdc-numeric"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-peers">ntpdc peers</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-listpeers">ntpdc listpeers</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">numeric option (-n)</h4> + +<p><a name="index-ntpdc_002dnumeric-9"></a> +This is the “numeric host addresses” option. +Output all host addresses in dotted-quad numeric format rather than +converting to the canonical host names. +<div class="node"> +<p><hr> +<a name="ntpdc-peers"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-showpeers">ntpdc showpeers</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-numeric">ntpdc numeric</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">peers option (-p)</h4> + +<p><a name="index-ntpdc_002dpeers-10"></a> +This is the “print a list of the peers” option. + +<p class="noindent">This option has some usage constraints. It: + <ul> +<li>must not appear in combination with any of the following options: +command. +</ul> + + <p>Print a list of the peers known to the server as well as a summary +of their state. This is equivalent to the 'peers' interactive command. +<div class="node"> +<p><hr> +<a name="ntpdc-showpeers"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-config">ntpdc config</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-peers">ntpdc peers</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">showpeers option (-s)</h4> + +<p><a name="index-ntpdc_002dshowpeers-11"></a> +This is the “show a list of the peers” option. + +<p class="noindent">This option has some usage constraints. It: + <ul> +<li>must not appear in combination with any of the following options: +command. +</ul> + + <p>Print a list of the peers known to the server as well as a summary +of their state. This is equivalent to the 'dmpeers' interactive command. + +<div class="node"> +<p><hr> +<a name="ntpdc-config"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-exit-status">ntpdc exit status</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-showpeers">ntpdc showpeers</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">presetting/configuring ntpdc</h4> + +<p>Any option that is not marked as <i>not presettable</i> may be preset by +loading values from configuration ("rc" or "ini") files, and values from environment variables named <code>NTPDC</code> and <code>NTPDC_<OPTION_NAME></code>. <code><OPTION_NAME></code> must be one of +the options listed above in upper case and segmented with underscores. +The <code>NTPDC</code> variable will be tokenized and parsed like +the command line. The remaining variables are tested for existence and their +values are treated like option arguments. + +<p class="noindent"><code>libopts</code> will search in 2 places for configuration files: + <ul> +<li>$HOME +<li>$PWD +</ul> + The environment variables <code>HOME</code>, and <code>PWD</code> +are expanded and replaced when <span class="file">ntpdc</span> runs. +For any of these that are plain files, they are simply processed. +For any that are directories, then a file named <span class="file">.ntprc</span> is searched for +within that directory and processed. + + <p>Configuration files may be in a wide variety of formats. +The basic format is an option name followed by a value (argument) on the +same line. Values may be separated from the option name with a colon, +equal sign or simply white space. Values may be continued across multiple +lines by escaping the newline with a backslash. + + <p>Multiple programs may also share the same initialization file. +Common options are collected at the top, followed by program specific +segments. The segments are separated by lines like: +<pre class="example"> [NTPDC] +</pre> + <p class="noindent">or by +<pre class="example"> <?program ntpdc> +</pre> + <p class="noindent">Do not mix these styles within one configuration file. + + <p>Compound values and carefully constructed string values may also be +specified using XML syntax: +<pre class="example"> <option-name> + <sub-opt>...&lt;...&gt;...</sub-opt> + </option-name> +</pre> + <p class="noindent">yielding an <code>option-name.sub-opt</code> string value of +<pre class="example"> "...<...>..." +</pre> + <p><code>AutoOpts</code> does not track suboptions. You simply note that it is a +hierarchicly valued option. <code>AutoOpts</code> does provide a means for searching +the associated name/value pair list (see: optionFindValue). + + <p>The command line options relating to configuration and/or usage help are: + +<h5 class="subsubheading">version (-)</h5> + +<p>Print the program version to standard out, optionally with licensing +information, then exit 0. The optional argument specifies how much licensing +detail to provide. The default is to print just the version. The licensing infomation may be selected with an option argument. +Only the first letter of the argument is examined: + + <dl> +<dt><span class="samp">version</span><dd>Only print the version. This is the default. +<br><dt><span class="samp">copyright</span><dd>Name the copyright usage licensing terms. +<br><dt><span class="samp">verbose</span><dd>Print the full copyright usage licensing terms. +</dl> + +<div class="node"> +<p><hr> +<a name="ntpdc-exit-status"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-Usage">ntpdc Usage</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-config">ntpdc config</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">ntpdc exit status</h4> + +<p>One of the following exit values will be returned: + <dl> +<dt><span class="samp">0 (EXIT_SUCCESS)</span><dd>Successful program execution. +<br><dt><span class="samp">1 (EXIT_FAILURE)</span><dd>The operation failed or the command syntax was not valid. +<br><dt><span class="samp">66 (EX_NOINPUT)</span><dd>A specified configuration file could not be loaded. +<br><dt><span class="samp">70 (EX_SOFTWARE)</span><dd>libopts had an internal operational error. Please report +it to autogen-users@lists.sourceforge.net. Thank you. +</dl> + <div class="node"> +<p><hr> +<a name="ntpdc-Usage"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-See-Also">ntpdc See Also</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-exit-status">ntpdc exit status</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">ntpdc Usage</h4> + +<div class="node"> +<p><hr> +<a name="ntpdc-See-Also"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-Authors">ntpdc Authors</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-Usage">ntpdc Usage</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">ntpdc See Also</h4> + +<div class="node"> +<p><hr> +<a name="ntpdc-Authors"></a>Next: <a rel="next" accesskey="n" href="#ntpdc-Bugs">ntpdc Bugs</a>, +Previous: <a rel="previous" accesskey="p" href="#ntpdc-See-Also">ntpdc See Also</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">ntpdc Authors</h4> + +<div class="node"> +<p><hr> +<a name="ntpdc-Bugs"></a>Previous: <a rel="previous" accesskey="p" href="#ntpdc-Authors">ntpdc Authors</a>, +Up: <a rel="up" accesskey="u" href="#ntpdc-Invocation">ntpdc Invocation</a> +<br> +</div> + +<h4 class="subsection">ntpdc Bugs</h4> + +<div class="node"> +<p><hr> +<a name="Usage"></a> +<br> +</div> + +<!-- node-name, next, previous, up --> +<h3 class="section">Usage</h3> + +<p>The simplest use of this program is as an unprivileged command to +check the current time, offset, and error in the local clock. +For example: + +<pre class="example"> ntpdc ntpserver.somewhere +</pre> + <p>With suitable privilege, it can be run as a command or in a +<code>cron</code> job to reset the local clock from a reliable server, like +the <code>ntpdate</code> and <code>rdate</code> commands. +For example: + +<pre class="example"> ntpdc -a ntpserver.somewhere +</pre> + </body></html> + diff --git a/ntpdc/ntpdc.man.in b/ntpdc/ntpdc.man.in new file mode 100644 index 0000000..db5d1cc --- /dev/null +++ b/ntpdc/ntpdc.man.in @@ -0,0 +1,874 @@ +.de1 NOP +. it 1 an-trap +. if \\n[.$] \,\\$*\/ +.. +.ie t \ +.ds B-Font [CB] +.ds I-Font [CI] +.ds R-Font [CR] +.el \ +.ds B-Font B +.ds I-Font I +.ds R-Font R +.TH ntpdc @NTPDC_MS@ "02 Dec 2014" "4.2.7p482" "User Commands" +.\" +.\" EDIT THIS FILE WITH CAUTION (/tmp/.ag-6QaWHN/ag-hRaOGN) +.\" +.\" It has been AutoGen-ed December 2, 2014 at 08:57:28 AM by AutoGen 5.18.5pre4 +.\" From the definitions ntpdc-opts.def +.\" and the template file agman-cmd.tpl +.SH NAME +\f\*[B-Font]ntpdc\fP +\- vendor-specific NTPD control program +.SH SYNOPSIS +\f\*[B-Font]ntpdc\fP +.\" Mixture of short (flag) options and long options +[\f\*[B-Font]\-flags\f[]] +[\f\*[B-Font]\-flag\f[] [\f\*[I-Font]value\f[]]] +[\f\*[B-Font]\-\-option-name\f[][[=| ]\f\*[I-Font]value\f[]]] +[ host ...] +.sp \n(Ppu +.ne 2 + +.SH DESCRIPTION +\f\*[B-Font]ntpdc\fP +is deprecated. +Please use +\fCntpq\fR(@NTPQ_MS@)\f[] instead \- it can do everything +\f\*[B-Font]ntpdc\fP +used to do, and it does so using a much more sane interface. +.sp \n(Ppu +.ne 2 + +\f\*[B-Font]ntpdc\fP +is a utility program used to query +\fCntpd\fR(@NTPD_MS@)\f[] +about its +current state and to request changes in that state. +It uses NTP mode 7 control message formats described in the source code. +The program may +be run either in interactive mode or controlled using command line +arguments. +Extensive state and statistics information is available +through the +\f\*[B-Font]ntpdc\fP +interface. +In addition, nearly all the +configuration options which can be specified at startup using +ntpd's configuration file may also be specified at run time using +\f\*[B-Font]ntpdc\fP. +.SH "OPTIONS" +.TP +.NOP \f\*[B-Font]\-4\f[], \f\*[B-Font]\-\-ipv4\f[] +Force IPv4 DNS name resolution. +This option must not appear in combination with any of the following options: +ipv6. +.sp +Force DNS resolution of following host names on the command line +to the IPv4 namespace. +.TP +.NOP \f\*[B-Font]\-6\f[], \f\*[B-Font]\-\-ipv6\f[] +Force IPv6 DNS name resolution. +This option must not appear in combination with any of the following options: +ipv4. +.sp +Force DNS resolution of following host names on the command line +to the IPv6 namespace. +.TP +.NOP \f\*[B-Font]\-c\f[] \f\*[I-Font]cmd\f[], \f\*[B-Font]\-\-command\f[]=\f\*[I-Font]cmd\f[] +run a command and exit. +This option may appear an unlimited number of times. +.sp +The following argument is interpreted as an interactive format command +and is added to the list of commands to be executed on the specified +host(s). +.TP +.NOP \f\*[B-Font]\-d\f[], \f\*[B-Font]\-\-debug\-level\f[] +Increase debug verbosity level. +This option may appear an unlimited number of times. +.sp +.TP +.NOP \f\*[B-Font]\-D\f[] \f\*[I-Font]number\f[], \f\*[B-Font]\-\-set\-debug\-level\f[]=\f\*[I-Font]number\f[] +Set the debug verbosity level. +This option may appear an unlimited number of times. +This option takes an integer number as its argument. +.sp +.TP +.NOP \f\*[B-Font]\-i\f[], \f\*[B-Font]\-\-interactive\f[] +Force ntpq to operate in interactive mode. +This option must not appear in combination with any of the following options: +command, listpeers, peers, showpeers. +.sp +Force ntpq to operate in interactive mode. Prompts will be written +to the standard output and commands read from the standard input. +.TP +.NOP \f\*[B-Font]\-l\f[], \f\*[B-Font]\-\-listpeers\f[] +Print a list of the peers. +This option must not appear in combination with any of the following options: +command. +.sp +Print a list of the peers known to the server as well as a summary of +their state. This is equivalent to the 'listpeers' interactive command. +.TP +.NOP \f\*[B-Font]\-n\f[], \f\*[B-Font]\-\-numeric\f[] +numeric host addresses. +.sp +Output all host addresses in dotted-quad numeric format rather than +converting to the canonical host names. +.TP +.NOP \f\*[B-Font]\-p\f[], \f\*[B-Font]\-\-peers\f[] +Print a list of the peers. +This option must not appear in combination with any of the following options: +command. +.sp +Print a list of the peers known to the server as well as a summary +of their state. This is equivalent to the 'peers' interactive command. +.TP +.NOP \f\*[B-Font]\-s\f[], \f\*[B-Font]\-\-showpeers\f[] +Show a list of the peers. +This option must not appear in combination with any of the following options: +command. +.sp +Print a list of the peers known to the server as well as a summary +of their state. This is equivalent to the 'dmpeers' interactive command. +.TP +.NOP \f\*[B-Font]\-\&?\f[], \f\*[B-Font]\-\-help\f[] +Display usage information and exit. +.TP +.NOP \f\*[B-Font]\-\&!\f[], \f\*[B-Font]\-\-more-help\f[] +Pass the extended usage information through a pager. +.TP +.NOP \f\*[B-Font]\->\f[] [\f\*[I-Font]cfgfile\f[]], \f\*[B-Font]\-\-save-opts\f[] [=\f\*[I-Font]cfgfile\f[]] +Save the option state to \fIcfgfile\fP. The default is the \fIlast\fP +configuration file listed in the \fBOPTION PRESETS\fP section, below. +The command will exit after updating the config file. +.TP +.NOP \f\*[B-Font]\-<\f[] \f\*[I-Font]cfgfile\f[], \f\*[B-Font]\-\-load-opts\f[]=\f\*[I-Font]cfgfile\f[], \f\*[B-Font]\-\-no-load-opts\f[] +Load options from \fIcfgfile\fP. +The \fIno-load-opts\fP form will disable the loading +of earlier config/rc/ini files. \fI\-\-no-load-opts\fP is handled early, +out of order. +.TP +.NOP \f\*[B-Font]\-\-version\f[] [{\f\*[I-Font]v|c|n\f[]}] +Output version of program and exit. The default mode is `v', a simple +version. The `c' mode will print copyright information and `n' will +print the full copyright notice. +.PP +.SH "OPTION PRESETS" +Any option that is not marked as \fInot presettable\fP may be preset +by loading values from configuration ("RC" or ".INI") file(s) and values from +environment variables named: +.nf + \fBNTPDC_<option-name>\fP or \fBNTPDC\fP +.fi +.ad +The environmental presets take precedence (are processed later than) +the configuration files. +The \fIhomerc\fP files are "\fI$HOME\fP", and "\fI.\fP". +If any of these are directories, then the file \fI.ntprc\fP +is searched for within those directories. +.SH USAGE +If one or more request options are included on the command line +when +\f\*[B-Font]ntpdc\fP +is executed, each of the requests will be sent +to the NTP servers running on each of the hosts given as command +line arguments, or on localhost by default. +If no request options +are given, +\f\*[B-Font]ntpdc\fP +will attempt to read commands from the +standard input and execute these on the NTP server running on the +first host given on the command line, again defaulting to localhost +when no other host is specified. +The +\f\*[B-Font]ntpdc\fP +utility will prompt for +commands if the standard input is a terminal device. +.sp \n(Ppu +.ne 2 + +The +\f\*[B-Font]ntpdc\fP +utility uses NTP mode 7 packets to communicate with the +NTP server, and hence can be used to query any compatible server on +the network which permits it. +Note that since NTP is a UDP protocol +this communication will be somewhat unreliable, especially over +large distances in terms of network topology. +The +\f\*[B-Font]ntpdc\fP +utility makes +no attempt to retransmit requests, and will time requests out if +the remote host is not heard from within a suitable timeout +time. +.sp \n(Ppu +.ne 2 + +The operation of +\f\*[B-Font]ntpdc\fP +are specific to the particular +implementation of the +\fCntpd\fR(@NTPD_MS@)\f[] +daemon and can be expected to +work only with this and maybe some previous versions of the daemon. +Requests from a remote +\f\*[B-Font]ntpdc\fP +utility which affect the +state of the local server must be authenticated, which requires +both the remote program and local server share a common key and key +identifier. +.sp \n(Ppu +.ne 2 + +Note that in contexts where a host name is expected, a +\f\*[B-Font]\-4\f[] +qualifier preceding the host name forces DNS resolution to the IPv4 namespace, +while a +\f\*[B-Font]\-6\f[] +qualifier forces DNS resolution to the IPv6 namespace. +Specifying a command line option other than +\f\*[B-Font]\-i\f[] +or +\f\*[B-Font]\-n\f[] +will cause the specified query (queries) to be sent to +the indicated host(s) immediately. +Otherwise, +\f\*[B-Font]ntpdc\fP +will +attempt to read interactive format commands from the standard +input. +.SS "Interactive Commands" +Interactive format commands consist of a keyword followed by zero +to four arguments. +Only enough characters of the full keyword to +uniquely identify the command need be typed. +The output of a +command is normally sent to the standard output, but optionally the +output of individual commands may be sent to a file by appending a +\[oq]\&>\[cq], +followed by a file name, to the command line. +.sp \n(Ppu +.ne 2 + +A number of interactive format commands are executed entirely +within the +\f\*[B-Font]ntpdc\fP +utility itself and do not result in NTP +mode 7 requests being sent to a server. +These are described +following. +.TP 7 +.NOP \f\*[B-Font]\&?\f[] \f\*[I-Font]command_keyword\f[] +.TP 7 +.NOP \f\*[B-Font]help\f[] \f\*[I-Font]command_keyword\f[] +A +\[oq]\f\*[B-Font]\&?\f[]\[cq] +will print a list of all the command +keywords known to this incarnation of +\f\*[B-Font]ntpdc\fP. +A +\[oq]\f\*[B-Font]\&?\f[]\[cq] +followed by a command keyword will print function and usage +information about the command. +This command is probably a better +source of information about +\fCntpq\fR(@NTPQ_MS@)\f[] +than this manual +page. +.TP 7 +.NOP \f\*[B-Font]delay\f[] \f\*[I-Font]milliseconds\f[] +Specify a time interval to be added to timestamps included in +requests which require authentication. +This is used to enable +(unreliable) server reconfiguration over long delay network paths +or between machines whose clocks are unsynchronized. +Actually the +server does not now require timestamps in authenticated requests, +so this command may be obsolete. +.TP 7 +.NOP \f\*[B-Font]host\f[] \f\*[I-Font]hostname\f[] +Set the host to which future queries will be sent. +Hostname may +be either a host name or a numeric address. +.TP 7 +.NOP \f\*[B-Font]hostnames\f[] [\f\*[B-Font]yes\f[] | \f\*[B-Font]no\f[]] +If +\f\*[B-Font]yes\f[] +is specified, host names are printed in +information displays. +If +\f\*[B-Font]no\f[] +is specified, numeric +addresses are printed instead. +The default is +\f\*[B-Font]yes\f[], +unless +modified using the command line +\f\*[B-Font]\-n\f[] +switch. +.TP 7 +.NOP \f\*[B-Font]keyid\f[] \f\*[I-Font]keyid\f[] +This command allows the specification of a key number to be +used to authenticate configuration requests. +This must correspond +to a key number the server has been configured to use for this +purpose. +.TP 7 +.NOP \f\*[B-Font]quit\f[] +Exit +\f\*[B-Font]ntpdc\fP. +.TP 7 +.NOP \f\*[B-Font]passwd\f[] +This command prompts you to type in a password (which will not +be echoed) which will be used to authenticate configuration +requests. +The password must correspond to the key configured for +use by the NTP server for this purpose if such requests are to be +successful. +.TP 7 +.NOP \f\*[B-Font]timeout\f[] \f\*[I-Font]milliseconds\f[] +Specify a timeout period for responses to server queries. +The +default is about 8000 milliseconds. +Note that since +\f\*[B-Font]ntpdc\fP +retries each query once after a timeout, the total waiting time for +a timeout will be twice the timeout value set. +.PP +.SS "Control Message Commands" +Query commands result in NTP mode 7 packets containing requests for +information being sent to the server. +These are read-only commands +in that they make no modification of the server configuration +state. +.TP 7 +.NOP \f\*[B-Font]listpeers\f[] +Obtains and prints a brief list of the peers for which the +server is maintaining state. +These should include all configured +peer associations as well as those peers whose stratum is such that +they are considered by the server to be possible future +synchronization candidates. +.TP 7 +.NOP \f\*[B-Font]peers\f[] +Obtains a list of peers for which the server is maintaining +state, along with a summary of that state. +Summary information +includes the address of the remote peer, the local interface +address (0.0.0.0 if a local address has yet to be determined), the +stratum of the remote peer (a stratum of 16 indicates the remote +peer is unsynchronized), the polling interval, in seconds, the +reachability register, in octal, and the current estimated delay, +offset and dispersion of the peer, all in seconds. +.sp \n(Ppu +.ne 2 + +The character in the left margin indicates the mode this peer +entry is operating in. +A +\[oq]\&+\[cq] +denotes symmetric active, a +\[oq]\&-\[cq] +indicates symmetric passive, a +\[oq]\&=\[cq] +means the +remote server is being polled in client mode, a +\[oq]\&^\[cq] +indicates that the server is broadcasting to this address, a +\[oq]\&~\[cq] +denotes that the remote peer is sending broadcasts and a +\[oq]\&~\[cq] +denotes that the remote peer is sending broadcasts and a +\[oq]\&*\[cq] +marks the peer the server is currently synchronizing +to. +.sp \n(Ppu +.ne 2 + +The contents of the host field may be one of four forms. +It may +be a host name, an IP address, a reference clock implementation +name with its parameter or +\fBREFCLK\fR()\f[] +On +\f\*[B-Font]hostnames\f[] +\f\*[B-Font]no\f[] +only IP-addresses +will be displayed. +.TP 7 +.NOP \f\*[B-Font]dmpeers\f[] +A slightly different peer summary list. +Identical to the output +of the +\f\*[B-Font]peers\f[] +command, except for the character in the +leftmost column. +Characters only appear beside peers which were +included in the final stage of the clock selection algorithm. +A +\[oq]\&.\[cq] +indicates that this peer was cast off in the falseticker +detection, while a +\[oq]\&+\[cq] +indicates that the peer made it +through. +A +\[oq]\&*\[cq] +denotes the peer the server is currently +synchronizing with. +.TP 7 +.NOP \f\*[B-Font]showpeer\f[] \f\*[I-Font]peer_address\f[] [\f\*[I-Font]...\f[]] +Shows a detailed display of the current peer variables for one +or more peers. +Most of these values are described in the NTP +Version 2 specification. +.TP 7 +.NOP \f\*[B-Font]pstats\f[] \f\*[I-Font]peer_address\f[] [\f\*[I-Font]...\f[]] +Show per-peer statistic counters associated with the specified +peer(s). +.TP 7 +.NOP \f\*[B-Font]clockstat\f[] \f\*[I-Font]clock_peer_address\f[] [\f\*[I-Font]...\f[]] +Obtain and print information concerning a peer clock. +The +values obtained provide information on the setting of fudge factors +and other clock performance information. +.TP 7 +.NOP \f\*[B-Font]kerninfo\f[] +Obtain and print kernel phase-lock loop operating parameters. +This information is available only if the kernel has been specially +modified for a precision timekeeping function. +.TP 7 +.NOP \f\*[B-Font]loopinfo\f[] [\f\*[B-Font]oneline\f[] | \f\*[B-Font]multiline\f[]] +Print the values of selected loop filter variables. +The loop +filter is the part of NTP which deals with adjusting the local +system clock. +The +\[oq]offset\[cq] +is the last offset given to the +loop filter by the packet processing code. +The +\[oq]frequency\[cq] +is the frequency error of the local clock in parts-per-million +(ppm). +The +\[oq]time_const\[cq] +controls the stiffness of the +phase-lock loop and thus the speed at which it can adapt to +oscillator drift. +The +\[oq]watchdog timer\[cq] +value is the number +of seconds which have elapsed since the last sample offset was +given to the loop filter. +The +\f\*[B-Font]oneline\f[] +and +\f\*[B-Font]multiline\f[] +options specify the format in which this +information is to be printed, with +\f\*[B-Font]multiline\f[] +as the +default. +.TP 7 +.NOP \f\*[B-Font]sysinfo\f[] +Print a variety of system state variables, i.e., state related +to the local server. +All except the last four lines are described +in the NTP Version 3 specification, RFC-1305. +.sp \n(Ppu +.ne 2 + +The +\[oq]system flags\[cq] +show various system flags, some of +which can be set and cleared by the +\f\*[B-Font]enable\f[] +and +\f\*[B-Font]disable\f[] +configuration commands, respectively. +These are +the +\f\*[B-Font]auth\f[], +\f\*[B-Font]bclient\f[], +\f\*[B-Font]monitor\f[], +\f\*[B-Font]pll\f[], +\f\*[B-Font]pps\f[] +and +\f\*[B-Font]stats\f[] +flags. +See the +\fCntpd\fR(@NTPD_MS@)\f[] +documentation for the meaning of these flags. +There +are two additional flags which are read only, the +\f\*[B-Font]kernel_pll\f[] +and +\f\*[B-Font]kernel_pps\f[]. +These flags indicate +the synchronization status when the precision time kernel +modifications are in use. +The +\[oq]kernel_pll\[cq] +indicates that +the local clock is being disciplined by the kernel, while the +\[oq]kernel_pps\[cq] +indicates the kernel discipline is provided by the PPS +signal. +.sp \n(Ppu +.ne 2 + +The +\[oq]stability\[cq] +is the residual frequency error remaining +after the system frequency correction is applied and is intended for +maintenance and debugging. +In most architectures, this value will +initially decrease from as high as 500 ppm to a nominal value in +the range .01 to 0.1 ppm. +If it remains high for some time after +starting the daemon, something may be wrong with the local clock, +or the value of the kernel variable +\fIkern.clockrate.tick\f[] +may be +incorrect. +.sp \n(Ppu +.ne 2 + +The +\[oq]broadcastdelay\[cq] +shows the default broadcast delay, +as set by the +\f\*[B-Font]broadcastdelay\f[] +configuration command. +.sp \n(Ppu +.ne 2 + +The +\[oq]authdelay\[cq] +shows the default authentication delay, +as set by the +\f\*[B-Font]authdelay\f[] +configuration command. +.TP 7 +.NOP \f\*[B-Font]sysstats\f[] +Print statistics counters maintained in the protocol +module. +.TP 7 +.NOP \f\*[B-Font]memstats\f[] +Print statistics counters related to memory allocation +code. +.TP 7 +.NOP \f\*[B-Font]iostats\f[] +Print statistics counters maintained in the input-output +module. +.TP 7 +.NOP \f\*[B-Font]timerstats\f[] +Print statistics counters maintained in the timer/event queue +support code. +.TP 7 +.NOP \f\*[B-Font]reslist\f[] +Obtain and print the server's restriction list. +This list is +(usually) printed in sorted order and may help to understand how +the restrictions are applied. +.TP 7 +.NOP \f\*[B-Font]monlist\f[] [\f\*[I-Font]version\f[]] +Obtain and print traffic counts collected and maintained by the +monitor facility. +The version number should not normally need to be +specified. +.TP 7 +.NOP \f\*[B-Font]clkbug\f[] \f\*[I-Font]clock_peer_address\f[] [\f\*[I-Font]...\f[]] +Obtain debugging information for a reference clock driver. +This +information is provided only by some clock drivers and is mostly +undecodable without a copy of the driver source in hand. +.PP +.SS "Runtime Configuration Requests" +All requests which cause state changes in the server are +authenticated by the server using a configured NTP key (the +facility can also be disabled by the server by not configuring a +key). +The key number and the corresponding key must also be made +known to +\f\*[B-Font]ntpdc\fP. +This can be done using the +\f\*[B-Font]keyid\f[] +and +\f\*[B-Font]passwd\f[] +commands, the latter of which will prompt at the terminal for a +password to use as the encryption key. +You will also be prompted +automatically for both the key number and password the first time a +command which would result in an authenticated request to the +server is given. +Authentication not only provides verification that +the requester has permission to make such changes, but also gives +an extra degree of protection again transmission errors. +.sp \n(Ppu +.ne 2 + +Authenticated requests always include a timestamp in the packet +data, which is included in the computation of the authentication +code. +This timestamp is compared by the server to its receive time +stamp. +If they differ by more than a small amount the request is +rejected. +This is done for two reasons. +First, it makes simple +replay attacks on the server, by someone who might be able to +overhear traffic on your LAN, much more difficult. +Second, it makes +it more difficult to request configuration changes to your server +from topologically remote hosts. +While the reconfiguration facility +will work well with a server on the local host, and may work +adequately between time-synchronized hosts on the same LAN, it will +work very poorly for more distant hosts. +As such, if reasonable +passwords are chosen, care is taken in the distribution and +protection of keys and appropriate source address restrictions are +applied, the run time reconfiguration facility should provide an +adequate level of security. +.sp \n(Ppu +.ne 2 + +The following commands all make authenticated requests. +.TP 7 +.NOP \f\*[B-Font]addpeer\f[] \f\*[I-Font]peer_address\f[] [\f\*[I-Font]keyid\f[]] [\f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] +Add a configured peer association at the given address and +operating in symmetric active mode. +Note that an existing +association with the same peer may be deleted when this command is +executed, or may simply be converted to conform to the new +configuration, as appropriate. +If the optional +\f\*[I-Font]keyid\f[] +is a +nonzero integer, all outgoing packets to the remote server will +have an authentication field attached encrypted with this key. +If +the value is 0 (or not given) no authentication will be done. +The +\f\*[I-Font]version\f[] +can be 1, 2 or 3 and defaults to 3. +The +\f\*[B-Font]prefer\f[] +keyword indicates a preferred peer (and thus will +be used primarily for clock synchronisation if possible). +The +preferred peer also determines the validity of the PPS signal \- if +the preferred peer is suitable for synchronisation so is the PPS +signal. +.TP 7 +.NOP \f\*[B-Font]addserver\f[] \f\*[I-Font]peer_address\f[] [\f\*[I-Font]keyid\f[]] [\f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] +Identical to the addpeer command, except that the operating +mode is client. +.TP 7 +.NOP \f\*[B-Font]broadcast\f[] \f\*[I-Font]peer_address\f[] [\f\*[I-Font]keyid\f[]] [\f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] +Identical to the addpeer command, except that the operating +mode is broadcast. +In this case a valid key identifier and key are +required. +The +\f\*[I-Font]peer_address\f[] +parameter can be the broadcast +address of the local network or a multicast group address assigned +to NTP. +If a multicast address, a multicast-capable kernel is +required. +.TP 7 +.NOP \f\*[B-Font]unconfig\f[] \f\*[I-Font]peer_address\f[] [\f\*[I-Font]...\f[]] +This command causes the configured bit to be removed from the +specified peer(s). +In many cases this will cause the peer +association to be deleted. +When appropriate, however, the +association may persist in an unconfigured mode if the remote peer +is willing to continue on in this fashion. +.TP 7 +.NOP \f\*[B-Font]fudge\f[] \f\*[I-Font]peer_address\f[] [\f\*[B-Font]time1\f[]] [\f\*[B-Font]time2\f[]] [\f\*[I-Font]stratum\f[]] [\f\*[I-Font]refid\f[]] +This command provides a way to set certain data for a reference +clock. +See the source listing for further information. +.TP 7 +.NOP \f\*[B-Font]enable\f[] [\f\*[B-Font]auth\f[] | \f\*[B-Font]bclient\f[] | \f\*[B-Font]calibrate\f[] | \f\*[B-Font]kernel\f[] | \f\*[B-Font]monitor\f[] | \f\*[B-Font]ntp\f[] | \f\*[B-Font]pps\f[] | \f\*[B-Font]stats\f[]] +.TP 7 +.NOP \f\*[B-Font]disable\f[] [\f\*[B-Font]auth\f[] | \f\*[B-Font]bclient\f[] | \f\*[B-Font]calibrate\f[] | \f\*[B-Font]kernel\f[] | \f\*[B-Font]monitor\f[] | \f\*[B-Font]ntp\f[] | \f\*[B-Font]pps\f[] | \f\*[B-Font]stats\f[]] +These commands operate in the same way as the +\f\*[B-Font]enable\f[] +and +\f\*[B-Font]disable\f[] +configuration file commands of +\fCntpd\fR(@NTPD_MS@)\f[]. +.RS +.TP 7 +.NOP \f\*[B-Font]auth\f[] +Enables the server to synchronize with unconfigured peers only +if the peer has been correctly authenticated using either public key +or private key cryptography. +The default for this flag is enable. +.TP 7 +.NOP \f\*[B-Font]bclient\f[] +Enables the server to listen for a message from a broadcast or +multicast server, as in the multicastclient command with +default address. +The default for this flag is disable. +.TP 7 +.NOP \f\*[B-Font]calibrate\f[] +Enables the calibrate feature for reference clocks. +The default for this flag is disable. +.TP 7 +.NOP \f\*[B-Font]kernel\f[] +Enables the kernel time discipline, if available. +The default for this flag is enable if support is available, otherwise disable. +.TP 7 +.NOP \f\*[B-Font]monitor\f[] +Enables the monitoring facility. +See the documentation here about the +\f\*[B-Font]monlist\f[] +command or further information. +The default for this flag is enable. +.TP 7 +.NOP \f\*[B-Font]ntp\f[] +Enables time and frequency discipline. +In effect, this switch opens and closes the feedback loop, +which is useful for testing. +The default for this flag is enable. +.TP 7 +.NOP \f\*[B-Font]pps\f[] +Enables the pulse-per-second (PPS) signal when frequency +and time is disciplined by the precision time kernel modifications. +See the +"A Kernel Model for Precision Timekeeping" +(available as part of the HTML documentation +provided in +\fI/usr/share/doc/ntp\f[]) +page for further information. +The default for this flag is disable. +.TP 7 +.NOP \f\*[B-Font]stats\f[] +Enables the statistics facility. +See the +\fIMonitoring\f[] \fIOptions\f[] +section of +\fCntp.conf\fR(5)\f[] +for further information. +The default for this flag is disable. +.RE +.TP 7 +.NOP \f\*[B-Font]restrict\f[] \f\*[I-Font]address\f[] \f\*[I-Font]mask\f[] \f\*[I-Font]flag\f[] [\f\*[I-Font]...\f[]] +This command operates in the same way as the +\f\*[B-Font]restrict\f[] +configuration file commands of +\fCntpd\fR(@NTPD_MS@)\f[]. +.TP 7 +.NOP \f\*[B-Font]unrestrict\f[] \f\*[I-Font]address\f[] \f\*[I-Font]mask\f[] \f\*[I-Font]flag\f[] [\f\*[I-Font]...\f[]] +Unrestrict the matching entry from the restrict list. +.TP 7 +.NOP \f\*[B-Font]delrestrict\f[] \f\*[I-Font]address\f[] \f\*[I-Font]mask\f[] [\f\*[B-Font]ntpport\f[]] +Delete the matching entry from the restrict list. +.TP 7 +.NOP \f\*[B-Font]readkeys\f[] +Causes the current set of authentication keys to be purged and +a new set to be obtained by rereading the keys file (which must +have been specified in the +\fCntpd\fR(@NTPD_MS@)\f[] +configuration file). +This +allows encryption keys to be changed without restarting the +server. +.TP 7 +.NOP \f\*[B-Font]trustedkey\f[] \f\*[I-Font]keyid\f[] [\f\*[I-Font]...\f[]] +.TP 7 +.NOP \f\*[B-Font]untrustedkey\f[] \f\*[I-Font]keyid\f[] [\f\*[I-Font]...\f[]] +These commands operate in the same way as the +\f\*[B-Font]trustedkey\f[] +and +\f\*[B-Font]untrustedkey\f[] +configuration file +commands of +\fCntpd\fR(@NTPD_MS@)\f[]. +.TP 7 +.NOP \f\*[B-Font]authinfo\f[] +Returns information concerning the authentication module, +including known keys and counts of encryptions and decryptions +which have been done. +.TP 7 +.NOP \f\*[B-Font]traps\f[] +Display the traps set in the server. +See the source listing for +further information. +.TP 7 +.NOP \f\*[B-Font]addtrap\f[] \f\*[I-Font]address\f[] [\f\*[I-Font]port\f[]] [\f\*[I-Font]interface\f[]] +Set a trap for asynchronous messages. +See the source listing +for further information. +.TP 7 +.NOP \f\*[B-Font]clrtrap\f[] \f\*[I-Font]address\f[] [\f\*[I-Font]port\f[]] [\f\*[I-Font]interface\f[]] +Clear a trap for asynchronous messages. +See the source listing +for further information. +.TP 7 +.NOP \f\*[B-Font]reset\f[] +Clear the statistics counters in various modules of the server. +See the source listing for further information. +.PP +.SH "ENVIRONMENT" +See \fBOPTION PRESETS\fP for configuration environment variables. +.SH "FILES" +See \fBOPTION PRESETS\fP for configuration files. +.SH "EXIT STATUS" +One of the following exit values will be returned: +.TP +.NOP 0 " (EXIT_SUCCESS)" +Successful program execution. +.TP +.NOP 1 " (EXIT_FAILURE)" +The operation failed or the command syntax was not valid. +.TP +.NOP 66 " (EX_NOINPUT)" +A specified configuration file could not be loaded. +.TP +.NOP 70 " (EX_SOFTWARE)" +libopts had an internal operational error. Please report +it to autogen-users@lists.sourceforge.net. Thank you. +.PP +.SH "SEE ALSO" +\fCntp.conf\fR(5)\f[], +\fCntpd\fR(@NTPD_MS@)\f[] +David L. Mills, +\fINetwork Time Protocol (Version 3)\fR, +RFC1305 +.PP + +.SH AUTHORS +The formatting directives in this document came from FreeBSD. +.SH "COPYRIGHT" +Copyright (C) 1970-2014 The University of Delaware all rights reserved. +This program is released under the terms of the NTP license, <http://ntp.org/license>. +.SH BUGS +The +\f\*[B-Font]ntpdc\fP +utility is a crude hack. +Much of the information it shows is +deadly boring and could only be loved by its implementer. +The +program was designed so that new (and temporary) features were easy +to hack in, at great expense to the program's ease of use. +Despite +this, the program is occasionally useful. +.sp \n(Ppu +.ne 2 + +Please report bugs to http://bugs.ntp.org . +.sp \n(Ppu +.ne 2 + +Please send bug reports to: http://bugs.ntp.org, bugs@ntp.org +.SH "NOTES" +This manual page was \fIAutoGen\fP-erated from the \fBntpdc\fP +option definitions. diff --git a/ntpdc/ntpdc.mdoc.in b/ntpdc/ntpdc.mdoc.in new file mode 100644 index 0000000..95b2a23 --- /dev/null +++ b/ntpdc/ntpdc.mdoc.in @@ -0,0 +1,809 @@ +.Dd December 2 2014 +.Dt NTPDC @NTPDC_MS@ User Commands +.Os +.\" EDIT THIS FILE WITH CAUTION (ntpdc-opts.mdoc) +.\" +.\" It has been AutoGen-ed December 2, 2014 at 08:57:34 AM by AutoGen 5.18.5pre4 +.\" From the definitions ntpdc-opts.def +.\" and the template file agmdoc-cmd.tpl +.Sh NAME +.Nm ntpdc +.Nd vendor-specific NTPD control program +.Sh SYNOPSIS +.Nm +.\" Mixture of short (flag) options and long options +.Op Fl flags +.Op Fl flag Op Ar value +.Op Fl \-option\-name Ns Oo Oo Ns "=| " Oc Ns Ar value Oc +[ host ...] +.Pp +.Sh DESCRIPTION +.Nm +is deprecated. +Please use +.Xr ntpq @NTPQ_MS@ instead \- it can do everything +.Nm +used to do, and it does so using a much more sane interface. +.Pp +.Nm +is a utility program used to query +.Xr ntpd @NTPD_MS@ +about its +current state and to request changes in that state. +It uses NTP mode 7 control message formats described in the source code. +The program may +be run either in interactive mode or controlled using command line +arguments. +Extensive state and statistics information is available +through the +.Nm +interface. +In addition, nearly all the +configuration options which can be specified at startup using +ntpd's configuration file may also be specified at run time using +.Nm . +.Sh "OPTIONS" +.Bl -tag +.It Fl 4 , Fl \-ipv4 +Force IPv4 DNS name resolution. +This option must not appear in combination with any of the following options: +ipv6. +.sp +Force DNS resolution of following host names on the command line +to the IPv4 namespace. +.It Fl 6 , Fl \-ipv6 +Force IPv6 DNS name resolution. +This option must not appear in combination with any of the following options: +ipv4. +.sp +Force DNS resolution of following host names on the command line +to the IPv6 namespace. +.It Fl c Ar cmd , Fl \-command Ns = Ns Ar cmd +run a command and exit. +This option may appear an unlimited number of times. +.sp +The following argument is interpreted as an interactive format command +and is added to the list of commands to be executed on the specified +host(s). +.It Fl d , Fl \-debug\-level +Increase debug verbosity level. +This option may appear an unlimited number of times. +.sp +.It Fl D Ar number , Fl \-set\-debug\-level Ns = Ns Ar number +Set the debug verbosity level. +This option may appear an unlimited number of times. +This option takes an integer number as its argument. +.sp +.It Fl i , Fl \-interactive +Force ntpq to operate in interactive mode. +This option must not appear in combination with any of the following options: +command, listpeers, peers, showpeers. +.sp +Force ntpq to operate in interactive mode. Prompts will be written +to the standard output and commands read from the standard input. +.It Fl l , Fl \-listpeers +Print a list of the peers. +This option must not appear in combination with any of the following options: +command. +.sp +Print a list of the peers known to the server as well as a summary of +their state. This is equivalent to the 'listpeers' interactive command. +.It Fl n , Fl \-numeric +numeric host addresses. +.sp +Output all host addresses in dotted\-quad numeric format rather than +converting to the canonical host names. +.It Fl p , Fl \-peers +Print a list of the peers. +This option must not appear in combination with any of the following options: +command. +.sp +Print a list of the peers known to the server as well as a summary +of their state. This is equivalent to the 'peers' interactive command. +.It Fl s , Fl \-showpeers +Show a list of the peers. +This option must not appear in combination with any of the following options: +command. +.sp +Print a list of the peers known to the server as well as a summary +of their state. This is equivalent to the 'dmpeers' interactive command. +.It Fl \&? , Fl \-help +Display usage information and exit. +.It Fl \&! , Fl \-more\-help +Pass the extended usage information through a pager. +.It Fl > Oo Ar cfgfile Oc , Fl \-save\-opts Oo Ns = Ns Ar cfgfile Oc +Save the option state to \fIcfgfile\fP. The default is the \fIlast\fP +configuration file listed in the \fBOPTION PRESETS\fP section, below. +The command will exit after updating the config file. +.It Fl < Ar cfgfile , Fl \-load\-opts Ns = Ns Ar cfgfile , Fl \-no\-load\-opts +Load options from \fIcfgfile\fP. +The \fIno\-load\-opts\fP form will disable the loading +of earlier config/rc/ini files. \fI\-\-no\-load\-opts\fP is handled early, +out of order. +.It Fl \-version Op Brq Ar v|c|n +Output version of program and exit. The default mode is `v', a simple +version. The `c' mode will print copyright information and `n' will +print the full copyright notice. +.El +.Sh "OPTION PRESETS" +Any option that is not marked as \fInot presettable\fP may be preset +by loading values from configuration ("RC" or ".INI") file(s) and values from +environment variables named: +.nf + \fBNTPDC_<option\-name>\fP or \fBNTPDC\fP +.fi +.ad +The environmental presets take precedence (are processed later than) +the configuration files. +The \fIhomerc\fP files are "\fI$HOME\fP", and "\fI.\fP". +If any of these are directories, then the file \fI.ntprc\fP +is searched for within those directories. +.Sh USAGE +If one or more request options are included on the command line +when +.Nm +is executed, each of the requests will be sent +to the NTP servers running on each of the hosts given as command +line arguments, or on localhost by default. +If no request options +are given, +.Nm +will attempt to read commands from the +standard input and execute these on the NTP server running on the +first host given on the command line, again defaulting to localhost +when no other host is specified. +The +.Nm +utility will prompt for +commands if the standard input is a terminal device. +.Pp +The +.Nm +utility uses NTP mode 7 packets to communicate with the +NTP server, and hence can be used to query any compatible server on +the network which permits it. +Note that since NTP is a UDP protocol +this communication will be somewhat unreliable, especially over +large distances in terms of network topology. +The +.Nm +utility makes +no attempt to retransmit requests, and will time requests out if +the remote host is not heard from within a suitable timeout +time. +.Pp +The operation of +.Nm +are specific to the particular +implementation of the +.Xr ntpd @NTPD_MS@ +daemon and can be expected to +work only with this and maybe some previous versions of the daemon. +Requests from a remote +.Nm +utility which affect the +state of the local server must be authenticated, which requires +both the remote program and local server share a common key and key +identifier. +.Pp +Note that in contexts where a host name is expected, a +.Fl 4 +qualifier preceding the host name forces DNS resolution to the IPv4 namespace, +while a +.Fl 6 +qualifier forces DNS resolution to the IPv6 namespace. +Specifying a command line option other than +.Fl i +or +.Fl n +will cause the specified query (queries) to be sent to +the indicated host(s) immediately. +Otherwise, +.Nm +will +attempt to read interactive format commands from the standard +input. +.Ss "Interactive Commands" +Interactive format commands consist of a keyword followed by zero +to four arguments. +Only enough characters of the full keyword to +uniquely identify the command need be typed. +The output of a +command is normally sent to the standard output, but optionally the +output of individual commands may be sent to a file by appending a +.Ql \&> , +followed by a file name, to the command line. +.Pp +A number of interactive format commands are executed entirely +within the +.Nm +utility itself and do not result in NTP +mode 7 requests being sent to a server. +These are described +following. +.Bl -tag -width indent +.It Ic \&? Ar command_keyword +.It Ic help Ar command_keyword +A +.Sq Ic \&? +will print a list of all the command +keywords known to this incarnation of +.Nm . +A +.Sq Ic \&? +followed by a command keyword will print function and usage +information about the command. +This command is probably a better +source of information about +.Xr ntpq @NTPQ_MS@ +than this manual +page. +.It Ic delay Ar milliseconds +Specify a time interval to be added to timestamps included in +requests which require authentication. +This is used to enable +(unreliable) server reconfiguration over long delay network paths +or between machines whose clocks are unsynchronized. +Actually the +server does not now require timestamps in authenticated requests, +so this command may be obsolete. +.It Ic host Ar hostname +Set the host to which future queries will be sent. +Hostname may +be either a host name or a numeric address. +.It Ic hostnames Op Cm yes | Cm no +If +.Cm yes +is specified, host names are printed in +information displays. +If +.Cm no +is specified, numeric +addresses are printed instead. +The default is +.Cm yes , +unless +modified using the command line +.Fl n +switch. +.It Ic keyid Ar keyid +This command allows the specification of a key number to be +used to authenticate configuration requests. +This must correspond +to a key number the server has been configured to use for this +purpose. +.It Ic quit +Exit +.Nm . +.It Ic passwd +This command prompts you to type in a password (which will not +be echoed) which will be used to authenticate configuration +requests. +The password must correspond to the key configured for +use by the NTP server for this purpose if such requests are to be +successful. +.It Ic timeout Ar milliseconds +Specify a timeout period for responses to server queries. +The +default is about 8000 milliseconds. +Note that since +.Nm +retries each query once after a timeout, the total waiting time for +a timeout will be twice the timeout value set. +.El +.Ss "Control Message Commands" +Query commands result in NTP mode 7 packets containing requests for +information being sent to the server. +These are read\-only commands +in that they make no modification of the server configuration +state. +.Bl -tag -width indent +.It Ic listpeers +Obtains and prints a brief list of the peers for which the +server is maintaining state. +These should include all configured +peer associations as well as those peers whose stratum is such that +they are considered by the server to be possible future +synchronization candidates. +.It Ic peers +Obtains a list of peers for which the server is maintaining +state, along with a summary of that state. +Summary information +includes the address of the remote peer, the local interface +address (0.0.0.0 if a local address has yet to be determined), the +stratum of the remote peer (a stratum of 16 indicates the remote +peer is unsynchronized), the polling interval, in seconds, the +reachability register, in octal, and the current estimated delay, +offset and dispersion of the peer, all in seconds. +.Pp +The character in the left margin indicates the mode this peer +entry is operating in. +A +.Ql \&+ +denotes symmetric active, a +.Ql \&\- +indicates symmetric passive, a +.Ql \&= +means the +remote server is being polled in client mode, a +.Ql \&^ +indicates that the server is broadcasting to this address, a +.Ql \&~ +denotes that the remote peer is sending broadcasts and a +.Ql \&~ +denotes that the remote peer is sending broadcasts and a +.Ql \&* +marks the peer the server is currently synchronizing +to. +.Pp +The contents of the host field may be one of four forms. +It may +be a host name, an IP address, a reference clock implementation +name with its parameter or +.Fn REFCLK "implementation_number" "parameter" . +On +.Ic hostnames +.Cm no +only IP\-addresses +will be displayed. +.It Ic dmpeers +A slightly different peer summary list. +Identical to the output +of the +.Ic peers +command, except for the character in the +leftmost column. +Characters only appear beside peers which were +included in the final stage of the clock selection algorithm. +A +.Ql \&. +indicates that this peer was cast off in the falseticker +detection, while a +.Ql \&+ +indicates that the peer made it +through. +A +.Ql \&* +denotes the peer the server is currently +synchronizing with. +.It Ic showpeer Ar peer_address Oo Ar ... Oc +Shows a detailed display of the current peer variables for one +or more peers. +Most of these values are described in the NTP +Version 2 specification. +.It Ic pstats Ar peer_address Oo Ar ... Oc +Show per\-peer statistic counters associated with the specified +peer(s). +.It Ic clockstat Ar clock_peer_address Oo Ar ... Oc +Obtain and print information concerning a peer clock. +The +values obtained provide information on the setting of fudge factors +and other clock performance information. +.It Ic kerninfo +Obtain and print kernel phase\-lock loop operating parameters. +This information is available only if the kernel has been specially +modified for a precision timekeeping function. +.It Ic loopinfo Op Cm oneline | Cm multiline +Print the values of selected loop filter variables. +The loop +filter is the part of NTP which deals with adjusting the local +system clock. +The +.Sq offset +is the last offset given to the +loop filter by the packet processing code. +The +.Sq frequency +is the frequency error of the local clock in parts\-per\-million +(ppm). +The +.Sq time_const +controls the stiffness of the +phase\-lock loop and thus the speed at which it can adapt to +oscillator drift. +The +.Sq watchdog timer +value is the number +of seconds which have elapsed since the last sample offset was +given to the loop filter. +The +.Cm oneline +and +.Cm multiline +options specify the format in which this +information is to be printed, with +.Cm multiline +as the +default. +.It Ic sysinfo +Print a variety of system state variables, i.e., state related +to the local server. +All except the last four lines are described +in the NTP Version 3 specification, RFC\-1305. +.Pp +The +.Sq system flags +show various system flags, some of +which can be set and cleared by the +.Ic enable +and +.Ic disable +configuration commands, respectively. +These are +the +.Cm auth , +.Cm bclient , +.Cm monitor , +.Cm pll , +.Cm pps +and +.Cm stats +flags. +See the +.Xr ntpd @NTPD_MS@ +documentation for the meaning of these flags. +There +are two additional flags which are read only, the +.Cm kernel_pll +and +.Cm kernel_pps . +These flags indicate +the synchronization status when the precision time kernel +modifications are in use. +The +.Sq kernel_pll +indicates that +the local clock is being disciplined by the kernel, while the +.Sq kernel_pps +indicates the kernel discipline is provided by the PPS +signal. +.Pp +The +.Sq stability +is the residual frequency error remaining +after the system frequency correction is applied and is intended for +maintenance and debugging. +In most architectures, this value will +initially decrease from as high as 500 ppm to a nominal value in +the range .01 to 0.1 ppm. +If it remains high for some time after +starting the daemon, something may be wrong with the local clock, +or the value of the kernel variable +.Va kern.clockrate.tick +may be +incorrect. +.Pp +The +.Sq broadcastdelay +shows the default broadcast delay, +as set by the +.Ic broadcastdelay +configuration command. +.Pp +The +.Sq authdelay +shows the default authentication delay, +as set by the +.Ic authdelay +configuration command. +.It Ic sysstats +Print statistics counters maintained in the protocol +module. +.It Ic memstats +Print statistics counters related to memory allocation +code. +.It Ic iostats +Print statistics counters maintained in the input\-output +module. +.It Ic timerstats +Print statistics counters maintained in the timer/event queue +support code. +.It Ic reslist +Obtain and print the server's restriction list. +This list is +(usually) printed in sorted order and may help to understand how +the restrictions are applied. +.It Ic monlist Op Ar version +Obtain and print traffic counts collected and maintained by the +monitor facility. +The version number should not normally need to be +specified. +.It Ic clkbug Ar clock_peer_address Oo Ar ... Oc +Obtain debugging information for a reference clock driver. +This +information is provided only by some clock drivers and is mostly +undecodable without a copy of the driver source in hand. +.El +.Ss "Runtime Configuration Requests" +All requests which cause state changes in the server are +authenticated by the server using a configured NTP key (the +facility can also be disabled by the server by not configuring a +key). +The key number and the corresponding key must also be made +known to +.Nm . +This can be done using the +.Ic keyid +and +.Ic passwd +commands, the latter of which will prompt at the terminal for a +password to use as the encryption key. +You will also be prompted +automatically for both the key number and password the first time a +command which would result in an authenticated request to the +server is given. +Authentication not only provides verification that +the requester has permission to make such changes, but also gives +an extra degree of protection again transmission errors. +.Pp +Authenticated requests always include a timestamp in the packet +data, which is included in the computation of the authentication +code. +This timestamp is compared by the server to its receive time +stamp. +If they differ by more than a small amount the request is +rejected. +This is done for two reasons. +First, it makes simple +replay attacks on the server, by someone who might be able to +overhear traffic on your LAN, much more difficult. +Second, it makes +it more difficult to request configuration changes to your server +from topologically remote hosts. +While the reconfiguration facility +will work well with a server on the local host, and may work +adequately between time\-synchronized hosts on the same LAN, it will +work very poorly for more distant hosts. +As such, if reasonable +passwords are chosen, care is taken in the distribution and +protection of keys and appropriate source address restrictions are +applied, the run time reconfiguration facility should provide an +adequate level of security. +.Pp +The following commands all make authenticated requests. +.Bl -tag -width indent +.It Xo Ic addpeer Ar peer_address +.Op Ar keyid +.Op Ar version +.Op Cm prefer +.Xc +Add a configured peer association at the given address and +operating in symmetric active mode. +Note that an existing +association with the same peer may be deleted when this command is +executed, or may simply be converted to conform to the new +configuration, as appropriate. +If the optional +.Ar keyid +is a +nonzero integer, all outgoing packets to the remote server will +have an authentication field attached encrypted with this key. +If +the value is 0 (or not given) no authentication will be done. +The +.Ar version +can be 1, 2 or 3 and defaults to 3. +The +.Cm prefer +keyword indicates a preferred peer (and thus will +be used primarily for clock synchronisation if possible). +The +preferred peer also determines the validity of the PPS signal \- if +the preferred peer is suitable for synchronisation so is the PPS +signal. +.It Xo Ic addserver Ar peer_address +.Op Ar keyid +.Op Ar version +.Op Cm prefer +.Xc +Identical to the addpeer command, except that the operating +mode is client. +.It Xo Ic broadcast Ar peer_address +.Op Ar keyid +.Op Ar version +.Op Cm prefer +.Xc +Identical to the addpeer command, except that the operating +mode is broadcast. +In this case a valid key identifier and key are +required. +The +.Ar peer_address +parameter can be the broadcast +address of the local network or a multicast group address assigned +to NTP. +If a multicast address, a multicast\-capable kernel is +required. +.It Ic unconfig Ar peer_address Oo Ar ... Oc +This command causes the configured bit to be removed from the +specified peer(s). +In many cases this will cause the peer +association to be deleted. +When appropriate, however, the +association may persist in an unconfigured mode if the remote peer +is willing to continue on in this fashion. +.It Xo Ic fudge Ar peer_address +.Op Cm time1 +.Op Cm time2 +.Op Ar stratum +.Op Ar refid +.Xc +This command provides a way to set certain data for a reference +clock. +See the source listing for further information. +.It Xo Ic enable +.Oo +.Cm auth | Cm bclient | +.Cm calibrate | Cm kernel | +.Cm monitor | Cm ntp | +.Cm pps | Cm stats +.Oc +.Xc +.It Xo Ic disable +.Oo +.Cm auth | Cm bclient | +.Cm calibrate | Cm kernel | +.Cm monitor | Cm ntp | +.Cm pps | Cm stats +.Oc +.Xc +These commands operate in the same way as the +.Ic enable +and +.Ic disable +configuration file commands of +.Xr ntpd @NTPD_MS@ . +.Bl -tag -width indent +.It Cm auth +Enables the server to synchronize with unconfigured peers only +if the peer has been correctly authenticated using either public key +or private key cryptography. +The default for this flag is enable. +.It Cm bclient +Enables the server to listen for a message from a broadcast or +multicast server, as in the multicastclient command with +default address. +The default for this flag is disable. +.It Cm calibrate +Enables the calibrate feature for reference clocks. +The default for this flag is disable. +.It Cm kernel +Enables the kernel time discipline, if available. +The default for this flag is enable if support is available, otherwise disable. +.It Cm monitor +Enables the monitoring facility. +See the documentation here about the +.Cm monlist +command or further information. +The default for this flag is enable. +.It Cm ntp +Enables time and frequency discipline. +In effect, this switch opens and closes the feedback loop, +which is useful for testing. +The default for this flag is enable. +.It Cm pps +Enables the pulse\-per\-second (PPS) signal when frequency +and time is disciplined by the precision time kernel modifications. +See the +.Qq A Kernel Model for Precision Timekeeping +(available as part of the HTML documentation +provided in +.Pa /usr/share/doc/ntp ) +page for further information. +The default for this flag is disable. +.It Cm stats +Enables the statistics facility. +See the +.Sx Monitoring Options +section of +.Xr ntp.conf 5 +for further information. +The default for this flag is disable. +.El +.It Xo Ic restrict Ar address Ar mask +.Ar flag Oo Ar ... Oc +.Xc +This command operates in the same way as the +.Ic restrict +configuration file commands of +.Xr ntpd @NTPD_MS@ . +.It Xo Ic unrestrict Ar address Ar mask +.Ar flag Oo Ar ... Oc +.Xc +Unrestrict the matching entry from the restrict list. +.It Xo Ic delrestrict Ar address Ar mask +.Op Cm ntpport +.Xc +Delete the matching entry from the restrict list. +.It Ic readkeys +Causes the current set of authentication keys to be purged and +a new set to be obtained by rereading the keys file (which must +have been specified in the +.Xr ntpd @NTPD_MS@ +configuration file). +This +allows encryption keys to be changed without restarting the +server. +.It Ic trustedkey Ar keyid Oo Ar ... Oc +.It Ic untrustedkey Ar keyid Oo Ar ... Oc +These commands operate in the same way as the +.Ic trustedkey +and +.Ic untrustedkey +configuration file +commands of +.Xr ntpd @NTPD_MS@ . +.It Ic authinfo +Returns information concerning the authentication module, +including known keys and counts of encryptions and decryptions +which have been done. +.It Ic traps +Display the traps set in the server. +See the source listing for +further information. +.It Xo Ic addtrap Ar address +.Op Ar port +.Op Ar interface +.Xc +Set a trap for asynchronous messages. +See the source listing +for further information. +.It Xo Ic clrtrap Ar address +.Op Ar port +.Op Ar interface +.Xc +Clear a trap for asynchronous messages. +See the source listing +for further information. +.It Ic reset +Clear the statistics counters in various modules of the server. +See the source listing for further information. +.El +.Sh "ENVIRONMENT" +See \fBOPTION PRESETS\fP for configuration environment variables. +.Sh "FILES" +See \fBOPTION PRESETS\fP for configuration files. +.Sh "EXIT STATUS" +One of the following exit values will be returned: +.Bl -tag +.It 0 " (EXIT_SUCCESS)" +Successful program execution. +.It 1 " (EXIT_FAILURE)" +The operation failed or the command syntax was not valid. +.It 66 " (EX_NOINPUT)" +A specified configuration file could not be loaded. +.It 70 " (EX_SOFTWARE)" +libopts had an internal operational error. Please report +it to autogen\-users@lists.sourceforge.net. Thank you. +.El +.Sh "SEE ALSO" +.Xr ntp.conf 5 , +.Xr ntpd @NTPD_MS@ +.Rs +.%A David L. Mills +.%T Network Time Protocol (Version 3) +.%O RFC1305 +.Re +.Sh AUTHORS +The formatting directives in this document came from FreeBSD. +.Sh "COPYRIGHT" +Copyright (C) 1970\-2014 The University of Delaware all rights reserved. +This program is released under the terms of the NTP license, <http://ntp.org/license>. +.Sh BUGS +The +.Nm +utility is a crude hack. +Much of the information it shows is +deadly boring and could only be loved by its implementer. +The +program was designed so that new (and temporary) features were easy +to hack in, at great expense to the program's ease of use. +Despite +this, the program is occasionally useful. +.Pp +Please report bugs to http://bugs.ntp.org . +.Pp +Please send bug reports to: http://bugs.ntp.org, bugs@ntp.org +.Sh "NOTES" +This manual page was \fIAutoGen\fP\-erated from the \fBntpdc\fP +option definitions. diff --git a/ntpdc/ntpdc.texi b/ntpdc/ntpdc.texi new file mode 100644 index 0000000..3a82806 --- /dev/null +++ b/ntpdc/ntpdc.texi @@ -0,0 +1,88 @@ +\input texinfo @c -*-texinfo-*- +@c %**start of header +@setfilename ntpdc.info +@settitle ntpdc: NTPD Control User's Manual +@include ../sntp/include/version.texi +@paragraphindent 2 +@c %**end of header + +@ifinfo +This file documents the use of the NTP Project's ntpdc, a program for +controlling ntpd. +@end ifinfo + +@direntry +* ntpdc: (ntpdc). ntpd Control program +@end direntry + +@titlepage +@title ntpdc: NTPD Control User's Manual +@subtitle ntpdc, version @value{VERSION}, @value{UPDATED} +@c @author Max @email{foo@ntp.org} +@end titlepage + +@c @page +@c @vskip 0pt plus 1filll + +@node Top, ntpdc Description, (dir), (dir) +@top ntpdc: NTPD Control User Manual + +This document describes the use of the NTP Project's @code{ntpdc} program, +that can be used to query a Network Time Protocol (NTP) server and +display the time offset of the system clock relative to the server +clock. Run as root, it can correct the system clock to this offset as +well. It can be run as an interactive command or from a cron job. + +This document applies to version @value{VERSION} of @code{ntpdc}. + +The program implements the SNTP protocol as defined by RFC 5905, the NTPv4 +IETF specification. + +@shortcontents + +@menu +* ntpdc Description:: Description +* ntpdc Invocation:: Invoking ntpdc +* Usage:: Usage +@end menu + +@node ntpdc Description +@comment node-name, next, previous, up +@section Description + +By default, @code{ntpdc} writes the local data and time (i.e., not UTC) to the +standard output in the format: + +@example +1996-10-15 20:17:25.123 (+0800) +4.567 +/- 0.089 secs +@end example + +where +YYYY-MM-DD HH:MM:SS.SUBSEC is the local date and time, +(+0800) is the local timezone adjustment (so we would add 8 hours and 0 minutes to convert the reported local time to UTC), +and +the +4.567 +/- 0.089 secs indicates the time offset and +error bound of the system clock relative to the server clock. + +@include invoke-ntpdc.texi + +@node Usage +@comment node-name, next, previous, up +@section Usage + +The simplest use of this program is as an unprivileged command to +check the current time, offset, and error in the local clock. +For example: + +@example +ntpdc ntpserver.somewhere +@end example + +With suitable privilege, it can be run as a command or in a +@code{cron} job to reset the local clock from a reliable server, like +the @code{ntpdate} and @code{rdate} commands. +For example: + +@example +ntpdc -a ntpserver.somewhere +@end example diff --git a/ntpdc/ntpdc_ops.c b/ntpdc/ntpdc_ops.c new file mode 100644 index 0000000..b0e7af0 --- /dev/null +++ b/ntpdc/ntpdc_ops.c @@ -0,0 +1,3142 @@ +/* + * ntpdc_ops.c - subroutines which are called to perform operations by + * ntpdc + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> +#include <stddef.h> + +#include "ntpdc.h" +#include "ntp_net.h" +#include "ntp_control.h" +#include "ntp_refclock.h" +#include "ntp_stdlib.h" + +#include <ctype.h> +#ifdef HAVE_SYS_TIMEX_H +# include <sys/timex.h> +#endif +#if !defined(__bsdi__) && !defined(apollo) +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif +#endif + +#include <arpa/inet.h> + +/* + * utility functions + */ +static int checkitems (int, FILE *); +static int checkitemsize (int, int); +static int check1item (int, FILE *); + +/* + * Declarations for command handlers in here + */ +static void peerlist (struct parse *, FILE *); +static void peers (struct parse *, FILE *); +static void doconfig (struct parse *pcmd, FILE *fp, int mode, int refc); +static void dmpeers (struct parse *, FILE *); +static void dopeers (struct parse *, FILE *, int); +static void printpeer (struct info_peer *, FILE *); +static void showpeer (struct parse *, FILE *); +static void peerstats (struct parse *, FILE *); +static void loopinfo (struct parse *, FILE *); +static void sysinfo (struct parse *, FILE *); +static void sysstats (struct parse *, FILE *); +static void iostats (struct parse *, FILE *); +static void memstats (struct parse *, FILE *); +static void timerstats (struct parse *, FILE *); +static void addpeer (struct parse *, FILE *); +static void addserver (struct parse *, FILE *); +static void addrefclock (struct parse *, FILE *); +static void broadcast (struct parse *, FILE *); +static void doconfig (struct parse *, FILE *, int, int); +static void unconfig (struct parse *, FILE *); +static void set (struct parse *, FILE *); +static void sys_clear (struct parse *, FILE *); +static void doset (struct parse *, FILE *, int); +static void reslist (struct parse *, FILE *); +static void new_restrict (struct parse *, FILE *); +static void unrestrict (struct parse *, FILE *); +static void delrestrict (struct parse *, FILE *); +static void do_restrict (struct parse *, FILE *, int); +static void monlist (struct parse *, FILE *); +static void reset (struct parse *, FILE *); +static void preset (struct parse *, FILE *); +static void readkeys (struct parse *, FILE *); +static void trustkey (struct parse *, FILE *); +static void untrustkey (struct parse *, FILE *); +static void do_trustkey (struct parse *, FILE *, int); +static void authinfo (struct parse *, FILE *); +static void traps (struct parse *, FILE *); +static void addtrap (struct parse *, FILE *); +static void clrtrap (struct parse *, FILE *); +static void do_addclr_trap (struct parse *, FILE *, int); +static void requestkey (struct parse *, FILE *); +static void controlkey (struct parse *, FILE *); +static void do_changekey (struct parse *, FILE *, int); +static void ctlstats (struct parse *, FILE *); +static void clockstat (struct parse *, FILE *); +static void fudge (struct parse *, FILE *); +static void clkbug (struct parse *, FILE *); +static void kerninfo (struct parse *, FILE *); +static void get_if_stats (struct parse *, FILE *); +static void do_if_reload (struct parse *, FILE *); + +/* + * Commands we understand. Ntpdc imports this. + */ +struct xcmd opcmds[] = { + { "listpeers", peerlist, { OPT|IP_VERSION, NO, NO, NO }, + { "-4|-6", "", "", "" }, + "display list of peers the server knows about [IP Version]" }, + { "peers", peers, { OPT|IP_VERSION, NO, NO, NO }, + { "-4|-6", "", "", "" }, + "display peer summary information [IP Version]" }, + { "dmpeers", dmpeers, { OPT|IP_VERSION, NO, NO, NO }, + { "-4|-6", "", "", "" }, + "display peer summary info the way Dave Mills likes it (IP Version)" }, + { "showpeer", showpeer, { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD}, + { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, + "display detailed information for one or more peers" }, + { "pstats", peerstats, { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD }, + { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, + "display statistical information for one or more peers" }, + { "loopinfo", loopinfo, { OPT|NTP_STR, NO, NO, NO }, + { "oneline|multiline", "", "", "" }, + "display loop filter information" }, + { "sysinfo", sysinfo, { NO, NO, NO, NO }, + { "", "", "", "" }, + "display local server information" }, + { "sysstats", sysstats, { NO, NO, NO, NO }, + { "", "", "", "" }, + "display local server statistics" }, + { "memstats", memstats, { NO, NO, NO, NO }, + { "", "", "", "" }, + "display peer memory usage statistics" }, + { "iostats", iostats, { NO, NO, NO, NO }, + { "", "", "", "" }, + "display I/O subsystem statistics" }, + { "timerstats", timerstats, { NO, NO, NO, NO }, + { "", "", "", "" }, + "display event timer subsystem statistics" }, + { "addpeer", addpeer, { NTP_ADD, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, + { "addr", "keyid", "version", "minpoll#|prefer|burst|iburst|'minpoll N'|'maxpoll N'|'keyid N'|'version N' ..." }, + "configure a new peer association" }, + { "addserver", addserver, { NTP_ADD, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, + { "addr", "keyid", "version", "minpoll#|prefer|burst|iburst|'minpoll N'|'maxpoll N'|'keyid N'|'version N' ..." }, + "configure a new server" }, + { "addrefclock",addrefclock, { NTP_ADD, OPT|NTP_UINT, OPT|NTP_STR, OPT|NTP_STR }, + { "addr", "mode", "minpoll|prefer", "minpoll|prefer" }, + "configure a new server" }, + { "broadcast", broadcast, { NTP_ADD, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, + { "addr", "keyid", "version", "minpoll" }, + "configure broadcasting time service" }, + { "unconfig", unconfig, { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD }, + { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, + "unconfigure existing peer assocations" }, + { "enable", set, { NTP_STR, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, + { "auth|bclient|monitor|pll|kernel|stats", "...", "...", "..." }, + "set a system flag (auth, bclient, monitor, pll, kernel, stats)" }, + { "disable", sys_clear, { NTP_STR, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, + { "auth|bclient|monitor|pll|kernel|stats", "...", "...", "..." }, + "clear a system flag (auth, bclient, monitor, pll, kernel, stats)" }, + { "reslist", reslist, {OPT|IP_VERSION, NO, NO, NO }, + { "-4|-6", "", "", "" }, + "display the server's restrict list" }, + { "restrict", new_restrict, { NTP_ADD, NTP_ADD, NTP_STR, OPT|NTP_STR }, + { "address", "mask", + "ntpport|ignore|noserve|notrust|noquery|nomodify|nopeer|version|kod", + "..." }, + "create restrict entry/add flags to entry" }, + { "unrestrict", unrestrict, { NTP_ADD, NTP_ADD, NTP_STR, OPT|NTP_STR }, + { "address", "mask", + "ntpport|ignore|noserve|notrust|noquery|nomodify|nopeer|version|kod", + "..." }, + "remove flags from a restrict entry" }, + { "delrestrict", delrestrict, { NTP_ADD, NTP_ADD, OPT|NTP_STR, NO }, + { "address", "mask", "ntpport", "" }, + "delete a restrict entry" }, + { "monlist", monlist, { OPT|NTP_INT, NO, NO, NO }, + { "version", "", "", "" }, + "display data the server's monitor routines have collected" }, + { "reset", reset, { NTP_STR, OPT|NTP_STR, OPT|NTP_STR, OPT|NTP_STR }, + { "io|sys|mem|timer|auth|ctl|allpeers", "...", "...", "..." }, + "reset various subsystem statistics counters" }, + { "preset", preset, { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD }, + { "peer_address", "peer2_addr", "peer3_addr", "peer4_addr" }, + "reset stat counters associated with particular peer(s)" }, + { "readkeys", readkeys, { NO, NO, NO, NO }, + { "", "", "", "" }, + "request a reread of the keys file and re-init of system keys" }, + { "trustedkey", trustkey, { NTP_UINT, OPT|NTP_UINT, OPT|NTP_UINT, OPT|NTP_UINT }, + { "keyid", "keyid", "keyid", "keyid" }, + "add one or more key ID's to the trusted list" }, + { "untrustedkey", untrustkey, { NTP_UINT, OPT|NTP_UINT, OPT|NTP_UINT, OPT|NTP_UINT }, + { "keyid", "keyid", "keyid", "keyid" }, + "remove one or more key ID's from the trusted list" }, + { "authinfo", authinfo, { NO, NO, NO, NO }, + { "", "", "", "" }, + "display the state of the authentication code" }, + { "traps", traps, { NO, NO, NO, NO }, + { "", "", "", "" }, + "display the traps set in the server" }, + { "addtrap", addtrap, { NTP_ADD, OPT|NTP_UINT, OPT|NTP_ADD, NO }, + { "address", "port", "interface", "" }, + "configure a trap in the server" }, + { "clrtrap", clrtrap, { NTP_ADD, OPT|NTP_UINT, OPT|NTP_ADD, NO }, + { "address", "port", "interface", "" }, + "remove a trap (configured or otherwise) from the server" }, + { "requestkey", requestkey, { NTP_UINT, NO, NO, NO }, + { "keyid", "", "", "" }, + "change the keyid the server uses to authenticate requests" }, + { "controlkey", controlkey, { NTP_UINT, NO, NO, NO }, + { "keyid", "", "", "" }, + "change the keyid the server uses to authenticate control messages" }, + { "ctlstats", ctlstats, { NO, NO, NO, NO }, + { "", "", "", "" }, + "display packet count statistics from the control module" }, + { "clockstat", clockstat, { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD }, + { "address", "address", "address", "address" }, + "display clock status information" }, + { "fudge", fudge, { NTP_ADD, NTP_STR, NTP_STR, NO }, + { "address", "time1|time2|val1|val2|flags", "value", "" }, + "set/change one of a clock's fudge factors" }, + { "clkbug", clkbug, { NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD, OPT|NTP_ADD }, + { "address", "address", "address", "address" }, + "display clock debugging information" }, + { "kerninfo", kerninfo, { NO, NO, NO, NO }, + { "", "", "", "" }, + "display the kernel pll/pps variables" }, + { "ifstats", get_if_stats, { NO, NO, NO, NO }, + { "", "", "", "" }, + "list interface statistics" }, + { "ifreload", do_if_reload, { NO, NO, NO, NO }, + { "", "", "", "" }, + "reload interface configuration" }, + { 0, 0, { NO, NO, NO, NO }, + { "", "", "", "" }, "" } +}; + +/* + * For quick string comparisons + */ +#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) + +/* + * SET_SS_LEN_IF_PRESENT - used by SET_ADDR, SET_ADDRS macros + */ + +#ifdef ISC_PLATFORM_HAVESALEN +#define SET_SS_LEN_IF_PRESENT(psau) \ + do { \ + (psau)->sa.sa_len = SOCKLEN(psau); \ + } while (0) +#else +#define SET_SS_LEN_IF_PRESENT(psau) do { } while (0) +#endif + +/* + * SET_ADDR - setup address for v4/v6 as needed + */ +#define SET_ADDR(address, v6flag, v4addr, v6addr) \ +do { \ + ZERO(address); \ + if (v6flag) { \ + AF(&(address)) = AF_INET6; \ + SOCK_ADDR6(&(address)) = (v6addr); \ + } else { \ + AF(&(address)) = AF_INET; \ + NSRCADR(&(address)) = (v4addr); \ + } \ + SET_SS_LEN_IF_PRESENT(&(address)); \ +} while (0) + + +/* + * SET_ADDRS - setup source and destination addresses for + * v4/v6 as needed + */ +#define SET_ADDRS(a1, a2, info, a1prefix, a2prefix) \ +do { \ + ZERO(a1); \ + ZERO(a2); \ + if ((info)->v6_flag) { \ + AF(&(a1)) = AF_INET6; \ + AF(&(a2)) = AF_INET6; \ + SOCK_ADDR6(&(a1)) = (info)->a1prefix##6; \ + SOCK_ADDR6(&(a2)) = (info)->a2prefix##6; \ + } else { \ + AF(&(a1)) = AF_INET; \ + AF(&(a2)) = AF_INET; \ + NSRCADR(&(a1)) = (info)->a1prefix; \ + NSRCADR(&(a2)) = (info)->a2prefix; \ + } \ + SET_SS_LEN_IF_PRESENT(&(a1)); \ + SET_SS_LEN_IF_PRESENT(&(a2)); \ +} while (0) + + +/* + * checkitems - utility to print a message if no items were returned + */ +static int +checkitems( + int items, + FILE *fp + ) +{ + if (items == 0) { + (void) fprintf(fp, "No data returned in response to query\n"); + return 0; + } + return 1; +} + + +/* + * checkitemsize - utility to print a message if the item size is wrong + */ +static int +checkitemsize( + int itemsize, + int expected + ) +{ + if (itemsize != expected) { + (void) fprintf(stderr, + "***Incorrect item size returned by remote host (%d should be %d)\n", + itemsize, expected); + return 0; + } + return 1; +} + + +/* + * check1item - check to make sure we have exactly one item + */ +static int +check1item( + int items, + FILE *fp + ) +{ + if (items == 0) { + (void) fprintf(fp, "No data returned in response to query\n"); + return 0; + } + if (items > 1) { + (void) fprintf(fp, "Expected one item in response, got %d\n", + items); + return 0; + } + return 1; +} + + +/* + * peerlist - get a short list of peers + */ +/*ARGSUSED*/ +static void +peerlist( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_peer_list *plist; + sockaddr_u paddr; + int items; + int itemsize; + int res; + +again: + res = doquery(impl_ver, REQ_PEER_LIST, 0, 0, 0, (char *)NULL, &items, + &itemsize, (void *)&plist, 0, + sizeof(struct info_peer_list)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!checkitems(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(struct info_peer_list)) && + !checkitemsize(itemsize, v4sizeof(struct info_peer_list))) + return; + + while (items > 0) { + SET_ADDR(paddr, plist->v6_flag, plist->addr, plist->addr6); + if ((pcmd->nargs == 0) || + ((pcmd->argval->ival == 6) && (plist->v6_flag != 0)) || + ((pcmd->argval->ival == 4) && (plist->v6_flag == 0))) + (void) fprintf(fp, "%-9s %s\n", + modetoa(plist->hmode), + nntohost(&paddr)); + plist++; + items--; + } +} + + +/* + * peers - show peer summary + */ +static void +peers( + struct parse *pcmd, + FILE *fp + ) +{ + dopeers(pcmd, fp, 0); +} + +/* + * dmpeers - show peer summary, Dave Mills style + */ +static void +dmpeers( + struct parse *pcmd, + FILE *fp + ) +{ + dopeers(pcmd, fp, 1); +} + + +/* + * peers - show peer summary + */ +/*ARGSUSED*/ +static void +dopeers( + struct parse *pcmd, + FILE *fp, + int dmstyle + ) +{ + struct info_peer_summary *plist; + sockaddr_u dstadr; + sockaddr_u srcadr; + int items; + int itemsize; + int ntp_poll; + int res; + int c; + l_fp tempts; + +again: + res = doquery(impl_ver, REQ_PEER_LIST_SUM, 0, 0, 0, (char *)NULL, + &items, &itemsize, (void *)&plist, 0, + sizeof(struct info_peer_summary)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!checkitems(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(struct info_peer_summary)) && + !checkitemsize(itemsize, v4sizeof(struct info_peer_summary))) + return; + + (void) fprintf(fp, + " remote local st poll reach delay offset disp\n"); + (void) fprintf(fp, + "=======================================================================\n"); + while (items > 0) { + if (!dmstyle) { + if (plist->flags & INFO_FLAG_SYSPEER) + c = '*'; + else if (plist->hmode == MODE_ACTIVE) + c = '+'; + else if (plist->hmode == MODE_PASSIVE) + c = '-'; + else if (plist->hmode == MODE_CLIENT) + c = '='; + else if (plist->hmode == MODE_BROADCAST) + c = '^'; + else if (plist->hmode == MODE_BCLIENT) + c = '~'; + else + c = ' '; + } else { + if (plist->flags & INFO_FLAG_SYSPEER) + c = '*'; + else if (plist->flags & INFO_FLAG_SHORTLIST) + c = '+'; + else if (plist->flags & INFO_FLAG_SEL_CANDIDATE) + c = '.'; + else + c = ' '; + } + NTOHL_FP(&(plist->offset), &tempts); + ntp_poll = 1<<max(min3(plist->ppoll, plist->hpoll, NTP_MAXPOLL), + NTP_MINPOLL); + SET_ADDRS(dstadr, srcadr, plist, dstadr, srcadr); + if ((pcmd->nargs == 0) || + ((pcmd->argval->ival == 6) && (plist->v6_flag != 0)) || + ((pcmd->argval->ival == 4) && (plist->v6_flag == 0))) + (void) fprintf(fp, + "%c%-15.15s %-15.15s %2u %4d %3o %7.7s %9.9s %7.7s\n", + c, nntohost(&srcadr), stoa(&dstadr), + plist->stratum, ntp_poll, plist->reach, + fptoa(NTOHS_FP(plist->delay), 5), + lfptoa(&tempts, 6), + ufptoa(NTOHS_FP(plist->dispersion), 5)); + plist++; + items--; + } +} + +/* Convert a refid & stratum (in host order) to a string */ +static char * +refid_string( + u_int32 refid, + int stratum + ) +{ + if (stratum <= 1) { + static char junk[5]; + junk[4] = 0; + memcpy(junk, &refid, 4); + return junk; + } + + return numtoa(refid); +} + +static void +print_pflag( + FILE * fp, + u_int32 flags + ) +{ + static const char none[] = ""; + static const char comma[] = ","; + const char *dlim; + + if (0 == flags) { + fprintf(fp, " none\n"); + return; + } + dlim = none; + if (flags & INFO_FLAG_SYSPEER) { + fprintf(fp, " system_peer"); + dlim = comma; + } + if (flags & INFO_FLAG_CONFIG) { + fprintf(fp, "%s config", dlim); + dlim = comma; + } + if (flags & INFO_FLAG_REFCLOCK) { + fprintf(fp, "%s refclock", dlim); + dlim = comma; + } + if (flags & INFO_FLAG_AUTHENABLE) { + fprintf(fp, "%s auth", dlim); + dlim = comma; + } + if (flags & INFO_FLAG_PREFER) { + fprintf(fp, "%s prefer", dlim); + dlim = comma; + } + if (flags & INFO_FLAG_IBURST) { + fprintf(fp, "%s iburst", dlim); + dlim = comma; + } + if (flags & INFO_FLAG_BURST) { + fprintf(fp, "%s burst", dlim); + dlim = comma; + } + if (flags & INFO_FLAG_SEL_CANDIDATE) { + fprintf(fp, "%s candidate", dlim); + dlim = comma; + } + if (flags & INFO_FLAG_SHORTLIST) { + fprintf(fp, "%s shortlist", dlim); + dlim = comma; + } + fprintf(fp, "\n"); +} +/* + * printpeer - print detail information for a peer + */ +static void +printpeer( + register struct info_peer *pp, + FILE *fp + ) +{ + register int i; + l_fp tempts; + sockaddr_u srcadr, dstadr; + + SET_ADDRS(dstadr, srcadr, pp, dstadr, srcadr); + + (void) fprintf(fp, "remote %s, local %s\n", + stoa(&srcadr), stoa(&dstadr)); + (void) fprintf(fp, "hmode %s, pmode %s, stratum %d, precision %d\n", + modetoa(pp->hmode), modetoa(pp->pmode), + pp->stratum, pp->precision); + + (void) fprintf(fp, + "leap %c%c, refid [%s], rootdistance %s, rootdispersion %s\n", + pp->leap & 0x2 ? '1' : '0', + pp->leap & 0x1 ? '1' : '0', + refid_string(pp->refid, pp->stratum), fptoa(NTOHS_FP(pp->rootdelay), 5), + ufptoa(NTOHS_FP(pp->rootdispersion), 5)); + + (void) fprintf(fp, + "ppoll %d, hpoll %d, keyid %lu, version %d, association %u\n", + pp->ppoll, pp->hpoll, (u_long)pp->keyid, pp->version, ntohs(pp->associd)); + + (void) fprintf(fp, + "reach %03o, unreach %d, flash 0x%04x, ", + pp->reach, pp->unreach, pp->flash2); + + (void) fprintf(fp, "boffset %s, ttl/mode %d\n", + fptoa(NTOHS_FP(pp->estbdelay), 5), pp->ttl); + + (void) fprintf(fp, "timer %lds, flags", (long)ntohl(pp->timer)); + print_pflag(fp, pp->flags); + + NTOHL_FP(&pp->reftime, &tempts); + (void) fprintf(fp, "reference time: %s\n", + prettydate(&tempts)); + NTOHL_FP(&pp->org, &tempts); + (void) fprintf(fp, "originate timestamp: %s\n", + prettydate(&tempts)); + NTOHL_FP(&pp->rec, &tempts); + (void) fprintf(fp, "receive timestamp: %s\n", + prettydate(&tempts)); + NTOHL_FP(&pp->xmt, &tempts); + (void) fprintf(fp, "transmit timestamp: %s\n", + prettydate(&tempts)); + + (void) fprintf(fp, "filter delay: "); + for (i = 0; i < NTP_SHIFT; i++) { + (void) fprintf(fp, " %-8.8s", + fptoa(NTOHS_FP(pp->filtdelay[i]), 5)); + if (i == (NTP_SHIFT>>1)-1) + (void) fprintf(fp, "\n "); + } + (void) fprintf(fp, "\n"); + + (void) fprintf(fp, "filter offset:"); + for (i = 0; i < NTP_SHIFT; i++) { + NTOHL_FP(&pp->filtoffset[i], &tempts); + (void) fprintf(fp, " %-8.8s", lfptoa(&tempts, 6)); + if (i == (NTP_SHIFT>>1)-1) + (void) fprintf(fp, "\n "); + } + (void) fprintf(fp, "\n"); + + (void) fprintf(fp, "filter order: "); + for (i = 0; i < NTP_SHIFT; i++) { + (void) fprintf(fp, " %-8d", pp->order[i]); + if (i == (NTP_SHIFT>>1)-1) + (void) fprintf(fp, "\n "); + } + (void) fprintf(fp, "\n"); + + + NTOHL_FP(&pp->offset, &tempts); + (void) fprintf(fp, + "offset %s, delay %s, error bound %s, filter error %s\n", + lfptoa(&tempts, 6), fptoa(NTOHS_FP(pp->delay), 5), + ufptoa(NTOHS_FP(pp->dispersion), 5), + ufptoa(NTOHS_FP(pp->selectdisp), 5)); +} + + +/* + * showpeer - show detailed information for a peer + */ +static void +showpeer( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_peer *pp; + /* 4 is the maximum number of peers which will fit in a packet */ + struct info_peer_list *pl, plist[min(MAXARGS, 4)]; + int qitemlim; + int qitems; + int items; + int itemsize; + int res; + int sendsize; + +again: + if (impl_ver == IMPL_XNTPD) + sendsize = sizeof(struct info_peer_list); + else + sendsize = v4sizeof(struct info_peer_list); + + qitemlim = min(pcmd->nargs, COUNTOF(plist)); + for (qitems = 0, pl = plist; qitems < qitemlim; qitems++) { + if (IS_IPV4(&pcmd->argval[qitems].netnum)) { + pl->addr = NSRCADR(&pcmd->argval[qitems].netnum); + if (impl_ver == IMPL_XNTPD) + pl->v6_flag = 0; + } else { + if (impl_ver == IMPL_XNTPD_OLD) { + fprintf(stderr, + "***Server doesn't understand IPv6 addresses\n"); + return; + } + pl->addr6 = SOCK_ADDR6(&pcmd->argval[qitems].netnum); + pl->v6_flag = 1; + } + pl->port = (u_short)s_port; + pl->hmode = pl->flags = 0; + pl = (void *)((char *)pl + sendsize); + } + + res = doquery(impl_ver, REQ_PEER_INFO, 0, qitems, + sendsize, (char *)plist, &items, + &itemsize, (void *)&pp, 0, sizeof(struct info_peer)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!checkitems(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(struct info_peer)) && + !checkitemsize(itemsize, v4sizeof(struct info_peer))) + return; + + while (items-- > 0) { + printpeer(pp, fp); + if (items > 0) + fprintf(fp, "\n"); + pp++; + } +} + + +/* + * peerstats - return statistics for a peer + */ +static void +peerstats( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_peer_stats *pp; + /* 4 is the maximum number of peers which will fit in a packet */ + struct info_peer_list *pl, plist[min(MAXARGS, 4)]; + sockaddr_u src, dst; + int qitemlim; + int qitems; + int items; + int itemsize; + int res; + int sendsize; + +again: + if (impl_ver == IMPL_XNTPD) + sendsize = sizeof(struct info_peer_list); + else + sendsize = v4sizeof(struct info_peer_list); + + ZERO(plist); + + qitemlim = min(pcmd->nargs, COUNTOF(plist)); + for (qitems = 0, pl = plist; qitems < qitemlim; qitems++) { + if (IS_IPV4(&pcmd->argval[qitems].netnum)) { + pl->addr = NSRCADR(&pcmd->argval[qitems].netnum); + if (impl_ver == IMPL_XNTPD) + pl->v6_flag = 0; + } else { + if (impl_ver == IMPL_XNTPD_OLD) { + fprintf(stderr, + "***Server doesn't understand IPv6 addresses\n"); + return; + } + pl->addr6 = SOCK_ADDR6(&pcmd->argval[qitems].netnum); + pl->v6_flag = 1; + } + pl->port = (u_short)s_port; + pl->hmode = plist[qitems].flags = 0; + pl = (void *)((char *)pl + sendsize); + } + + res = doquery(impl_ver, REQ_PEER_STATS, 0, qitems, + sendsize, (char *)plist, &items, + &itemsize, (void *)&pp, 0, + sizeof(struct info_peer_stats)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!checkitems(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(struct info_peer_stats)) && + !checkitemsize(itemsize, v4sizeof(struct info_peer_stats))) + return; + + while (items-- > 0) { + ZERO_SOCK(&dst); + ZERO_SOCK(&src); + if (pp->v6_flag != 0) { + AF(&dst) = AF_INET6; + AF(&src) = AF_INET6; + SOCK_ADDR6(&dst) = pp->dstadr6; + SOCK_ADDR6(&src) = pp->srcadr6; + } else { + AF(&dst) = AF_INET; + AF(&src) = AF_INET; + NSRCADR(&dst) = pp->dstadr; + NSRCADR(&src) = pp->srcadr; + } +#ifdef ISC_PLATFORM_HAVESALEN + src.sa.sa_len = SOCKLEN(&src); + dst.sa.sa_len = SOCKLEN(&dst); +#endif + fprintf(fp, "remote host: %s\n", + nntohost(&src)); + fprintf(fp, "local interface: %s\n", + stoa(&dst)); + fprintf(fp, "time last received: %lus\n", + (u_long)ntohl(pp->timereceived)); + fprintf(fp, "time until next send: %lus\n", + (u_long)ntohl(pp->timetosend)); + fprintf(fp, "reachability change: %lus\n", + (u_long)ntohl(pp->timereachable)); + fprintf(fp, "packets sent: %lu\n", + (u_long)ntohl(pp->sent)); + fprintf(fp, "packets received: %lu\n", + (u_long)ntohl(pp->processed)); + fprintf(fp, "bad authentication: %lu\n", + (u_long)ntohl(pp->badauth)); + fprintf(fp, "bogus origin: %lu\n", + (u_long)ntohl(pp->bogusorg)); + fprintf(fp, "duplicate: %lu\n", + (u_long)ntohl(pp->oldpkt)); + fprintf(fp, "bad dispersion: %lu\n", + (u_long)ntohl(pp->seldisp)); + fprintf(fp, "bad reference time: %lu\n", + (u_long)ntohl(pp->selbroken)); + fprintf(fp, "candidate order: %u\n", + pp->candidate); + if (items > 0) + fprintf(fp, "\n"); + fprintf(fp, "flags: "); + print_pflag(fp, ntohs(pp->flags)); + pp++; + } +} + + +/* + * loopinfo - show loop filter information + */ +static void +loopinfo( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_loop *il; + int items; + int itemsize; + int oneline = 0; + int res; + l_fp tempts; + + if (pcmd->nargs > 0) { + if (STREQ(pcmd->argval[0].string, "oneline")) + oneline = 1; + else if (STREQ(pcmd->argval[0].string, "multiline")) + oneline = 0; + else { + (void) fprintf(stderr, "How many lines?\n"); + return; + } + } + +again: + res = doquery(impl_ver, REQ_LOOP_INFO, 0, 0, 0, (char *)NULL, + &items, &itemsize, (void *)&il, 0, + sizeof(struct info_loop)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!check1item(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(struct info_loop))) + return; + + if (oneline) { + l_fp temp2ts; + + NTOHL_FP(&il->last_offset, &tempts); + NTOHL_FP(&il->drift_comp, &temp2ts); + + (void) fprintf(fp, + "offset %s, frequency %s, time_const %ld, watchdog %ld\n", + lfptoa(&tempts, 6), + lfptoa(&temp2ts, 3), + (long)(int32)ntohl((u_long)il->compliance), + (u_long)ntohl((u_long)il->watchdog_timer)); + } else { + NTOHL_FP(&il->last_offset, &tempts); + (void) fprintf(fp, "offset: %s s\n", + lfptoa(&tempts, 6)); + NTOHL_FP(&il->drift_comp, &tempts); + (void) fprintf(fp, "frequency: %s ppm\n", + lfptoa(&tempts, 3)); + (void) fprintf(fp, "poll adjust: %ld\n", + (long)(int32)ntohl(il->compliance)); + (void) fprintf(fp, "watchdog timer: %ld s\n", + (u_long)ntohl(il->watchdog_timer)); + } +} + + +/* + * sysinfo - show current system state + */ +/*ARGSUSED*/ +static void +sysinfo( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_sys *is; + sockaddr_u peeraddr; + int items; + int itemsize; + int res; + l_fp tempts; + +again: + res = doquery(impl_ver, REQ_SYS_INFO, 0, 0, 0, (char *)NULL, + &items, &itemsize, (void *)&is, 0, + sizeof(struct info_sys)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!check1item(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(struct info_sys)) && + !checkitemsize(itemsize, v4sizeof(struct info_sys))) + return; + + SET_ADDR(peeraddr, is->v6_flag, is->peer, is->peer6); + + (void) fprintf(fp, "system peer: %s\n", nntohost(&peeraddr)); + (void) fprintf(fp, "system peer mode: %s\n", modetoa(is->peer_mode)); + (void) fprintf(fp, "leap indicator: %c%c\n", + is->leap & 0x2 ? '1' : '0', + is->leap & 0x1 ? '1' : '0'); + (void) fprintf(fp, "stratum: %d\n", (int)is->stratum); + (void) fprintf(fp, "precision: %d\n", (int)is->precision); + (void) fprintf(fp, "root distance: %s s\n", + fptoa(NTOHS_FP(is->rootdelay), 5)); + (void) fprintf(fp, "root dispersion: %s s\n", + ufptoa(NTOHS_FP(is->rootdispersion), 5)); + (void) fprintf(fp, "reference ID: [%s]\n", + refid_string(is->refid, is->stratum)); + NTOHL_FP(&is->reftime, &tempts); + (void) fprintf(fp, "reference time: %s\n", prettydate(&tempts)); + + (void) fprintf(fp, "system flags: "); + if ((is->flags & (INFO_FLAG_BCLIENT | INFO_FLAG_AUTHENABLE | + INFO_FLAG_NTP | INFO_FLAG_KERNEL| INFO_FLAG_CAL | + INFO_FLAG_PPS_SYNC | INFO_FLAG_MONITOR | INFO_FLAG_FILEGEN)) == 0) { + (void) fprintf(fp, "none\n"); + } else { + if (is->flags & INFO_FLAG_BCLIENT) + (void) fprintf(fp, "bclient "); + if (is->flags & INFO_FLAG_AUTHENTICATE) + (void) fprintf(fp, "auth "); + if (is->flags & INFO_FLAG_MONITOR) + (void) fprintf(fp, "monitor "); + if (is->flags & INFO_FLAG_NTP) + (void) fprintf(fp, "ntp "); + if (is->flags & INFO_FLAG_KERNEL) + (void) fprintf(fp, "kernel "); + if (is->flags & INFO_FLAG_FILEGEN) + (void) fprintf(fp, "stats "); + if (is->flags & INFO_FLAG_CAL) + (void) fprintf(fp, "calibrate "); + if (is->flags & INFO_FLAG_PPS_SYNC) + (void) fprintf(fp, "pps "); + (void) fprintf(fp, "\n"); + } + (void) fprintf(fp, "jitter: %s s\n", + fptoa(ntohl(is->frequency), 6)); + (void) fprintf(fp, "stability: %s ppm\n", + ufptoa(ntohl(is->stability), 3)); + (void) fprintf(fp, "broadcastdelay: %s s\n", + fptoa(NTOHS_FP(is->bdelay), 6)); + NTOHL_FP(&is->authdelay, &tempts); + (void) fprintf(fp, "authdelay: %s s\n", lfptoa(&tempts, 6)); +} + + +/* + * sysstats - print system statistics + */ +/*ARGSUSED*/ +static void +sysstats( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_sys_stats *ss; + int items; + int itemsize; + int res; + +again: + res = doquery(impl_ver, REQ_SYS_STATS, 0, 0, 0, (char *)NULL, + &items, &itemsize, (void *)&ss, 0, + sizeof(struct info_sys_stats)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!check1item(items, fp)) + return; + + if (itemsize != sizeof(struct info_sys_stats) && + itemsize != sizeof(struct old_info_sys_stats)) { + /* issue warning according to new structure size */ + checkitemsize(itemsize, sizeof(struct info_sys_stats)); + return; + } + fprintf(fp, "time since restart: %lu\n", + (u_long)ntohl(ss->timeup)); + fprintf(fp, "time since reset: %lu\n", + (u_long)ntohl(ss->timereset)); + fprintf(fp, "packets received: %lu\n", + (u_long)ntohl(ss->received)); + fprintf(fp, "packets processed: %lu\n", + (u_long)ntohl(ss->processed)); + fprintf(fp, "current version: %lu\n", + (u_long)ntohl(ss->newversionpkt)); + fprintf(fp, "previous version: %lu\n", + (u_long)ntohl(ss->oldversionpkt)); + fprintf(fp, "declined: %lu\n", + (u_long)ntohl(ss->unknownversion)); + fprintf(fp, "access denied: %lu\n", + (u_long)ntohl(ss->denied)); + fprintf(fp, "bad length or format: %lu\n", + (u_long)ntohl(ss->badlength)); + fprintf(fp, "bad authentication: %lu\n", + (u_long)ntohl(ss->badauth)); + if (itemsize != sizeof(struct info_sys_stats)) + return; + + fprintf(fp, "rate exceeded: %lu\n", + (u_long)ntohl(ss->limitrejected)); +} + + + +/* + * iostats - print I/O statistics + */ +/*ARGSUSED*/ +static void +iostats( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_io_stats *io; + int items; + int itemsize; + int res; + +again: + res = doquery(impl_ver, REQ_IO_STATS, 0, 0, 0, NULL, &items, + &itemsize, (void *)&io, 0, sizeof(*io)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!check1item(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(*io))) + return; + + fprintf(fp, "time since reset: %lu\n", + (u_long)ntohl(io->timereset)); + fprintf(fp, "receive buffers: %u\n", + (u_int)ntohs(io->totalrecvbufs)); + fprintf(fp, "free receive buffers: %u\n", + (u_int)ntohs(io->freerecvbufs)); + fprintf(fp, "used receive buffers: %u\n", + (u_int)ntohs(io->fullrecvbufs)); + fprintf(fp, "low water refills: %u\n", + (u_int)ntohs(io->lowwater)); + fprintf(fp, "dropped packets: %lu\n", + (u_long)ntohl(io->dropped)); + fprintf(fp, "ignored packets: %lu\n", + (u_long)ntohl(io->ignored)); + fprintf(fp, "received packets: %lu\n", + (u_long)ntohl(io->received)); + fprintf(fp, "packets sent: %lu\n", + (u_long)ntohl(io->sent)); + fprintf(fp, "packets not sent: %lu\n", + (u_long)ntohl(io->notsent)); + fprintf(fp, "interrupts handled: %lu\n", + (u_long)ntohl(io->interrupts)); + fprintf(fp, "received by int: %lu\n", + (u_long)ntohl(io->int_received)); +} + + +/* + * memstats - print peer memory statistics + */ +/*ARGSUSED*/ +static void +memstats( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_mem_stats *mem; + int i; + int items; + int itemsize; + int res; + +again: + res = doquery(impl_ver, REQ_MEM_STATS, 0, 0, 0, NULL, &items, + &itemsize, (void *)&mem, 0, sizeof(*mem)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!check1item(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(*mem))) + return; + + fprintf(fp, "time since reset: %lu\n", + (u_long)ntohl(mem->timereset)); + fprintf(fp, "total peer memory: %u\n", + (u_int)ntohs(mem->totalpeermem)); + fprintf(fp, "free peer memory: %u\n", + (u_int)ntohs(mem->freepeermem)); + fprintf(fp, "calls to findpeer: %lu\n", + (u_long)ntohl(mem->findpeer_calls)); + fprintf(fp, "new peer allocations: %lu\n", + (u_long)ntohl(mem->allocations)); + fprintf(fp, "peer demobilizations: %lu\n", + (u_long)ntohl(mem->demobilizations)); + + fprintf(fp, "hash table counts: "); + for (i = 0; i < NTP_HASH_SIZE; i++) { + fprintf(fp, "%4d", (int)mem->hashcount[i]); + if ((i % 8) == 7 && i != (NTP_HASH_SIZE-1)) + fprintf(fp, "\n "); + } + fprintf(fp, "\n"); +} + + + +/* + * timerstats - print timer statistics + */ +/*ARGSUSED*/ +static void +timerstats( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_timer_stats *tim; + int items; + int itemsize; + int res; + +again: + res = doquery(impl_ver, REQ_TIMER_STATS, 0, 0, 0, NULL, &items, + &itemsize, (void *)&tim, 0, sizeof(*tim)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!check1item(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(*tim))) + return; + + fprintf(fp, "time since reset: %lu\n", + (u_long)ntohl(tim->timereset)); + fprintf(fp, "alarms handled: %lu\n", + (u_long)ntohl(tim->alarms)); + fprintf(fp, "alarm overruns: %lu\n", + (u_long)ntohl(tim->overflows)); + fprintf(fp, "calls to transmit: %lu\n", + (u_long)ntohl(tim->xmtcalls)); +} + + +/* + * addpeer - configure an active mode association + */ +static void +addpeer( + struct parse *pcmd, + FILE *fp + ) +{ + doconfig(pcmd, fp, MODE_ACTIVE, 0); +} + + +/* + * addserver - configure a client mode association + */ +static void +addserver( + struct parse *pcmd, + FILE *fp + ) +{ + doconfig(pcmd, fp, MODE_CLIENT, 0); +} + +/* + * addrefclock - configure a reference clock association + */ +static void +addrefclock( + struct parse *pcmd, + FILE *fp + ) +{ + doconfig(pcmd, fp, MODE_CLIENT, 1); +} + +/* + * broadcast - configure a broadcast mode association + */ +static void +broadcast( + struct parse *pcmd, + FILE *fp + ) +{ + doconfig(pcmd, fp, MODE_BROADCAST, 0); +} + + +/* + * config - configure a new peer association + */ +static void +doconfig( + struct parse *pcmd, + FILE *fp, + int mode, + int refc + ) +{ + struct conf_peer cpeer; + int items; + int itemsize; + char *dummy; + u_long keyid; + u_int version; + u_char minpoll; + u_char maxpoll; + u_int flags; + u_char cmode; + int res; + int sendsize; + int numtyp; + long val; + +again: + keyid = 0; + version = 3; + flags = 0; + res = FALSE; + cmode = 0; + minpoll = NTP_MINDPOLL; + maxpoll = NTP_MAXDPOLL; + numtyp = 1; + if (refc) + numtyp = 5; + + if (impl_ver == IMPL_XNTPD) + sendsize = sizeof(struct conf_peer); + else + sendsize = v4sizeof(struct conf_peer); + + items = 1; + while (pcmd->nargs > items) { + if (STREQ(pcmd->argval[items].string, "prefer")) + flags |= CONF_FLAG_PREFER; + else if (STREQ(pcmd->argval[items].string, "burst")) + flags |= CONF_FLAG_BURST; + else if (STREQ(pcmd->argval[items].string, "iburst")) + flags |= CONF_FLAG_IBURST; + else if (!refc && STREQ(pcmd->argval[items].string, "keyid")) + numtyp = 1; + else if (!refc && STREQ(pcmd->argval[items].string, "version")) + numtyp = 2; + else if (STREQ(pcmd->argval[items].string, "minpoll")) + numtyp = 3; + else if (STREQ(pcmd->argval[items].string, "maxpoll")) + numtyp = 4; + else { + if (!atoint(pcmd->argval[items].string, &val)) + numtyp = 0; + switch (numtyp) { + case 1: + keyid = val; + numtyp = 2; + break; + + case 2: + version = (u_int)val; + numtyp = 0; + break; + + case 3: + minpoll = (u_char)val; + numtyp = 0; + break; + + case 4: + maxpoll = (u_char)val; + numtyp = 0; + break; + + case 5: + cmode = (u_char)val; + numtyp = 0; + break; + + default: + fprintf(fp, "*** '%s' not understood\n", + pcmd->argval[items].string); + res = TRUE; + numtyp = 0; + } + if (val < 0) { + fprintf(stderr, + "*** Value '%s' should be unsigned\n", + pcmd->argval[items].string); + res = TRUE; + } + } + items++; + } + if (keyid > 0) + flags |= CONF_FLAG_AUTHENABLE; + if (version > NTP_VERSION || version < NTP_OLDVERSION) { + fprintf(fp, "***invalid version number: %u\n", + version); + res = TRUE; + } + if (minpoll < NTP_MINPOLL || minpoll > NTP_MAXPOLL || + maxpoll < NTP_MINPOLL || maxpoll > NTP_MAXPOLL || + minpoll > maxpoll) { + fprintf(fp, "***min/max-poll must be within %d..%d\n", + NTP_MINPOLL, NTP_MAXPOLL); + res = TRUE; + } + + if (res) + return; + + ZERO(cpeer); + + if (IS_IPV4(&pcmd->argval[0].netnum)) { + cpeer.peeraddr = NSRCADR(&pcmd->argval[0].netnum); + if (impl_ver == IMPL_XNTPD) + cpeer.v6_flag = 0; + } else { + if (impl_ver == IMPL_XNTPD_OLD) { + fprintf(stderr, + "***Server doesn't understand IPv6 addresses\n"); + return; + } + cpeer.peeraddr6 = SOCK_ADDR6(&pcmd->argval[0].netnum); + cpeer.v6_flag = 1; + } + cpeer.hmode = (u_char) mode; + cpeer.keyid = keyid; + cpeer.version = (u_char) version; + cpeer.minpoll = minpoll; + cpeer.maxpoll = maxpoll; + cpeer.flags = (u_char)flags; + cpeer.ttl = cmode; + + res = doquery(impl_ver, REQ_CONFIG, 1, 1, + sendsize, (char *)&cpeer, &items, + &itemsize, &dummy, 0, sizeof(struct conf_peer)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res == INFO_ERR_FMT) { + (void) fprintf(fp, + "***Retrying command with old conf_peer size\n"); + res = doquery(impl_ver, REQ_CONFIG, 1, 1, + sizeof(struct old_conf_peer), (char *)&cpeer, + &items, &itemsize, &dummy, 0, + sizeof(struct conf_peer)); + } + if (res == 0) + (void) fprintf(fp, "done!\n"); + return; +} + + +/* + * unconfig - unconfigure some associations + */ +static void +unconfig( + struct parse *pcmd, + FILE *fp + ) +{ + /* 8 is the maximum number of peers which will fit in a packet */ + struct conf_unpeer *pl, plist[min(MAXARGS, 8)]; + int qitemlim; + int qitems; + int items; + int itemsize; + char *dummy; + int res; + int sendsize; + +again: + if (impl_ver == IMPL_XNTPD) + sendsize = sizeof(struct conf_unpeer); + else + sendsize = v4sizeof(struct conf_unpeer); + + qitemlim = min(pcmd->nargs, COUNTOF(plist)); + for (qitems = 0, pl = plist; qitems < qitemlim; qitems++) { + if (IS_IPV4(&pcmd->argval[0].netnum)) { + pl->peeraddr = NSRCADR(&pcmd->argval[qitems].netnum); + if (impl_ver == IMPL_XNTPD) + pl->v6_flag = 0; + } else { + if (impl_ver == IMPL_XNTPD_OLD) { + fprintf(stderr, + "***Server doesn't understand IPv6 addresses\n"); + return; + } + pl->peeraddr6 = + SOCK_ADDR6(&pcmd->argval[qitems].netnum); + pl->v6_flag = 1; + } + pl = (void *)((char *)pl + sendsize); + } + + res = doquery(impl_ver, REQ_UNCONFIG, 1, qitems, + sendsize, (char *)plist, &items, + &itemsize, &dummy, 0, sizeof(struct conf_unpeer)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res == 0) + (void) fprintf(fp, "done!\n"); +} + + +/* + * set - set some system flags + */ +static void +set( + struct parse *pcmd, + FILE *fp + ) +{ + doset(pcmd, fp, REQ_SET_SYS_FLAG); +} + + +/* + * clear - clear some system flags + */ +static void +sys_clear( + struct parse *pcmd, + FILE *fp + ) +{ + doset(pcmd, fp, REQ_CLR_SYS_FLAG); +} + + +/* + * doset - set/clear system flags + */ +static void +doset( + struct parse *pcmd, + FILE *fp, + int req + ) +{ + struct conf_sys_flags sys; + int items; + int itemsize; + char *dummy; + int res; + + sys.flags = 0; + res = 0; + for (items = 0; items < pcmd->nargs; items++) { + if (STREQ(pcmd->argval[items].string, "auth")) + sys.flags |= SYS_FLAG_AUTH; + else if (STREQ(pcmd->argval[items].string, "bclient")) + sys.flags |= SYS_FLAG_BCLIENT; + else if (STREQ(pcmd->argval[items].string, "calibrate")) + sys.flags |= SYS_FLAG_CAL; + else if (STREQ(pcmd->argval[items].string, "kernel")) + sys.flags |= SYS_FLAG_KERNEL; + else if (STREQ(pcmd->argval[items].string, "monitor")) + sys.flags |= SYS_FLAG_MONITOR; + else if (STREQ(pcmd->argval[items].string, "ntp")) + sys.flags |= SYS_FLAG_NTP; + else if (STREQ(pcmd->argval[items].string, "pps")) + sys.flags |= SYS_FLAG_PPS; + else if (STREQ(pcmd->argval[items].string, "stats")) + sys.flags |= SYS_FLAG_FILEGEN; + else { + (void) fprintf(fp, "Unknown flag %s\n", + pcmd->argval[items].string); + res = 1; + } + } + + sys.flags = htonl(sys.flags); + if (res || sys.flags == 0) + return; + +again: + res = doquery(impl_ver, req, 1, 1, + sizeof(struct conf_sys_flags), (char *)&sys, &items, + &itemsize, &dummy, 0, sizeof(struct conf_sys_flags)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res == 0) + (void) fprintf(fp, "done!\n"); +} + + +/* + * data for printing/interrpreting the restrict flags + */ +struct resflags { + const char *str; + int bit; +}; + +/* XXX: HMS: we apparently don't report set bits we do not recognize. */ + +static struct resflags resflagsV2[] = { + { "ignore", 0x001 }, + { "noserve", 0x002 }, + { "notrust", 0x004 }, + { "noquery", 0x008 }, + { "nomodify", 0x010 }, + { "nopeer", 0x020 }, + { "notrap", 0x040 }, + { "lptrap", 0x080 }, + { "limited", 0x100 }, + { "", 0 } +}; + +static struct resflags resflagsV3[] = { + { "ignore", RES_IGNORE }, + { "noserve", RES_DONTSERVE }, + { "notrust", RES_DONTTRUST }, + { "noquery", RES_NOQUERY }, + { "nomodify", RES_NOMODIFY }, + { "nopeer", RES_NOPEER }, + { "notrap", RES_NOTRAP }, + { "lptrap", RES_LPTRAP }, + { "limited", RES_LIMITED }, + { "version", RES_VERSION }, + { "kod", RES_KOD }, + { "flake", RES_FLAKE }, + + { "", 0 } +}; + +static struct resflags resmflags[] = { + { "ntpport", RESM_NTPONLY }, + { "interface", RESM_INTERFACE }, + { "source", RESM_SOURCE }, + { "", 0 } +}; + + +/* + * reslist - obtain and print the server's restrict list + */ +/*ARGSUSED*/ +static void +reslist( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_restrict *rl; + sockaddr_u resaddr; + sockaddr_u maskaddr; + int items; + int itemsize; + int res; + int skip; + const char *addr; + const char *mask; + struct resflags *rf; + u_int32 count; + u_short flags; + u_short mflags; + char flagstr[300]; + static const char *comma = ", "; + +again: + res = doquery(impl_ver, REQ_GET_RESTRICT, 0, 0, 0, (char *)NULL, + &items, &itemsize, (void *)&rl, 0, + sizeof(struct info_restrict)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!checkitems(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(struct info_restrict)) && + !checkitemsize(itemsize, v4sizeof(struct info_restrict))) + return; + + fprintf(fp, + " address mask count flags\n"); + fprintf(fp, + "=====================================================================\n"); + + while (items > 0) { + SET_ADDRS(resaddr, maskaddr, rl, addr, mask); + if (rl->v6_flag != 0) { + addr = nntohost(&resaddr); + } else { + if (rl->mask == (u_int32)0xffffffff) + addr = nntohost(&resaddr); + else + addr = stoa(&resaddr); + } + mask = stoa(&maskaddr); + skip = 1; + if ((pcmd->nargs == 0) || + ((pcmd->argval->ival == 6) && (rl->v6_flag != 0)) || + ((pcmd->argval->ival == 4) && (rl->v6_flag == 0))) + skip = 0; + count = ntohl(rl->count); + flags = ntohs(rl->flags); + mflags = ntohs(rl->mflags); + flagstr[0] = '\0'; + + res = 1; + rf = &resmflags[0]; + while (rf->bit != 0) { + if (mflags & rf->bit) { + if (!res) + strlcat(flagstr, comma, + sizeof(flagstr)); + res = 0; + strlcat(flagstr, rf->str, + sizeof(flagstr)); + } + rf++; + } + + rf = (impl_ver == IMPL_XNTPD_OLD) + ? &resflagsV2[0] + : &resflagsV3[0]; + + while (rf->bit != 0) { + if (flags & rf->bit) { + if (!res) + strlcat(flagstr, comma, + sizeof(flagstr)); + res = 0; + strlcat(flagstr, rf->str, + sizeof(flagstr)); + } + rf++; + } + + if (flagstr[0] == '\0') + strlcpy(flagstr, "none", sizeof(flagstr)); + + if (!skip) + fprintf(fp, "%-15.15s %-15.15s %9lu %s\n", + addr, mask, (u_long)count, flagstr); + rl++; + items--; + } +} + + + +/* + * new_restrict - create/add a set of restrictions + */ +static void +new_restrict( + struct parse *pcmd, + FILE *fp + ) +{ + do_restrict(pcmd, fp, REQ_RESADDFLAGS); +} + + +/* + * unrestrict - remove restriction flags from existing entry + */ +static void +unrestrict( + struct parse *pcmd, + FILE *fp + ) +{ + do_restrict(pcmd, fp, REQ_RESSUBFLAGS); +} + + +/* + * delrestrict - delete an existing restriction + */ +static void +delrestrict( + struct parse *pcmd, + FILE *fp + ) +{ + do_restrict(pcmd, fp, REQ_UNRESTRICT); +} + + +/* + * do_restrict - decode commandline restrictions and make the request + */ +static void +do_restrict( + struct parse *pcmd, + FILE *fp, + int req_code + ) +{ + struct conf_restrict cres; + int items; + int itemsize; + char *dummy; + u_int32 num; + u_long bit; + int i; + int res; + int err; + int sendsize; + + /* Initialize cres */ + cres.addr = 0; + cres.mask = 0; + cres.flags = 0; + cres.mflags = 0; + cres.v6_flag = 0; + +again: + if (impl_ver == IMPL_XNTPD) + sendsize = sizeof(struct conf_restrict); + else + sendsize = v4sizeof(struct conf_restrict); + + if (IS_IPV4(&pcmd->argval[0].netnum)) { + cres.addr = NSRCADR(&pcmd->argval[0].netnum); + cres.mask = NSRCADR(&pcmd->argval[1].netnum); + if (impl_ver == IMPL_XNTPD) + cres.v6_flag = 0; + } else { + if (impl_ver == IMPL_XNTPD_OLD) { + fprintf(stderr, + "***Server doesn't understand IPv6 addresses\n"); + return; + } + cres.addr6 = SOCK_ADDR6(&pcmd->argval[0].netnum); + cres.v6_flag = 1; + } + cres.flags = 0; + cres.mflags = 0; + err = FALSE; + for (res = 2; res < pcmd->nargs; res++) { + if (STREQ(pcmd->argval[res].string, "ntpport")) { + cres.mflags |= RESM_NTPONLY; + } else { + for (i = 0; resflagsV3[i].bit != 0; i++) { + if (STREQ(pcmd->argval[res].string, + resflagsV3[i].str)) + break; + } + if (resflagsV3[i].bit != 0) { + cres.flags |= resflagsV3[i].bit; + if (req_code == REQ_UNRESTRICT) { + fprintf(fp, + "Flag %s inappropriate\n", + resflagsV3[i].str); + err = TRUE; + } + } else { + fprintf(fp, "Unknown flag %s\n", + pcmd->argval[res].string); + err = TRUE; + } + } + } + cres.flags = htons(cres.flags); + cres.mflags = htons(cres.mflags); + + /* + * Make sure mask for default address is zero. Otherwise, + * make sure mask bits are contiguous. + */ + if (IS_IPV4(&pcmd->argval[0].netnum)) { + if (cres.addr == 0) { + cres.mask = 0; + } else { + num = ntohl(cres.mask); + for (bit = 0x80000000; bit != 0; bit >>= 1) + if ((num & bit) == 0) + break; + for ( ; bit != 0; bit >>= 1) + if ((num & bit) != 0) + break; + if (bit != 0) { + fprintf(fp, "Invalid mask %s\n", + numtoa(cres.mask)); + err = TRUE; + } + } + } else { + /* XXX IPv6 sanity checking stuff */ + } + + if (err) + return; + + res = doquery(impl_ver, req_code, 1, 1, sendsize, (char *)&cres, + &items, &itemsize, &dummy, 0, sizeof(cres)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res == 0) + (void) fprintf(fp, "done!\n"); + return; +} + + +/* + * monlist - obtain and print the server's monitor data + */ +/*ARGSUSED*/ +static void +monlist( + struct parse *pcmd, + FILE *fp + ) +{ + char *struct_star; + struct info_monitor *ml; + struct info_monitor_1 *m1; + struct old_info_monitor *oml; + sockaddr_u addr; + sockaddr_u dstadr; + int items; + int itemsize; + int res; + int version = -1; + + if (pcmd->nargs > 0) + version = pcmd->argval[0].ival; + +again: + res = doquery(impl_ver, + (version == 1 || version == -1) ? REQ_MON_GETLIST_1 : + REQ_MON_GETLIST, 0, 0, 0, NULL, + &items, &itemsize, &struct_star, + (version < 0) ? (1 << INFO_ERR_REQ) : 0, + sizeof(struct info_monitor_1)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res == INFO_ERR_REQ && version < 0) + res = doquery(impl_ver, REQ_MON_GETLIST, 0, 0, 0, NULL, + &items, &itemsize, &struct_star, 0, + sizeof(struct info_monitor)); + + if (res != 0) + return; + + if (!checkitems(items, fp)) + return; + + if (itemsize == sizeof(struct info_monitor_1) || + itemsize == v4sizeof(struct info_monitor_1)) { + + m1 = (void *)struct_star; + fprintf(fp, + "remote address port local address count m ver rstr avgint lstint\n"); + fprintf(fp, + "===============================================================================\n"); + while (items > 0) { + SET_ADDRS(dstadr, addr, m1, daddr, addr); + if ((pcmd->nargs == 0) || + ((pcmd->argval->ival == 6) && (m1->v6_flag != 0)) || + ((pcmd->argval->ival == 4) && (m1->v6_flag == 0))) + fprintf(fp, + "%-22.22s %5d %-15s %8lu %1u %1u %6lx %6lu %7lu\n", + nntohost(&addr), + ntohs(m1->port), + stoa(&dstadr), + (u_long)ntohl(m1->count), + m1->mode, + m1->version, + (u_long)ntohl(m1->restr), + (u_long)ntohl(m1->avg_int), + (u_long)ntohl(m1->last_int)); + m1++; + items--; + } + } else if (itemsize == sizeof(struct info_monitor) || + itemsize == v4sizeof(struct info_monitor)) { + + ml = (void *) struct_star; + fprintf(fp, + " address port count mode ver rstr avgint lstint\n"); + fprintf(fp, + "===============================================================================\n"); + while (items > 0) { + SET_ADDR(dstadr, ml->v6_flag, ml->addr, ml->addr6); + if ((pcmd->nargs == 0) || + ((pcmd->argval->ival == 6) && (ml->v6_flag != 0)) || + ((pcmd->argval->ival == 4) && (ml->v6_flag == 0))) + fprintf(fp, + "%-25.25s %5u %9lu %4u %2u %9lx %9lu %9lu\n", + nntohost(&dstadr), + ntohs(ml->port), + (u_long)ntohl(ml->count), + ml->mode, + ml->version, + (u_long)ntohl(ml->restr), + (u_long)ntohl(ml->avg_int), + (u_long)ntohl(ml->last_int)); + ml++; + items--; + } + } else if (itemsize == sizeof(struct old_info_monitor)) { + + oml = (void *)struct_star; + fprintf(fp, + " address port count mode version lasttime firsttime\n"); + fprintf(fp, + "======================================================================\n"); + while (items > 0) { + SET_ADDR(dstadr, oml->v6_flag, oml->addr, oml->addr6); + fprintf(fp, "%-20.20s %5u %9lu %4u %3u %9lu %9lu\n", + nntohost(&dstadr), + ntohs(oml->port), + (u_long)ntohl(oml->count), + oml->mode, + oml->version, + (u_long)ntohl(oml->lasttime), + (u_long)ntohl(oml->firsttime)); + oml++; + items--; + } + } else { + /* issue warning according to new info_monitor size */ + checkitemsize(itemsize, sizeof(struct info_monitor)); + } +} + + +/* + * Mapping between command line strings and stat reset flags + */ +struct statreset { + const char * const str; + const int flag; +} sreset[] = { + { "allpeers", RESET_FLAG_ALLPEERS }, + { "io", RESET_FLAG_IO }, + { "sys", RESET_FLAG_SYS }, + { "mem", RESET_FLAG_MEM }, + { "timer", RESET_FLAG_TIMER }, + { "auth", RESET_FLAG_AUTH }, + { "ctl", RESET_FLAG_CTL }, + { "", 0 } +}; + +/* + * reset - reset statistic counters + */ +static void +reset( + struct parse *pcmd, + FILE *fp + ) +{ + struct reset_flags rflags; + int items; + int itemsize; + char *dummy; + int i; + int res; + int err; + + err = 0; + rflags.flags = 0; + for (res = 0; res < pcmd->nargs; res++) { + for (i = 0; sreset[i].flag != 0; i++) { + if (STREQ(pcmd->argval[res].string, sreset[i].str)) + break; + } + if (sreset[i].flag == 0) { + fprintf(fp, "Flag %s unknown\n", + pcmd->argval[res].string); + err++; + } else { + rflags.flags |= sreset[i].flag; + } + } + rflags.flags = htonl(rflags.flags); + + if (err) { + (void) fprintf(fp, "Not done due to errors\n"); + return; + } + +again: + res = doquery(impl_ver, REQ_RESET_STATS, 1, 1, + sizeof(struct reset_flags), (char *)&rflags, &items, + &itemsize, &dummy, 0, sizeof(struct reset_flags)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res == 0) + (void) fprintf(fp, "done!\n"); + return; +} + + + +/* + * preset - reset stat counters for particular peers + */ +static void +preset( + struct parse *pcmd, + FILE *fp + ) +{ + /* 8 is the maximum number of peers which will fit in a packet */ + struct conf_unpeer *pl, plist[min(MAXARGS, 8)]; + int qitemlim; + int qitems; + int items; + int itemsize; + char *dummy; + int res; + int sendsize; + +again: + if (impl_ver == IMPL_XNTPD) + sendsize = sizeof(struct conf_unpeer); + else + sendsize = v4sizeof(struct conf_unpeer); + + qitemlim = min(pcmd->nargs, COUNTOF(plist)); + for (qitems = 0, pl = plist; qitems < qitemlim; qitems++) { + if (IS_IPV4(&pcmd->argval[qitems].netnum)) { + pl->peeraddr = NSRCADR(&pcmd->argval[qitems].netnum); + if (impl_ver == IMPL_XNTPD) + pl->v6_flag = 0; + } else { + if (impl_ver == IMPL_XNTPD_OLD) { + fprintf(stderr, + "***Server doesn't understand IPv6 addresses\n"); + return; + } + pl->peeraddr6 = + SOCK_ADDR6(&pcmd->argval[qitems].netnum); + pl->v6_flag = 1; + } + pl = (void *)((char *)pl + sendsize); + } + + res = doquery(impl_ver, REQ_RESET_PEER, 1, qitems, + sendsize, (char *)plist, &items, + &itemsize, &dummy, 0, sizeof(struct conf_unpeer)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res == 0) + (void) fprintf(fp, "done!\n"); +} + + +/* + * readkeys - request the server to reread the keys file + */ +/*ARGSUSED*/ +static void +readkeys( + struct parse *pcmd, + FILE *fp + ) +{ + int items; + int itemsize; + char *dummy; + int res; + +again: + res = doquery(impl_ver, REQ_REREAD_KEYS, 1, 0, 0, (char *)0, + &items, &itemsize, &dummy, 0, sizeof(dummy)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res == 0) + (void) fprintf(fp, "done!\n"); + return; +} + + +/* + * trustkey - add some keys to the trusted key list + */ +static void +trustkey( + struct parse *pcmd, + FILE *fp + ) +{ + do_trustkey(pcmd, fp, REQ_TRUSTKEY); +} + + +/* + * untrustkey - remove some keys from the trusted key list + */ +static void +untrustkey( + struct parse *pcmd, + FILE *fp + ) +{ + do_trustkey(pcmd, fp, REQ_UNTRUSTKEY); +} + + +/* + * do_trustkey - do grunge work of adding/deleting keys + */ +static void +do_trustkey( + struct parse *pcmd, + FILE *fp, + int req + ) +{ + u_long keyids[MAXARGS]; + int i; + int items; + int itemsize; + char *dummy; + int ritems; + int res; + + ritems = 0; + for (i = 0; i < pcmd->nargs; i++) { + keyids[ritems++] = pcmd->argval[i].uval; + } + +again: + res = doquery(impl_ver, req, 1, ritems, sizeof(u_long), + (char *)keyids, &items, &itemsize, &dummy, 0, + sizeof(dummy)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res == 0) + (void) fprintf(fp, "done!\n"); + return; +} + + + +/* + * authinfo - obtain and print info about authentication + */ +/*ARGSUSED*/ +static void +authinfo( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_auth *ia; + int items; + int itemsize; + int res; + +again: + res = doquery(impl_ver, REQ_AUTHINFO, 0, 0, 0, NULL, &items, + &itemsize, (void *)&ia, 0, sizeof(*ia)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!check1item(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(*ia))) + return; + + fprintf(fp, "time since reset: %lu\n", + (u_long)ntohl(ia->timereset)); + fprintf(fp, "stored keys: %lu\n", + (u_long)ntohl(ia->numkeys)); + fprintf(fp, "free keys: %lu\n", + (u_long)ntohl(ia->numfreekeys)); + fprintf(fp, "key lookups: %lu\n", + (u_long)ntohl(ia->keylookups)); + fprintf(fp, "keys not found: %lu\n", + (u_long)ntohl(ia->keynotfound)); + fprintf(fp, "uncached keys: %lu\n", + (u_long)ntohl(ia->keyuncached)); + fprintf(fp, "encryptions: %lu\n", + (u_long)ntohl(ia->encryptions)); + fprintf(fp, "decryptions: %lu\n", + (u_long)ntohl(ia->decryptions)); + fprintf(fp, "expired keys: %lu\n", + (u_long)ntohl(ia->expired)); +} + + + +/* + * traps - obtain and print a list of traps + */ +/*ARGSUSED*/ +static void +traps( + struct parse *pcmd, + FILE *fp + ) +{ + int i; + struct info_trap *it; + sockaddr_u trap_addr, local_addr; + int items; + int itemsize; + int res; + +again: + res = doquery(impl_ver, REQ_TRAPS, 0, 0, 0, NULL, &items, + &itemsize, (void *)&it, 0, sizeof(*it)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!checkitems(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(struct info_trap)) && + !checkitemsize(itemsize, v4sizeof(struct info_trap))) + return; + + for (i = 0; i < items; i++ ) { + SET_ADDRS(trap_addr, local_addr, it, trap_address, local_address); + fprintf(fp, "%saddress %s, port %d\n", + (0 == i) + ? "" + : "\n", + stoa(&trap_addr), ntohs(it->trap_port)); + fprintf(fp, "interface: %s, ", + (0 == it->local_address) + ? "wildcard" + : stoa(&local_addr)); + if (ntohl(it->flags) & TRAP_CONFIGURED) + fprintf(fp, "configured\n"); + else if (ntohl(it->flags) & TRAP_NONPRIO) + fprintf(fp, "low priority\n"); + else + fprintf(fp, "normal priority\n"); + + fprintf(fp, "set for %ld secs, last set %ld secs ago\n", + (long)ntohl(it->origtime), + (long)ntohl(it->settime)); + fprintf(fp, "sequence %d, number of resets %ld\n", + ntohs(it->sequence), (long)ntohl(it->resets)); + } +} + + +/* + * addtrap - configure a trap + */ +static void +addtrap( + struct parse *pcmd, + FILE *fp + ) +{ + do_addclr_trap(pcmd, fp, REQ_ADD_TRAP); +} + + +/* + * clrtrap - clear a trap from the server + */ +static void +clrtrap( + struct parse *pcmd, + FILE *fp + ) +{ + do_addclr_trap(pcmd, fp, REQ_CLR_TRAP); +} + + +/* + * do_addclr_trap - do grunge work of adding/deleting traps + */ +static void +do_addclr_trap( + struct parse *pcmd, + FILE *fp, + int req + ) +{ + struct conf_trap ctrap; + int items; + int itemsize; + char *dummy; + int res; + int sendsize; + +again: + if (impl_ver == IMPL_XNTPD) + sendsize = sizeof(struct conf_trap); + else + sendsize = v4sizeof(struct conf_trap); + + if (IS_IPV4(&pcmd->argval[0].netnum)) { + ctrap.trap_address = NSRCADR(&pcmd->argval[0].netnum); + if (impl_ver == IMPL_XNTPD) + ctrap.v6_flag = 0; + } else { + if (impl_ver == IMPL_XNTPD_OLD) { + fprintf(stderr, + "***Server doesn't understand IPv6 addresses\n"); + return; + } + ctrap.trap_address6 = SOCK_ADDR6(&pcmd->argval[0].netnum); + ctrap.v6_flag = 1; + } + ctrap.local_address = 0; + ctrap.trap_port = htons(TRAPPORT); + ctrap.unused = 0; + + if (pcmd->nargs > 1) { + ctrap.trap_port = htons((u_short)pcmd->argval[1].uval); + if (pcmd->nargs > 2) { + if (AF(&pcmd->argval[2].netnum) != + AF(&pcmd->argval[0].netnum)) { + fprintf(stderr, + "***Cannot mix IPv4 and IPv6 addresses\n"); + return; + } + if (IS_IPV4(&pcmd->argval[2].netnum)) + ctrap.local_address = NSRCADR(&pcmd->argval[2].netnum); + else + ctrap.local_address6 = SOCK_ADDR6(&pcmd->argval[2].netnum); + } + } + + res = doquery(impl_ver, req, 1, 1, sendsize, + (char *)&ctrap, &items, &itemsize, &dummy, 0, + sizeof(struct conf_trap)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res == 0) + (void) fprintf(fp, "done!\n"); + return; +} + + + +/* + * requestkey - change the server's request key (a dangerous request) + */ +static void +requestkey( + struct parse *pcmd, + FILE *fp + ) +{ + do_changekey(pcmd, fp, REQ_REQUEST_KEY); +} + + +/* + * controlkey - change the server's control key + */ +static void +controlkey( + struct parse *pcmd, + FILE *fp + ) +{ + do_changekey(pcmd, fp, REQ_CONTROL_KEY); +} + + + +/* + * do_changekey - do grunge work of changing keys + */ +static void +do_changekey( + struct parse *pcmd, + FILE *fp, + int req + ) +{ + u_long key; + int items; + int itemsize; + char *dummy; + int res; + + + key = htonl((u_int32)pcmd->argval[0].uval); + +again: + res = doquery(impl_ver, req, 1, 1, sizeof(u_int32), + (char *)&key, &items, &itemsize, &dummy, 0, + sizeof(dummy)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res == 0) + (void) fprintf(fp, "done!\n"); + return; +} + + + +/* + * ctlstats - obtain and print info about authentication + */ +/*ARGSUSED*/ +static void +ctlstats( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_control *ic; + int items; + int itemsize; + int res; + +again: + res = doquery(impl_ver, REQ_GET_CTLSTATS, 0, 0, 0, NULL, &items, + &itemsize, (void *)&ic, 0, sizeof(*ic)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!check1item(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(*ic))) + return; + + fprintf(fp, "time since reset: %lu\n", + (u_long)ntohl(ic->ctltimereset)); + fprintf(fp, "requests received: %lu\n", + (u_long)ntohl(ic->numctlreq)); + fprintf(fp, "responses sent: %lu\n", + (u_long)ntohl(ic->numctlresponses)); + fprintf(fp, "fragments sent: %lu\n", + (u_long)ntohl(ic->numctlfrags)); + fprintf(fp, "async messages sent: %lu\n", + (u_long)ntohl(ic->numasyncmsgs)); + fprintf(fp, "error msgs sent: %lu\n", + (u_long)ntohl(ic->numctlerrors)); + fprintf(fp, "total bad pkts: %lu\n", + (u_long)ntohl(ic->numctlbadpkts)); + fprintf(fp, "packet too short: %lu\n", + (u_long)ntohl(ic->numctltooshort)); + fprintf(fp, "response on input: %lu\n", + (u_long)ntohl(ic->numctlinputresp)); + fprintf(fp, "fragment on input: %lu\n", + (u_long)ntohl(ic->numctlinputfrag)); + fprintf(fp, "error set on input: %lu\n", + (u_long)ntohl(ic->numctlinputerr)); + fprintf(fp, "bad offset on input: %lu\n", + (u_long)ntohl(ic->numctlbadoffset)); + fprintf(fp, "bad version packets: %lu\n", + (u_long)ntohl(ic->numctlbadversion)); + fprintf(fp, "data in pkt too short: %lu\n", + (u_long)ntohl(ic->numctldatatooshort)); + fprintf(fp, "unknown op codes: %lu\n", + (u_long)ntohl(ic->numctlbadop)); +} + + +/* + * clockstat - get and print clock status information + */ +static void +clockstat( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_clock *cl; + /* 8 is the maximum number of clocks which will fit in a packet */ + u_long clist[min(MAXARGS, 8)]; + int qitemlim; + int qitems; + int items; + int itemsize; + int res; + l_fp ts; + struct clktype *clk; + + qitemlim = min(pcmd->nargs, COUNTOF(clist)); + for (qitems = 0; qitems < qitemlim; qitems++) + clist[qitems] = NSRCADR(&pcmd->argval[qitems].netnum); + +again: + res = doquery(impl_ver, REQ_GET_CLOCKINFO, 0, qitems, + sizeof(u_int32), (char *)clist, &items, + &itemsize, (void *)&cl, 0, sizeof(struct info_clock)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!checkitems(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(struct info_clock))) + return; + + while (items-- > 0) { + (void) fprintf(fp, "clock address: %s\n", + numtoa(cl->clockadr)); + for (clk = clktypes; clk->code >= 0; clk++) + if (clk->code == cl->type) + break; + if (clk->code >= 0) + (void) fprintf(fp, "clock type: %s\n", + clk->clocktype); + else + (void) fprintf(fp, "clock type: unknown type (%d)\n", + cl->type); + (void) fprintf(fp, "last event: %d\n", + cl->lastevent); + (void) fprintf(fp, "current status: %d\n", + cl->currentstatus); + (void) fprintf(fp, "number of polls: %lu\n", + (u_long)ntohl(cl->polls)); + (void) fprintf(fp, "no response to poll: %lu\n", + (u_long)ntohl(cl->noresponse)); + (void) fprintf(fp, "bad format responses: %lu\n", + (u_long)ntohl(cl->badformat)); + (void) fprintf(fp, "bad data responses: %lu\n", + (u_long)ntohl(cl->baddata)); + (void) fprintf(fp, "running time: %lu\n", + (u_long)ntohl(cl->timestarted)); + NTOHL_FP(&cl->fudgetime1, &ts); + (void) fprintf(fp, "fudge time 1: %s\n", + lfptoa(&ts, 6)); + NTOHL_FP(&cl->fudgetime2, &ts); + (void) fprintf(fp, "fudge time 2: %s\n", + lfptoa(&ts, 6)); + (void) fprintf(fp, "stratum: %ld\n", + (u_long)ntohl(cl->fudgeval1)); + (void) fprintf(fp, "reference ID: %s\n", + refid_string(ntohl(cl->fudgeval2), 0)); + (void) fprintf(fp, "fudge flags: 0x%x\n", + cl->flags); + + if (items > 0) + (void) fprintf(fp, "\n"); + cl++; + } +} + + +/* + * fudge - set clock fudge factors + */ +static void +fudge( + struct parse *pcmd, + FILE *fp + ) +{ + struct conf_fudge fudgedata; + int items; + int itemsize; + char *dummy; + l_fp ts; + int res; + long val; + u_long u_val; + int err; + + + err = 0; + ZERO(fudgedata); + fudgedata.clockadr = NSRCADR(&pcmd->argval[0].netnum); + + if (STREQ(pcmd->argval[1].string, "time1")) { + fudgedata.which = htonl(FUDGE_TIME1); + if (!atolfp(pcmd->argval[2].string, &ts)) + err = 1; + else + NTOHL_FP(&ts, &fudgedata.fudgetime); + } else if (STREQ(pcmd->argval[1].string, "time2")) { + fudgedata.which = htonl(FUDGE_TIME2); + if (!atolfp(pcmd->argval[2].string, &ts)) + err = 1; + else + NTOHL_FP(&ts, &fudgedata.fudgetime); + } else if (STREQ(pcmd->argval[1].string, "val1")) { + fudgedata.which = htonl(FUDGE_VAL1); + if (!atoint(pcmd->argval[2].string, &val)) + err = 1; + else + fudgedata.fudgeval_flags = htonl(val); + } else if (STREQ(pcmd->argval[1].string, "val2")) { + fudgedata.which = htonl(FUDGE_VAL2); + if (!atoint(pcmd->argval[2].string, &val)) + err = 1; + else + fudgedata.fudgeval_flags = htonl((u_int32)val); + } else if (STREQ(pcmd->argval[1].string, "flags")) { + fudgedata.which = htonl(FUDGE_FLAGS); + if (!hextoint(pcmd->argval[2].string, &u_val)) + err = 1; + else + fudgedata.fudgeval_flags = htonl((u_int32)(u_val & 0xf)); + } else { + (void) fprintf(stderr, "What fudge is %s?\n", + pcmd->argval[1].string); + return; + } + + if (err) { + (void) fprintf(stderr, "Unknown fudge parameter %s\n", + pcmd->argval[2].string); + return; + } + +again: + res = doquery(impl_ver, REQ_SET_CLKFUDGE, 1, 1, + sizeof(struct conf_fudge), (char *)&fudgedata, &items, + &itemsize, &dummy, 0, sizeof(dummy)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res == 0) + (void) fprintf(fp, "done!\n"); + return; +} + +/* + * clkbug - get and print clock debugging information + */ +static void +clkbug( + struct parse *pcmd, + FILE *fp + ) +{ + register int i; + register int n; + register u_int32 s; + struct info_clkbug *cl; + /* 8 is the maximum number of clocks which will fit in a packet */ + u_long clist[min(MAXARGS, 8)]; + u_int32 ltemp; + int qitemlim; + int qitems; + int items; + int itemsize; + int res; + int needsp; + l_fp ts; + + qitemlim = min(pcmd->nargs, COUNTOF(clist)); + for (qitems = 0; qitems < qitemlim; qitems++) + clist[qitems] = NSRCADR(&pcmd->argval[qitems].netnum); + +again: + res = doquery(impl_ver, REQ_GET_CLKBUGINFO, 0, qitems, + sizeof(u_int32), (char *)clist, &items, + &itemsize, (void *)&cl, 0, sizeof(struct info_clkbug)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + + if (!checkitems(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(struct info_clkbug))) + return; + + while (items-- > 0) { + (void) fprintf(fp, "clock address: %s\n", + numtoa(cl->clockadr)); + n = (int)cl->nvalues; + (void) fprintf(fp, "values: %d", n); + s = ntohs(cl->svalues); + if (n > NUMCBUGVALUES) + n = NUMCBUGVALUES; + for (i = 0; i < n; i++) { + ltemp = ntohl(cl->values[i]); + ltemp &= 0xffffffff; /* HMS: This does nothing now */ + if ((i & 0x3) == 0) + (void) fprintf(fp, "\n"); + if (s & (1 << i)) + (void) fprintf(fp, "%12ld", (u_long)ltemp); + else + (void) fprintf(fp, "%12lu", (u_long)ltemp); + } + (void) fprintf(fp, "\n"); + + n = (int)cl->ntimes; + (void) fprintf(fp, "times: %d", n); + s = ntohl(cl->stimes); + if (n > NUMCBUGTIMES) + n = NUMCBUGTIMES; + needsp = 0; + for (i = 0; i < n; i++) { + if ((i & 0x1) == 0) { + (void) fprintf(fp, "\n"); + } else { + for (;needsp > 0; needsp--) + putc(' ', fp); + } + NTOHL_FP(&cl->times[i], &ts); + if (s & (1 << i)) { + (void) fprintf(fp, "%17s", + lfptoa(&ts, 6)); + needsp = 22; + } else { + (void) fprintf(fp, "%37s", + uglydate(&ts)); + needsp = 2; + } + } + (void) fprintf(fp, "\n"); + if (items > 0) { + cl++; + (void) fprintf(fp, "\n"); + } + } +} + + +/* + * kerninfo - display the kernel pll/pps variables + */ +static void +kerninfo( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_kernel *ik; + int items; + int itemsize; + int res; + unsigned status; + double tscale = 1e-6; + +again: + res = doquery(impl_ver, REQ_GET_KERNEL, 0, 0, 0, (char *)NULL, + &items, &itemsize, (void *)&ik, 0, + sizeof(struct info_kernel)); + + if (res == INFO_ERR_IMPL && impl_ver == IMPL_XNTPD) { + impl_ver = IMPL_XNTPD_OLD; + goto again; + } + + if (res != 0) + return; + if (!check1item(items, fp)) + return; + if (!checkitemsize(itemsize, sizeof(struct info_kernel))) + return; + + status = ntohs(ik->status) & 0xffff; + /* + * pll variables. We know more than we should about the NANO bit. + */ +#ifdef STA_NANO + if (status & STA_NANO) + tscale = 1e-9; +#endif + (void)fprintf(fp, "pll offset: %g s\n", + (int32)ntohl(ik->offset) * tscale); + (void)fprintf(fp, "pll frequency: %s ppm\n", + fptoa((s_fp)ntohl(ik->freq), 3)); + (void)fprintf(fp, "maximum error: %g s\n", + (u_long)ntohl(ik->maxerror) * tscale); + (void)fprintf(fp, "estimated error: %g s\n", + (u_long)ntohl(ik->esterror) * tscale); + (void)fprintf(fp, "status: %04x ", status); +#ifdef STA_PLL + if (status & STA_PLL) (void)fprintf(fp, " pll"); +#endif +#ifdef STA_PPSFREQ + if (status & STA_PPSFREQ) (void)fprintf(fp, " ppsfreq"); +#endif +#ifdef STA_PPSTIME + if (status & STA_PPSTIME) (void)fprintf(fp, " ppstime"); +#endif +#ifdef STA_FLL + if (status & STA_FLL) (void)fprintf(fp, " fll"); +#endif +#ifdef STA_INS + if (status & STA_INS) (void)fprintf(fp, " ins"); +#endif +#ifdef STA_DEL + if (status & STA_DEL) (void)fprintf(fp, " del"); +#endif +#ifdef STA_UNSYNC + if (status & STA_UNSYNC) (void)fprintf(fp, " unsync"); +#endif +#ifdef STA_FREQHOLD + if (status & STA_FREQHOLD) (void)fprintf(fp, " freqhold"); +#endif +#ifdef STA_PPSSIGNAL + if (status & STA_PPSSIGNAL) (void)fprintf(fp, " ppssignal"); +#endif +#ifdef STA_PPSJITTER + if (status & STA_PPSJITTER) (void)fprintf(fp, " ppsjitter"); +#endif +#ifdef STA_PPSWANDER + if (status & STA_PPSWANDER) (void)fprintf(fp, " ppswander"); +#endif +#ifdef STA_PPSERROR + if (status & STA_PPSERROR) (void)fprintf(fp, " ppserror"); +#endif +#ifdef STA_CLOCKERR + if (status & STA_CLOCKERR) (void)fprintf(fp, " clockerr"); +#endif +#ifdef STA_NANO + if (status & STA_NANO) (void)fprintf(fp, " nano"); +#endif +#ifdef STA_MODE + if (status & STA_MODE) (void)fprintf(fp, " mode=fll"); +#endif +#ifdef STA_CLK + if (status & STA_CLK) (void)fprintf(fp, " src=B"); +#endif + (void)fprintf(fp, "\n"); + (void)fprintf(fp, "pll time constant: %ld\n", + (u_long)ntohl(ik->constant)); + (void)fprintf(fp, "precision: %g s\n", + (u_long)ntohl(ik->precision) * tscale); + (void)fprintf(fp, "frequency tolerance: %s ppm\n", + fptoa((s_fp)ntohl(ik->tolerance), 0)); + + /* + * For backwards compatibility (ugh), we find the pps variables + * only if the shift member is nonzero. + */ + if (!ik->shift) + return; + + /* + * pps variables + */ + (void)fprintf(fp, "pps frequency: %s ppm\n", + fptoa((s_fp)ntohl(ik->ppsfreq), 3)); + (void)fprintf(fp, "pps stability: %s ppm\n", + fptoa((s_fp)ntohl(ik->stabil), 3)); + (void)fprintf(fp, "pps jitter: %g s\n", + (u_long)ntohl(ik->jitter) * tscale); + (void)fprintf(fp, "calibration interval: %d s\n", + 1 << ntohs(ik->shift)); + (void)fprintf(fp, "calibration cycles: %ld\n", + (u_long)ntohl(ik->calcnt)); + (void)fprintf(fp, "jitter exceeded: %ld\n", + (u_long)ntohl(ik->jitcnt)); + (void)fprintf(fp, "stability exceeded: %ld\n", + (u_long)ntohl(ik->stbcnt)); + (void)fprintf(fp, "calibration errors: %ld\n", + (u_long)ntohl(ik->errcnt)); +} + +#define IF_LIST_FMT "%2d %c %48s %c %c %12.12s %03lx %3lu %2lu %5lu %5lu %5lu %2lu %3lu %7lu\n" +#define IF_LIST_FMT_STR "%2s %c %48s %c %c %12.12s %3s %3s %2s %5s %5s %5s %2s %3s %7s\n" +#define IF_LIST_AFMT_STR " %48s %c\n" +#define IF_LIST_LABELS "#", 'A', "Address/Mask/Broadcast", 'T', 'E', "IF name", "Flg", "TL", "#M", "recv", "sent", "drop", "S", "PC", "uptime" +#define IF_LIST_LINE "==================================================================================================================\n" + +static void +iflist( + FILE *fp, + struct info_if_stats *ifs, + int items, + int itemsize, + int res + ) +{ + static char *actions = "?.+-"; + sockaddr_u saddr; + + if (res != 0) + return; + + if (!checkitems(items, fp)) + return; + + if (!checkitemsize(itemsize, sizeof(struct info_if_stats))) + return; + + fprintf(fp, IF_LIST_FMT_STR, IF_LIST_LABELS); + fprintf(fp, IF_LIST_LINE); + + while (items > 0) { + SET_ADDR(saddr, ntohl(ifs->v6_flag), + ifs->unaddr.addr.s_addr, ifs->unaddr.addr6); + fprintf(fp, IF_LIST_FMT, + ntohl(ifs->ifnum), + actions[(ifs->action >= 1 && ifs->action < 4) ? ifs->action : 0], + stoa((&saddr)), 'A', + ifs->ignore_packets ? 'D' : 'E', + ifs->name, + (u_long)ntohl(ifs->flags), + (u_long)ntohl(ifs->last_ttl), + (u_long)ntohl(ifs->num_mcast), + (u_long)ntohl(ifs->received), + (u_long)ntohl(ifs->sent), + (u_long)ntohl(ifs->notsent), + (u_long)ntohl(ifs->scopeid), + (u_long)ntohl(ifs->peercnt), + (u_long)ntohl(ifs->uptime)); + + SET_ADDR(saddr, ntohl(ifs->v6_flag), + ifs->unmask.addr.s_addr, ifs->unmask.addr6); + fprintf(fp, IF_LIST_AFMT_STR, stoa(&saddr), 'M'); + + if (!ntohl(ifs->v6_flag) && ntohl(ifs->flags) & (INT_BCASTOPEN)) { + SET_ADDR(saddr, ntohl(ifs->v6_flag), + ifs->unbcast.addr.s_addr, ifs->unbcast.addr6); + fprintf(fp, IF_LIST_AFMT_STR, stoa(&saddr), 'B'); + + } + + ifs++; + items--; + } +} + +/*ARGSUSED*/ +static void +get_if_stats( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_if_stats *ifs; + int items; + int itemsize; + int res; + + res = doquery(impl_ver, REQ_IF_STATS, 1, 0, 0, (char *)NULL, &items, + &itemsize, (void *)&ifs, 0, + sizeof(struct info_if_stats)); + iflist(fp, ifs, items, itemsize, res); +} + +/*ARGSUSED*/ +static void +do_if_reload( + struct parse *pcmd, + FILE *fp + ) +{ + struct info_if_stats *ifs; + int items; + int itemsize; + int res; + + res = doquery(impl_ver, REQ_IF_RELOAD, 1, 0, 0, (char *)NULL, &items, + &itemsize, (void *)&ifs, 0, + sizeof(struct info_if_stats)); + iflist(fp, ifs, items, itemsize, res); +} |