summaryrefslogtreecommitdiffstats
path: root/contrib/ntp/ntpq
diff options
context:
space:
mode:
authorroberto <roberto@FreeBSD.org>2008-08-17 17:37:33 +0000
committerroberto <roberto@FreeBSD.org>2008-08-17 17:37:33 +0000
commit4ded1c1fa0bc21c61f91a2dbe864835986745121 (patch)
tree16d100fbc9dae63888d48b464e471ba0e5065193 /contrib/ntp/ntpq
parent8b5a86d4fda08a9c68231415812edcb26be52f79 (diff)
downloadFreeBSD-src-4ded1c1fa0bc21c61f91a2dbe864835986745121.zip
FreeBSD-src-4ded1c1fa0bc21c61f91a2dbe864835986745121.tar.gz
Flatten the dist and various 4.n.n trees in preparation of future ntp imports.
Diffstat (limited to 'contrib/ntp/ntpq')
-rw-r--r--contrib/ntp/ntpq/Makefile.am21
-rw-r--r--contrib/ntp/ntpq/Makefile.in463
-rw-r--r--contrib/ntp/ntpq/README6
-rw-r--r--contrib/ntp/ntpq/ntpq.c3228
-rw-r--r--contrib/ntp/ntpq/ntpq.h90
-rw-r--r--contrib/ntp/ntpq/ntpq_ops.c1734
6 files changed, 0 insertions, 5542 deletions
diff --git a/contrib/ntp/ntpq/Makefile.am b/contrib/ntp/ntpq/Makefile.am
deleted file mode 100644
index 0bd05fc..0000000
--- a/contrib/ntp/ntpq/Makefile.am
+++ /dev/null
@@ -1,21 +0,0 @@
-#AUTOMAKE_OPTIONS = ../util/ansi2knr no-dependencies
-AUTOMAKE_OPTIONS = ../util/ansi2knr
-bin_PROGRAMS = ntpq
-INCLUDES = -I$(top_srcdir)/include
-# LDADD might need RESLIB and ADJLIB
-ntpq_LDADD = version.o ../libntp/libntp.a @READLINE_LIBS@
-DISTCLEANFILES = .version version.c
-noinst_HEADERS = ntpq.h
-#EXTRA_DIST = ntpq.mak
-ETAGS_ARGS = Makefile.am
-
-ntpq_SOURCES = ntpq.c ntpq_ops.c
-
-$(PROGRAMS): $(LDADD)
-
-../libntp/libntp.a:
- cd ../libntp && $(MAKE)
-
-version.o: $(ntpq_OBJECTS) ../libntp/libntp.a Makefile $(top_srcdir)/version
- env CSET=`cat $(top_srcdir)/version` $(top_builddir)/scripts/mkver ntpq
- $(COMPILE) -c version.c
diff --git a/contrib/ntp/ntpq/Makefile.in b/contrib/ntp/ntpq/Makefile.in
deleted file mode 100644
index 7ddf4d3..0000000
--- a/contrib/ntp/ntpq/Makefile.in
+++ /dev/null
@@ -1,463 +0,0 @@
-# Makefile.in generated by automake 1.7.7 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-# 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@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-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@
-target_triplet = @target@
-ACLOCAL = @ACLOCAL@
-AMDEP_FALSE = @AMDEP_FALSE@
-AMDEP_TRUE = @AMDEP_TRUE@
-AMTAR = @AMTAR@
-ARLIB_DIR = @ARLIB_DIR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CHUTEST = @CHUTEST@
-CLKTEST = @CLKTEST@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DCFD = @DCFD@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EF_LIBS = @EF_LIBS@
-EF_PROGS = @EF_PROGS@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LCRYPTO = @LCRYPTO@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBPARSE = @LIBPARSE@
-LIBS = @LIBS@
-LN_S = @LN_S@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MAKE_ADJTIMED = @MAKE_ADJTIMED@
-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_NTPTIME = @MAKE_NTPTIME@
-MAKE_NTP_KEYGEN = @MAKE_NTP_KEYGEN@
-MAKE_PARSEKMODULE = @MAKE_PARSEKMODULE@
-MAKE_SNTP = @MAKE_SNTP@
-MAKE_TICKADJ = @MAKE_TICKADJ@
-MAKE_TIMETRIM = @MAKE_TIMETRIM@
-OBJEXT = @OBJEXT@
-OPENSSL = @OPENSSL@
-OPENSSL_INC = @OPENSSL_INC@
-OPENSSL_LIB = @OPENSSL_LIB@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_PERL = @PATH_PERL@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PATH_SH = @PATH_SH@
-PROPDELAY = @PROPDELAY@
-RANLIB = @RANLIB@
-READLINE_LIBS = @READLINE_LIBS@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-TESTDCF = @TESTDCF@
-U = @U@
-VERSION = @VERSION@
-ac_ct_CC = @ac_ct_CC@
-ac_ct_RANLIB = @ac_ct_RANLIB@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
-am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host = @host@
-host_alias = @host_alias@
-host_cpu = @host_cpu@
-host_os = @host_os@
-host_vendor = @host_vendor@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-subdirs = @subdirs@
-sysconfdir = @sysconfdir@
-target = @target@
-target_alias = @target_alias@
-target_cpu = @target_cpu@
-target_os = @target_os@
-target_vendor = @target_vendor@
-
-#AUTOMAKE_OPTIONS = ../util/ansi2knr no-dependencies
-AUTOMAKE_OPTIONS = ../util/ansi2knr
-bin_PROGRAMS = ntpq
-INCLUDES = -I$(top_srcdir)/include
-# LDADD might need RESLIB and ADJLIB
-ntpq_LDADD = version.o ../libntp/libntp.a @READLINE_LIBS@
-DISTCLEANFILES = .version version.c
-noinst_HEADERS = ntpq.h
-#EXTRA_DIST = ntpq.mak
-ETAGS_ARGS = Makefile.am
-
-ntpq_SOURCES = ntpq.c ntpq_ops.c
-subdir = ntpq
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES =
-bin_PROGRAMS = ntpq$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS)
-
-am_ntpq_OBJECTS = ntpq$U.$(OBJEXT) ntpq_ops$U.$(OBJEXT)
-ntpq_OBJECTS = $(am_ntpq_OBJECTS)
-ntpq_DEPENDENCIES = version.o ../libntp/libntp.a
-ntpq_LDFLAGS =
-
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/ntpq$U.Po ./$(DEPDIR)/ntpq_ops$U.Po
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
- $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-DIST_SOURCES = $(ntpq_SOURCES)
-HEADERS = $(noinst_HEADERS)
-
-DIST_COMMON = README $(noinst_HEADERS) $(srcdir)/Makefile.in \
- Makefile.am
-SOURCES = $(ntpq_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && \
- $(AUTOMAKE) --gnu ntpq/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-install-binPROGRAMS: $(bin_PROGRAMS)
- @$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(bindir)
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- if test -f $$p \
- ; then \
- f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
- echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \
- $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f || exit 1; \
- else :; fi; \
- done
-
-uninstall-binPROGRAMS:
- @$(NORMAL_UNINSTALL)
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
- echo " rm -f $(DESTDIR)$(bindir)/$$f"; \
- rm -f $(DESTDIR)$(bindir)/$$f; \
- done
-
-clean-binPROGRAMS:
- -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
-ntpq$(EXEEXT): $(ntpq_OBJECTS) $(ntpq_DEPENDENCIES)
- @rm -f ntpq$(EXEEXT)
- $(LINK) $(ntpq_LDFLAGS) $(ntpq_OBJECTS) $(ntpq_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
- -rm -f *.tab.c
-
-ANSI2KNR = ../util/ansi2knr
-../util/ansi2knr:
- cd ../util && $(MAKE) $(AM_MAKEFLAGS) ansi2knr
-
-mostlyclean-kr:
- -test "$U" = "" || rm -f *_.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntpq$U.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ntpq_ops$U.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \
-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@ fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$<
-
-.c.obj:
-@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \
-@am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \
-@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \
-@am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \
-@am__fastdepCC_TRUE@ fi
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`
-ntpq_.c: ntpq.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/ntpq.c; then echo $(srcdir)/ntpq.c; else echo ntpq.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-ntpq_ops_.c: ntpq_ops.c $(ANSI2KNR)
- $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/ntpq_ops.c; then echo $(srcdir)/ntpq_ops.c; else echo ntpq_ops.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
-ntpq_.$(OBJEXT) ntpq_ops_.$(OBJEXT) : $(ANSI2KNR)
-uninstall-info-am:
-
-ETAGS = etags
-ETAGSFLAGS =
-
-CTAGS = ctags
-CTAGSFLAGS =
-
-tags: TAGS
-
-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; } \
- END { for (i in files) print i; }'`; \
- mkid -fID $$unique
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- 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; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$tags$$unique" \
- || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique
-
-ctags: CTAGS
-CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- 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; } \
- END { for (i in files) print i; }'`; \
- test -z "$(CTAGS_ARGS)$$tags$$unique" \
- || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
- $$tags $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
- @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
- topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
- list='$(DISTFILES)'; for file in $$list; do \
- case $$file in \
- $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
- $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
- esac; \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test "$$dir" != "$$file" && test "$$dir" != "."; then \
- dir="/$$dir"; \
- $(mkinstalldirs) "$(distdir)$$dir"; \
- else \
- dir=''; \
- fi; \
- if test -d $$d/$$file; then \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
- fi; \
- cp -pR $$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: check-am
-all-am: Makefile $(PROGRAMS) $(HEADERS)
-
-installdirs:
- $(mkinstalldirs) $(DESTDIR)$(bindir)
-install: 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_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -rm -f $(CONFIG_CLEAN_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."
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-generic 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:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am: install-binPROGRAMS
-
-install-info: install-info-am
-
-install-man:
-
-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-kr
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS uninstall-info-am
-
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
- clean-generic ctags distclean distclean-compile \
- distclean-generic distclean-tags distdir dvi dvi-am info \
- info-am install install-am install-binPROGRAMS install-data \
- install-data-am install-exec install-exec-am install-info \
- install-info-am install-man install-strip installcheck \
- installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-kr pdf pdf-am ps ps-am tags \
- uninstall uninstall-am uninstall-binPROGRAMS uninstall-info-am
-
-
-$(PROGRAMS): $(LDADD)
-
-../libntp/libntp.a:
- cd ../libntp && $(MAKE)
-
-version.o: $(ntpq_OBJECTS) ../libntp/libntp.a Makefile $(top_srcdir)/version
- env CSET=`cat $(top_srcdir)/version` $(top_builddir)/scripts/mkver ntpq
- $(COMPILE) -c version.c
-# 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/contrib/ntp/ntpq/README b/contrib/ntp/ntpq/README
deleted file mode 100644
index d280f74..0000000
--- a/contrib/ntp/ntpq/README
+++ /dev/null
@@ -1,6 +0,0 @@
-README file for directory ./ntpq of the NTP Version 4 distribution
-
-This directory contains the sources for the ntpq 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/contrib/ntp/ntpq/ntpq.c b/contrib/ntp/ntpq/ntpq.c
deleted file mode 100644
index bc12725..0000000
--- a/contrib/ntp/ntpq/ntpq.c
+++ /dev/null
@@ -1,3228 +0,0 @@
-/*
- * ntpq - query an NTP server using mode 6 commands
- */
-
-#include <stdio.h>
-
-#include "ntpq.h"
-#include "ntp_unixtime.h"
-#include "ntp_calendar.h"
-#include "ntp_io.h"
-#include "ntp_select.h"
-#include "ntp_stdlib.h"
-/* Don't include ISC's version of IPv6 variables and structures */
-#define ISC_IPV6_H 1
-#include "isc/net.h"
-#include "isc/result.h"
-
-#include <ctype.h>
-#include <signal.h>
-#include <setjmp.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <netdb.h>
-#ifdef SYS_WINNT
-# include <io.h>
-#else
-#define closesocket close
-#endif /* SYS_WINNT */
-
-#if defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDIT)
-# include <readline/readline.h>
-# include <readline/history.h>
-#endif /* HAVE_LIBREADLINE || HAVE_LIBEDIT */
-
-#ifdef SYS_VXWORKS
-/* vxWorks needs mode flag -casey*/
-#define open(name, flags) open(name, flags, 0777)
-#define SERVER_PORT_NUM 123
-#endif
-
-/*
- * Because we potentially understand a lot of commands we will run
- * interactive if connected to a terminal.
- */
-int interactive = 0; /* set to 1 when we should prompt */
-const char *prompt = "ntpq> "; /* prompt to ask him about */
-
-
-/*
- * Keyid used for authenticated requests. Obtained on the fly.
- */
-u_long info_auth_keyid = 0;
-
-/*
- * Type of key md5
- */
-#define KEY_TYPE_MD5 4
-
-static int info_auth_keytype = KEY_TYPE_MD5; /* MD5 */
-u_long current_time; /* needed by authkeys; not used */
-
-/*
- * Flag which indicates we should always send authenticated requests
- */
-int always_auth = 0;
-
-/*
- * Flag which indicates raw mode output.
- */
-int rawmode = 0;
-
-/*
- * Packet version number we use
- */
-u_char pktversion = NTP_OLDVERSION + 1;
-
-/*
- * Don't jump if no set jmp.
- */
-volatile int jump = 0;
-
-/*
- * Format values
- */
-#define PADDING 0
-#define TS 1 /* time stamp */
-#define FL 2 /* l_fp type value */
-#define FU 3 /* u_fp type value */
-#define FS 4 /* s_fp type value */
-#define UI 5 /* unsigned integer value */
-#define SI 6 /* signed integer value */
-#define HA 7 /* host address */
-#define NA 8 /* network address */
-#define ST 9 /* string value */
-#define RF 10 /* refid (sometimes string, sometimes not) */
-#define LP 11 /* leap (print in binary) */
-#define OC 12 /* integer, print in octal */
-#define MD 13 /* mode */
-#define AR 14 /* array of times */
-#define FX 15 /* test flags */
-#define EOV 255 /* end of table */
-
-
-/*
- * System variable values. The array can be indexed by
- * the variable index to find the textual name.
- */
-struct ctl_var sys_var[] = {
- { 0, PADDING, "" }, /* 0 */
- { CS_LEAP, LP, "leap" }, /* 1 */
- { CS_STRATUM, UI, "stratum" }, /* 2 */
- { CS_PRECISION, SI, "precision" }, /* 3 */
- { CS_ROOTDELAY, FS, "rootdelay" }, /* 4 */
- { CS_ROOTDISPERSION, FU, "rootdispersion" }, /* 5 */
- { CS_REFID, RF, "refid" }, /* 6 */
- { CS_REFTIME, TS, "reftime" }, /* 7 */
- { CS_POLL, UI, "poll" }, /* 8 */
- { CS_PEERID, UI, "peer" }, /* 9 */
- { CS_STATE, UI, "state" }, /* 10 */
- { CS_OFFSET, FL, "offset" }, /* 11 */
- { CS_DRIFT, FS, "frequency" }, /* 12 */
- { CS_JITTER, FU, "jitter" }, /* 13 */
- { CS_CLOCK, TS, "clock" }, /* 14 */
- { CS_PROCESSOR, ST, "processor" }, /* 15 */
- { CS_SYSTEM, ST, "system" }, /* 16 */
- { CS_VERSION, ST, "version" }, /* 17 */
- { CS_STABIL, FS, "stability" }, /* 18 */
- { CS_VARLIST, ST, "sys_var_list" }, /* 19 */
- { 0, EOV, "" }
-};
-
-
-/*
- * Peer variable list
- */
-struct ctl_var peer_var[] = {
- { 0, PADDING, "" }, /* 0 */
- { CP_CONFIG, UI, "config" }, /* 1 */
- { CP_AUTHENABLE, UI, "authenable" }, /* 2 */
- { CP_AUTHENTIC, UI, "authentic" }, /* 3 */
- { CP_SRCADR, HA, "srcadr" }, /* 4 */
- { CP_SRCPORT, UI, "srcport" }, /* 5 */
- { CP_DSTADR, NA, "dstadr" }, /* 6 */
- { CP_DSTPORT, UI, "dstport" }, /* 7 */
- { CP_LEAP, LP, "leap" }, /* 8 */
- { CP_HMODE, MD, "hmode" }, /* 9 */
- { CP_STRATUM, UI, "stratum" }, /* 10 */
- { CP_PPOLL, UI, "ppoll" }, /* 11 */
- { CP_HPOLL, UI, "hpoll" }, /* 12 */
- { CP_PRECISION, SI, "precision" }, /* 13 */
- { CP_ROOTDELAY, FS, "rootdelay" }, /* 14 */
- { CP_ROOTDISPERSION, FU, "rootdispersion" }, /* 15 */
- { CP_REFID, RF, "refid" }, /* 16 */
- { CP_REFTIME, TS, "reftime" }, /* 17 */
- { CP_ORG, TS, "org" }, /* 18 */
- { CP_REC, TS, "rec" }, /* 19 */
- { CP_XMT, TS, "xmt" }, /* 20 */
- { CP_REACH, OC, "reach" }, /* 21 */
- { CP_VALID, UI, "valid" }, /* 22 */
- { CP_TIMER, UI, "timer" }, /* 23 */
- { CP_DELAY, FS, "delay" }, /* 24 */
- { CP_OFFSET, FL, "offset" }, /* 25 */
- { CP_JITTER, FU, "jitter" }, /* 26 */
- { CP_DISPERSION, FU, "dispersion" }, /* 27 */
- { CP_KEYID, UI, "keyid" }, /* 28 */
- { CP_FILTDELAY, AR, "filtdelay" }, /* 29 */
- { CP_FILTOFFSET, AR, "filtoffset" }, /* 30 */
- { CP_PMODE, ST, "pmode" }, /* 31 */
- { CP_RECEIVED, UI, "received" }, /* 32 */
- { CP_SENT, UI, "sent" }, /* 33 */
- { CP_FILTERROR, AR, "filtdisp" }, /* 34 */
- { CP_FLASH, FX, "flash" }, /* 35 */
- { CP_TTL, UI, "ttl" }, /* 36 */
- /*
- * These are duplicate entries so that we can
- * process deviant version of the ntp protocol.
- */
- { CP_SRCADR, HA, "peeraddr" }, /* 4 */
- { CP_SRCPORT, UI, "peerport" }, /* 5 */
- { CP_PPOLL, UI, "peerpoll" }, /* 11 */
- { CP_HPOLL, UI, "hostpoll" }, /* 12 */
- { CP_FILTERROR, AR, "filterror" }, /* 34 */
- { 0, EOV, "" }
-};
-
-
-/*
- * Clock variable list
- */
-struct ctl_var clock_var[] = {
- { 0, PADDING, "" }, /* 0 */
- { CC_TYPE, UI, "type" }, /* 1 */
- { CC_TIMECODE, ST, "timecode" }, /* 2 */
- { CC_POLL, UI, "poll" }, /* 3 */
- { CC_NOREPLY, UI, "noreply" }, /* 4 */
- { CC_BADFORMAT, UI, "badformat" }, /* 5 */
- { CC_BADDATA, UI, "baddata" }, /* 6 */
- { CC_FUDGETIME1, FL, "fudgetime1" }, /* 7 */
- { CC_FUDGETIME2, FL, "fudgetime2" }, /* 8 */
- { CC_FUDGEVAL1, UI, "stratum" }, /* 9 */
- { CC_FUDGEVAL2, RF, "refid" }, /* 10 */
- { CC_FLAGS, UI, "flags" }, /* 11 */
- { CC_DEVICE, ST, "device" }, /* 12 */
- { 0, EOV, "" }
-};
-
-
-/*
- * flasher bits
- */
-static const char *tstflagnames[] = {
- "dup_pkt", /* TEST1 */
- "bogus_pkt", /* TEST2 */
- "proto_unsync", /* TEST3 */
- "no_access", /* TEST4 */
- "bad_auth", /* TEST5 */
- "peer_unsync", /* TEST6 */
- "peer_stratum", /* TEST7 */
- "root_bounds", /* TEST8 */
- "peer_bounds", /* TEST9 */
- "bad_autokey", /* TEST10 */
- "not_proventic" /* TEST11*/
-};
-
-
-int ntpqmain P((int, char **));
-/*
- * Built in command handler declarations
- */
-static int openhost P((const char *));
-static int sendpkt P((char *, int));
-static int getresponse P((int, int, u_short *, int *, char **, int));
-static int sendrequest P((int, int, int, int, char *));
-static char * tstflags P((u_long));
-static void getcmds P((void));
-static RETSIGTYPE abortcmd P((int));
-static void docmd P((const char *));
-static void tokenize P((const char *, char **, int *));
-static int findcmd P((char *, struct xcmd *, struct xcmd *, struct xcmd **));
-static int getarg P((char *, int, arg_v *));
-static int rtdatetolfp P((char *, l_fp *));
-static int decodearr P((char *, int *, l_fp *));
-static void help P((struct parse *, FILE *));
-#ifdef QSORT_USES_VOID_P
-static int helpsort P((const void *, const void *));
-#else
-static int helpsort P((char **, char **));
-#endif
-static void printusage P((struct xcmd *, FILE *));
-static void timeout P((struct parse *, FILE *));
-static void auth_delay P((struct parse *, FILE *));
-static void host P((struct parse *, FILE *));
-static void ntp_poll P((struct parse *, FILE *));
-static void keyid P((struct parse *, FILE *));
-static void keytype P((struct parse *, FILE *));
-static void passwd P((struct parse *, FILE *));
-static void hostnames P((struct parse *, FILE *));
-static void setdebug P((struct parse *, FILE *));
-static void quit P((struct parse *, FILE *));
-static void version P((struct parse *, FILE *));
-static void raw P((struct parse *, FILE *));
-static void cooked P((struct parse *, FILE *));
-static void authenticate P((struct parse *, FILE *));
-static void ntpversion P((struct parse *, FILE *));
-static void warning P((const char *, const char *, const char *));
-static void error P((const char *, const char *, const char *));
-static u_long getkeyid P((const char *));
-static void atoascii P((int, char *, char *));
-static void makeascii P((int, char *, FILE *));
-static void rawprint P((int, int, char *, int, FILE *));
-static void startoutput P((void));
-static void output P((FILE *, char *, char *));
-static void endoutput P((FILE *));
-static void outputarr P((FILE *, char *, int, l_fp *));
-static void cookedprint P((int, int, char *, int, FILE *));
-#ifdef QSORT_USES_VOID_P
-static int assoccmp P((const void *, const void *));
-#else
-static int assoccmp P((struct association *, struct association *));
-#endif /* sgi || bsdi */
-
-
-/*
- * Built-in commands we understand
- */
-struct xcmd builtins[] = {
- { "?", help, { OPT|STR, NO, NO, NO },
- { "command", "", "", "" },
- "tell the use and syntax of commands" },
- { "help", help, { OPT|STR, NO, NO, NO },
- { "command", "", "", "" },
- "tell the use and syntax of commands" },
- { "timeout", timeout, { OPT|UINT, NO, NO, NO },
- { "msec", "", "", "" },
- "set the primary receive time out" },
- { "delay", auth_delay, { OPT|INT, NO, NO, NO },
- { "msec", "", "", "" },
- "set the delay added to encryption time stamps" },
- { "host", host, { OPT|STR, OPT|STR, NO, NO },
- { "-4|-6", "hostname", "", "" },
- "specify the host whose NTP server we talk to" },
- { "poll", ntp_poll, { OPT|UINT, OPT|STR, NO, NO },
- { "n", "verbose", "", "" },
- "poll an NTP server in client mode `n' times" },
- { "passwd", passwd, { NO, NO, NO, NO },
- { "", "", "", "" },
- "specify a password to use for authenticated requests"},
- { "hostnames", hostnames, { OPT|STR, NO, NO, NO },
- { "yes|no", "", "", "" },
- "specify whether hostnames or net numbers are printed"},
- { "debug", setdebug, { OPT|STR, NO, NO, NO },
- { "no|more|less", "", "", "" },
- "set/change debugging level" },
- { "quit", quit, { NO, NO, NO, NO },
- { "", "", "", "" },
- "exit ntpq" },
- { "exit", quit, { NO, NO, NO, NO },
- { "", "", "", "" },
- "exit ntpq" },
- { "keyid", keyid, { OPT|UINT, NO, NO, NO },
- { "key#", "", "", "" },
- "set keyid to use for authenticated requests" },
- { "version", version, { NO, NO, NO, NO },
- { "", "", "", "" },
- "print version number" },
- { "raw", raw, { NO, NO, NO, NO },
- { "", "", "", "" },
- "do raw mode variable output" },
- { "cooked", cooked, { NO, NO, NO, NO },
- { "", "", "", "" },
- "do cooked mode variable output" },
- { "authenticate", authenticate, { OPT|STR, NO, NO, NO },
- { "yes|no", "", "", "" },
- "always authenticate requests to this server" },
- { "ntpversion", ntpversion, { OPT|UINT, NO, NO, NO },
- { "version number", "", "", "" },
- "set the NTP version number to use for requests" },
- { "keytype", keytype, { OPT|STR, NO, NO, NO },
- { "key type (md5|des)", "", "", "" },
- "set key type to use for authenticated requests (des|md5)" },
- { 0, 0, { NO, NO, NO, NO },
- { "", "", "", "" }, "" }
-};
-
-
-/*
- * Default values we use.
- */
-#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 DEFHOST "localhost" /* default host name */
-#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+MAXARGS+2) /* maximum number of usable tokens */
-#define MAXVARLEN 256 /* maximum length of a variable name */
-#define MAXVALLEN 400 /* maximum length of a variable value */
-#define MAXOUTLINE 72 /* maximum length of an output line */
-
-/*
- * Some variables used and manipulated locally
- */
-struct timeval tvout = { DEFTIMEOUT, 0 }; /* time out for reads */
-struct timeval tvsout = { DEFSTIMEOUT, 0 }; /* secondary time out */
-l_fp delay_time; /* delay time */
-char currenthost[LENHOSTNAME]; /* current host name */
-struct sockaddr_in hostaddr = { 0 }; /* host address */
-int showhostnames = 1; /* show host names by default */
-
-int ai_fam_templ; /* address family */
-int ai_fam_default; /* default address family */
-SOCKET sockfd; /* fd socket is opened on */
-int havehost = 0; /* set to 1 when host open */
-int s_port = 0;
-struct servent *server_entry = NULL; /* server entry for ntp */
-
-#ifdef SYS_WINNT
-DWORD NumberOfBytesWritten;
-
-HANDLE TimerThreadHandle = NULL; /* 1998/06/03 - Used in ntplib/machines.c */
-void timer(void) { ; }; /* 1998/06/03 - Used in ntplib/machines.c */
-
-#endif /* SYS_WINNT */
-
-/*
- * Sequence number used for requests. It is incremented before
- * it is used.
- */
-u_short sequence;
-
-/*
- * Holds data returned from queries. Declare buffer long to be sure of
- * alignment.
- */
-#define MAXFRAGS 24 /* maximum number of fragments */
-#define DATASIZE (MAXFRAGS*480) /* maximum amount of data */
-long pktdata[DATASIZE/sizeof(long)];
-
-/*
- * Holds association data for use with the &n operator.
- */
-struct association assoc_cache[MAXASSOC];
-int numassoc = 0; /* number of cached associations */
-
-/*
- * For commands typed on the command line (with the -c option)
- */
-int numcmds = 0;
-const char *ccmds[MAXCMDS];
-#define ADDCMD(cp) if (numcmds < MAXCMDS) ccmds[numcmds++] = (cp)
-
-/*
- * When multiple hosts are specified.
- */
-int numhosts = 0;
-const char *chosts[MAXHOSTS];
-#define ADDHOST(cp) if (numhosts < MAXHOSTS) chosts[numhosts++] = (cp)
-
-/*
- * Error codes for internal use
- */
-#define ERR_UNSPEC 256
-#define ERR_INCOMPLETE 257
-#define ERR_TIMEOUT 258
-#define ERR_TOOMUCH 259
-
-/*
- * 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
- */
-jmp_buf interrupt_buf;
-
-/*
- * Points at file being currently printed into
- */
-FILE *current_output;
-
-/*
- * Command table imported from ntpdc_ops.c
- */
-extern struct xcmd opcmds[];
-
-char *progname;
-volatile int debug;
-
-#ifdef NO_MAIN_ALLOWED
-CALL(ntpq,"ntpq",ntpqmain);
-
-void clear_globals(void)
-{
- extern int ntp_optind;
- extern char *ntp_optarg;
- showhostnames = 0; /* don'tshow host names by default */
- ntp_optind = 0;
- ntp_optarg = 0;
- server_entry = NULL; /* server entry for ntp */
- havehost = 0; /* set to 1 when host open */
- numassoc = 0; /* number of cached associations */
- numcmds = 0;
- numhosts = 0;
-}
-#endif
-
-/*
- * main - parse arguments and handle options
- */
-#ifndef NO_MAIN_ALLOWED
-int
-main(
- int argc,
- char *argv[]
- )
-{
- return ntpqmain(argc, argv);
-}
-#endif
-
-int
-ntpqmain(
- int argc,
- char *argv[]
- )
-{
- int c;
- int errflg = 0;
- extern int ntp_optind;
- extern char *ntp_optarg;
-
-#ifdef NO_MAIN_ALLOWED
- clear_globals();
- taskPrioritySet(taskIdSelf(), 100 );
-#endif
- delay_time.l_ui = 0;
- delay_time.l_uf = DEFDELAY;
-
-#ifdef SYS_WINNT
- if (!Win32InitSockets())
- {
- fprintf(stderr, "No useable winsock.dll:");
- exit(1);
- }
-#endif /* SYS_WINNT */
-
- /* Check to see if we have IPv6. Otherwise force the -4 flag */
- if (isc_net_probeipv6() != ISC_R_SUCCESS) {
- ai_fam_default = AF_INET;
- }
-
- progname = argv[0];
- ai_fam_templ = ai_fam_default;
- while ((c = ntp_getopt(argc, argv, "46c:dinp")) != EOF)
- switch (c) {
- case '4':
- ai_fam_templ = AF_INET;
- break;
- case '6':
- ai_fam_templ = AF_INET6;
- break;
- case 'c':
- ADDCMD(ntp_optarg);
- break;
- case 'd':
- ++debug;
- break;
- case 'i':
- interactive = 1;
- break;
- case 'n':
- showhostnames = 0;
- break;
- case 'p':
- ADDCMD("peers");
- break;
- default:
- errflg++;
- break;
- }
- if (errflg) {
- (void) fprintf(stderr,
- "usage: %s [-46dinp] [-c cmd] host ...\n",
- progname);
- exit(2);
- }
- 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 */
-
- 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++)
- docmd(ccmds[icmd]);
- }
- }
-#ifdef SYS_WINNT
- WSACleanup();
-#endif /* SYS_WINNT */
- return 0;
-}
-
-
-/*
- * 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;
- 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++, i++)
- name[i] = *cp;
- name[i] = '\0';
- hname = name;
- }
-
- /*
- * 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.
- */
- strcpy(service, "ntp");
- memset((char *)&hints, 0, sizeof(struct addrinfo));
- hints.ai_family = ai_fam_templ;
- hints.ai_protocol = IPPROTO_UDP;
- hints.ai_socktype = SOCK_DGRAM;
- hints.ai_flags = AI_NUMERICHOST;
-
- a_info = getaddrinfo(hname, service, &hints, &ai);
- if (a_info == EAI_NONAME || a_info == EAI_NODATA) {
- 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) {
- (void) fprintf(stderr, "%s\n", gai_strerror(a_info));
- return 0;
- }
-
- if (ai->ai_canonname == NULL) {
- strncpy(temphost, stoa((struct sockaddr_storage *)ai->ai_addr),
- LENHOSTNAME);
- temphost[LENHOSTNAME-1] = '\0';
-
- } else {
- strncpy(temphost, ai->ai_canonname, LENHOSTNAME);
- temphost[LENHOSTNAME-1] = '\0';
- }
-
- if (debug > 2)
- printf("Opening host %s\n", temphost);
-
- if (havehost == 1) {
- if (debug > 2)
- printf("Closing old host %s\n", currenthost);
- (void) closesocket(sockfd);
- havehost = 0;
- }
- (void) strcpy(currenthost, temphost);
-
- /* port maps to the same location in both families */
- s_port = ((struct sockaddr_in6 *)ai->ai_addr)->sin6_port;
-#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", "", "");
- }
-
-
-#ifdef NEED_RCVBUF_SLOP
-# ifdef SO_RCVBUF
- { int rbufsize = DATASIZE + 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, (struct sockaddr *)ai->ai_addr,
- ai->ai_addrlen) == -1)
-#endif /* SYS_VXWORKS */
- error("connect", "", "");
- if (a_info == 0)
- freeaddrinfo(ai);
- havehost = 1;
- 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(
- char *xdata,
- int xdatalen
- )
-{
- if (debug >= 3)
- printf("Sending %d octets\n", xdatalen);
-
-
- if (send(sockfd, xdata, (size_t)xdatalen, 0) == -1) {
- warning("write to %s failed", currenthost, "");
- return -1;
- }
-
- if (debug >= 4) {
- int first = 8;
- printf("Packet data:\n");
- while (xdatalen-- > 0) {
- if (first-- == 0) {
- printf("\n");
- first = 7;
- }
- printf(" %02x", *xdata++ & 0xff);
- }
- printf("\n");
- }
- return 0;
-}
-
-
-
-/*
- * getresponse - get a (series of) response packet(s) and return the data
- */
-static int
-getresponse(
- int opcode,
- int associd,
- u_short *rstatus,
- int *rsize,
- char **rdata,
- int timeo
- )
-{
- struct ntp_control rpkt;
- struct timeval tvo;
- u_short offsets[MAXFRAGS+1];
- u_short counts[MAXFRAGS+1];
- u_short offset;
- u_short count;
- int numfrags;
- int seenlastfrag;
- fd_set fds;
- int n;
-
- /*
- * This is pretty tricky. We may get between 1 and MAXFRAG 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 much data we
- * should have had. Note we use one long time out, should reconsider.
- */
- *rsize = 0;
- if (rstatus)
- *rstatus = 0;
- *rdata = (char *)pktdata;
-
- numfrags = 0;
- seenlastfrag = 0;
-
- FD_ZERO(&fds);
-
- again:
- if (numfrags == 0)
- tvo = tvout;
- else
- tvo = tvsout;
-
- FD_SET(sockfd, &fds);
- n = select(sockfd+1, &fds, (fd_set *)0, (fd_set *)0, &tvo);
-
-#if 0
- if (debug >= 1)
- printf("select() returns %d\n", n);
-#endif
-
- if (n == -1) {
- warning("select fails", "", "");
- return -1;
- }
- if (n == 0) {
- /*
- * Timed out. Return what we have
- */
- if (numfrags == 0) {
- if (timeo)
- (void) fprintf(stderr,
- "%s: timed out, nothing received\n",
- currenthost);
- return ERR_TIMEOUT;
- } else {
- if (timeo)
- (void) fprintf(stderr,
- "%s: timed out with incomplete data\n",
- currenthost);
- if (debug) {
- printf("Received fragments:\n");
- for (n = 0; n < numfrags; n++)
- printf("%4d %d\n", offsets[n],
- counts[n]);
- if (seenlastfrag)
- printf("last fragment received\n");
- else
- printf("last fragment not received\n");
- }
- return ERR_INCOMPLETE;
- }
- }
-
- n = recv(sockfd, (char *)&rpkt, sizeof(rpkt), 0);
- if (n == -1) {
- warning("read", "", "");
- return -1;
- }
-
- if (debug >= 4) {
- int len = n, first = 8;
- char *data = (char *)&rpkt;
-
- printf("Packet data:\n");
- while (len-- > 0) {
- if (first-- == 0) {
- printf("\n");
- first = 7;
- }
- printf(" %02x", *data++ & 0xff);
- }
- printf("\n");
- }
-
- /*
- * Check for format errors. Bug proofing.
- */
- if (n < CTL_HEADER_LEN) {
- if (debug)
- printf("Short (%d byte) packet received\n", n);
- goto again;
- }
- if (PKT_VERSION(rpkt.li_vn_mode) > NTP_VERSION
- || PKT_VERSION(rpkt.li_vn_mode) < NTP_OLDVERSION) {
- if (debug)
- printf("Packet received with version %d\n",
- PKT_VERSION(rpkt.li_vn_mode));
- goto again;
- }
- if (PKT_MODE(rpkt.li_vn_mode) != MODE_CONTROL) {
- if (debug)
- printf("Packet received with mode %d\n",
- PKT_MODE(rpkt.li_vn_mode));
- goto again;
- }
- if (!CTL_ISRESPONSE(rpkt.r_m_e_op)) {
- if (debug)
- printf("Received request packet, wanted response\n");
- goto again;
- }
-
- /*
- * Check opcode and sequence number for a match.
- * Could be old data getting to us.
- */
- if (ntohs(rpkt.sequence) != sequence) {
- if (debug)
- printf(
- "Received sequnce number %d, wanted %d\n",
- ntohs(rpkt.sequence), sequence);
- goto again;
- }
- if (CTL_OP(rpkt.r_m_e_op) != opcode) {
- if (debug)
- printf(
- "Received opcode %d, wanted %d (sequence number okay)\n",
- CTL_OP(rpkt.r_m_e_op), opcode);
- goto again;
- }
-
- /*
- * Check the error code. If non-zero, return it.
- */
- if (CTL_ISERROR(rpkt.r_m_e_op)) {
- int errcode;
-
- errcode = (ntohs(rpkt.status) >> 8) & 0xff;
- if (debug && CTL_ISMORE(rpkt.r_m_e_op)) {
- printf("Error code %d received on not-final packet\n",
- errcode);
- }
- if (errcode == CERR_UNSPEC)
- return ERR_UNSPEC;
- return errcode;
- }
-
- /*
- * Check the association ID to make sure it matches what
- * we sent.
- */
- if (ntohs(rpkt.associd) != associd) {
- if (debug)
- printf("Association ID %d doesn't match expected %d\n",
- ntohs(rpkt.associd), associd);
- /*
- * Hack for silly fuzzballs which, at the time of writing,
- * return an assID of sys.peer when queried for system variables.
- */
-#ifdef notdef
- goto again;
-#endif
- }
-
- /*
- * Collect offset and count. Make sure they make sense.
- */
- offset = ntohs(rpkt.offset);
- count = ntohs(rpkt.count);
-
- if (debug >= 3) {
- int shouldbesize;
- u_long key;
- u_long *lpkt;
- int maclen;
-
- /*
- * Usually we ignore authentication, but for debugging purposes
- * we watch it here.
- */
- shouldbesize = CTL_HEADER_LEN + count;
-
- /* round to 8 octet boundary */
- shouldbesize = (shouldbesize + 7) & ~7;
-
- if (n & 0x3) {
- printf("Packet not padded, size = %d\n", n);
- } if ((maclen = n - shouldbesize) >= MIN_MAC_LEN) {
- printf(
- "Packet shows signs of authentication (total %d, data %d, mac %d)\n",
- n, shouldbesize, maclen);
- lpkt = (u_long *)&rpkt;
- printf("%08lx %08lx %08lx %08lx %08lx %08lx\n",
- (u_long)ntohl(lpkt[(n - maclen)/sizeof(u_long) - 3]),
- (u_long)ntohl(lpkt[(n - maclen)/sizeof(u_long) - 2]),
- (u_long)ntohl(lpkt[(n - maclen)/sizeof(u_long) - 1]),
- (u_long)ntohl(lpkt[(n - maclen)/sizeof(u_long)]),
- (u_long)ntohl(lpkt[(n - maclen)/sizeof(u_long) + 1]),
- (u_long)ntohl(lpkt[(n - maclen)/sizeof(u_long) + 2]));
- key = ntohl(lpkt[(n - maclen) / sizeof(u_long)]);
- printf("Authenticated with keyid %lu\n", (u_long)key);
- if (key != 0 && key != info_auth_keyid) {
- printf("We don't know that key\n");
- } else {
- if (authdecrypt(key, (u_int32 *)&rpkt,
- n - maclen, maclen)) {
- printf("Auth okay!\n");
- } else {
- printf("Auth failed!\n");
- }
- }
- }
- }
-
- if (debug >= 2)
- printf("Got packet, size = %d\n", n);
- if (count > (u_short)(n-CTL_HEADER_LEN)) {
- if (debug)
- printf(
- "Received count of %d octets, data in packet is %d\n",
- count, n-CTL_HEADER_LEN);
- goto again;
- }
- if (count == 0 && CTL_ISMORE(rpkt.r_m_e_op)) {
- if (debug)
- printf("Received count of 0 in non-final fragment\n");
- goto again;
- }
- if (offset + count > sizeof(pktdata)) {
- if (debug)
- printf("Offset %d, count %d, too big for buffer\n",
- offset, count);
- return ERR_TOOMUCH;
- }
- if (seenlastfrag && !CTL_ISMORE(rpkt.r_m_e_op)) {
- if (debug)
- printf("Received second last fragment packet\n");
- goto again;
- }
-
- /*
- * So far, so good. Record this fragment, making sure it doesn't
- * overlap anything.
- */
- if (debug >= 2)
- printf("Packet okay\n");;
-
- if (numfrags == MAXFRAGS) {
- if (debug)
- printf("Number of fragments exceeds maximum\n");
- return ERR_TOOMUCH;
- }
-
- for (n = 0; n < numfrags; n++) {
- if (offset == offsets[n])
- goto again; /* duplicate */
- if (offset < offsets[n])
- break;
- }
-
- if ((u_short)(n > 0 && offsets[n-1] + counts[n-1]) > offset)
- goto overlap;
- if (n < numfrags && (u_short)(offset + count) > offsets[n])
- goto overlap;
-
- {
- register int i;
-
- for (i = numfrags; i > n; i--) {
- offsets[i] = offsets[i-1];
- counts[i] = counts[i-1];
- }
- }
- offsets[n] = offset;
- counts[n] = count;
- numfrags++;
-
- /*
- * Got that stuffed in right. Figure out if this was the last.
- * Record status info out of the last packet.
- */
- if (!CTL_ISMORE(rpkt.r_m_e_op)) {
- seenlastfrag = 1;
- if (rstatus != 0)
- *rstatus = ntohs(rpkt.status);
- }
-
- /*
- * Copy the data into the data buffer.
- */
- memmove((char *)pktdata + offset, (char *)rpkt.data, count);
-
- /*
- * If we've seen the last fragment, look for holes in the sequence.
- * If there aren't any, we're done.
- */
- if (seenlastfrag && offsets[0] == 0) {
- for (n = 1; n < numfrags; n++) {
- if (offsets[n-1] + counts[n-1] != offsets[n])
- break;
- }
- if (n == numfrags) {
- *rsize = offsets[numfrags-1] + counts[numfrags-1];
- return 0;
- }
- }
- goto again;
-
- overlap:
- /*
- * Print debugging message about overlapping fragments
- */
- if (debug)
- printf("Overlapping fragments returned in response\n");
- goto again;
-}
-
-
-/*
- * sendrequest - format and send a request packet
- */
-static int
-sendrequest(
- int opcode,
- int associd,
- int auth,
- int qsize,
- char *qdata
- )
-{
- struct ntp_control qpkt;
- int pktsize;
-
- /*
- * Check to make sure the data will fit in one packet
- */
- if (qsize > CTL_MAX_DATA_LEN) {
- (void) fprintf(stderr,
- "***Internal error! qsize (%d) too large\n",
- qsize);
- return 1;
- }
-
- /*
- * Fill in the packet
- */
- qpkt.li_vn_mode = PKT_LI_VN_MODE(0, pktversion, MODE_CONTROL);
- qpkt.r_m_e_op = (u_char)(opcode & CTL_OP_MASK);
- qpkt.sequence = htons(sequence);
- qpkt.status = 0;
- qpkt.associd = htons((u_short)associd);
- qpkt.offset = 0;
- qpkt.count = htons((u_short)qsize);
-
- /*
- * If we have data, copy it in and pad it out to a 64
- * bit boundary.
- */
- if (qsize > 0) {
- memmove((char *)qpkt.data, qdata, (unsigned)qsize);
- pktsize = qsize + CTL_HEADER_LEN;
- while (pktsize & (sizeof(u_long) - 1)) {
- qpkt.data[qsize++] = 0;
- pktsize++;
- }
- } else {
- pktsize = CTL_HEADER_LEN;
- }
-
- /*
- * If it isn't authenticated we can just send it. Otherwise
- * we're going to have to think about it a little.
- */
- if (!auth && !always_auth) {
- return sendpkt((char *)&qpkt, pktsize);
- } else {
- const char *pass = "\0";
- int maclen = 0;
- u_long my_keyid;
-
- /*
- * Pad out packet to a multiple of 8 octets to be sure
- * receiver can handle it.
- */
- while (pktsize & 7) {
- qpkt.data[qsize++] = 0;
- pktsize++;
- }
-
- /*
- * Get the keyid and the password if we don't have one.
- */
- if (info_auth_keyid == 0) {
- int u_keyid = getkeyid("Keyid: ");
- if (u_keyid == 0 || u_keyid > NTP_MAXKEY) {
- (void) fprintf(stderr,
- "Invalid key identifier\n");
- return 1;
- }
- info_auth_keyid = u_keyid;
- }
- if (!authistrusted(info_auth_keyid)) {
- pass = getpass("MD5 Password: ");
- if (*pass == '\0') {
- (void) fprintf(stderr,
- "Invalid password\n");
- return (1);
- }
- }
- authusekey(info_auth_keyid, info_auth_keytype, (const u_char *)pass);
- authtrust(info_auth_keyid, 1);
-
- /*
- * Stick the keyid in the packet where
- * cp currently points. Cp should be aligned
- * properly. Then do the encryptions.
- */
- my_keyid = htonl(info_auth_keyid);
- memcpy(&qpkt.data[qsize], &my_keyid, sizeof my_keyid);
- maclen = authencrypt(info_auth_keyid, (u_int32 *)&qpkt,
- pktsize);
- if (maclen == 0) {
- (void) fprintf(stderr, "Key not found\n");
- return (1);
- }
- return sendpkt((char *)&qpkt, pktsize + maclen);
- }
- /*NOTREACHED*/
-}
-
-
-/*
- * doquery - send a request and process the response
- */
-int
-doquery(
- int opcode,
- int associd,
- int auth,
- int qsize,
- char *qdata,
- u_short *rstatus,
- int *rsize,
- char **rdata
- )
-{
- int res;
- int done;
-
- /*
- * Check to make sure host is open
- */
- if (!havehost) {
- (void) fprintf(stderr, "***No host open, use `host' command\n");
- return -1;
- }
-
- done = 0;
- sequence++;
-
- again:
- /*
- * send a request
- */
- res = sendrequest(opcode, associd, auth, qsize, qdata);
- if (res != 0)
- return res;
-
- /*
- * Get the response. If we got a standard error, print a message
- */
- res = getresponse(opcode, associd, rstatus, rsize, rdata, done);
-
- if (res > 0) {
- if (!done && (res == ERR_TIMEOUT || res == ERR_INCOMPLETE)) {
- if (res == ERR_INCOMPLETE) {
- /*
- * better bump the sequence so we don't
- * get confused about differing fragments.
- */
- sequence++;
- }
- done = 1;
- goto again;
- }
- switch(res) {
- case CERR_BADFMT:
- (void) fprintf(stderr,
- "***Server reports a bad format request packet\n");
- break;
- case CERR_PERMISSION:
- (void) fprintf(stderr,
- "***Server disallowed request (authentication?)\n");
- break;
- case CERR_BADOP:
- (void) fprintf(stderr,
- "***Server reports a bad opcode in request\n");
- break;
- case CERR_BADASSOC:
- (void) fprintf(stderr,
- "***Association ID %d unknown to server\n",associd);
- break;
- case CERR_UNKNOWNVAR:
- (void) fprintf(stderr,
- "***A request variable unknown to the server\n");
- break;
- case CERR_BADVALUE:
- (void) fprintf(stderr,
- "***Server indicates a request variable was bad\n");
- break;
- case ERR_UNSPEC:
- (void) fprintf(stderr,
- "***Server returned an unspecified error\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;
- case ERR_TOOMUCH:
- (void) fprintf(stderr,
- "***Buffer size exceeded for returned data\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)
-{
-#if defined(HAVE_LIBREADLINE) || defined(HAVE_LIBEDIT)
- char *line;
-
- for (;;) {
- if ((line = readline(interactive?prompt:"")) == NULL) return;
- if (*line) add_history(line);
- docmd(line);
- free(line);
- }
-#else /* not (HAVE_LIBREADLINE || HAVE_LIBEDIT) */
- char line[MAXLINE];
-
- for (;;) {
- if (interactive) {
-#ifdef VMS /* work around a problem with mixing stdout & stderr */
- fputs("",stdout);
-#endif
- (void) fputs(prompt, stderr);
- (void) fflush(stderr);
- }
-
- if (fgets(line, sizeof line, stdin) == NULL)
- return;
-
- docmd(line);
- }
-#endif /* not (HAVE_LIBREADLINE || HAVE_LIBEDIT) */
-}
-
-#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+2];
- struct parse pcmd;
- int ntok;
- static int i;
- struct xcmd *xcmd;
-
- /*
- * Tokenize the command line. If nothing on it, 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;
- for (i = 0; i < MAXARGS && xcmd->arg[i] != NO; i++) {
- if ((i+1) >= ntok) {
- if (!(xcmd->arg[i] & OPT)) {
- printusage(xcmd, stderr);
- return;
- }
- break;
- }
- if ((xcmd->arg[i] & OPT) && (*tokens[i+1] == '>'))
- break;
- if (!getarg(tokens[i+1], (int)xcmd->arg[i], &pcmd.argval[i]))
- return;
- pcmd.nargs++;
- }
-
- i++;
- 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;
- }
- i = 1; /* flag we need a close */
- } else {
- current_output = stdout;
- i = 0; /* flag no close */
- }
-
- if (interactive && setjmp(interrupt_buf)) {
- jump = 0;
- return;
- } else {
- jump++;
- (xcmd->handler)(&pcmd, current_output);
- jump = 0; /* HMS: 961106: was after fclose() */
- if (i) (void) fclose(current_output);
- }
-}
-
-
-/*
- * 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
- */
-static int
-getarg(
- char *str,
- int code,
- arg_v *argp
- )
-{
- int isneg;
- char *cp, *np;
- static const char *digits = "0123456789";
-
- switch (code & ~OPT) {
- case STR:
- argp->string = str;
- break;
- case ADD:
- if (!getnetnum(str, &(argp->netnum), (char *)0, 0)) {
- return 0;
- }
- break;
- case INT:
- case UINT:
- isneg = 0;
- np = str;
- if (*np == '&') {
- np++;
- isneg = atoi(np);
- if (isneg <= 0) {
- (void) fprintf(stderr,
- "***Association value `%s' invalid/undecodable\n", str);
- return 0;
- }
- if (isneg > numassoc) {
- if (numassoc == 0) {
- (void) fprintf(stderr,
- "***Association for `%s' unknown (max &%d)\n",
- str, numassoc);
- return 0;
- } else {
- isneg = numassoc;
- }
- }
- argp->uval = assoc_cache[isneg-1].assid;
- break;
- }
-
- 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) == 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
- */
-int
-getnetnum(
- const char *hname,
- struct sockaddr_storage *num,
- char *fullhost,
- int af
- )
-{
- int err;
- int sockaddr_len;
- struct addrinfo hints, *ai = NULL;
-
- sockaddr_len = (af == AF_INET)
- ? sizeof(struct sockaddr_in)
- : sizeof(struct sockaddr_in6);
- memset((char *)&hints, 0, sizeof(struct addrinfo));
- hints.ai_flags = AI_CANONNAME;
-#ifdef AI_ADDRCONFIG
- hints.ai_flags |= AI_ADDRCONFIG;
-#endif
-
- /* decodenetnum works with addresses only */
- if (decodenetnum(hname, num)) {
- if (fullhost != 0) {
- getnameinfo((struct sockaddr *)num, sockaddr_len,
- fullhost, sizeof(fullhost), NULL, 0,
- NI_NUMERICHOST);
-
- }
- return 1;
- } else if ((err = getaddrinfo(hname, "ntp", &hints, &ai)) == 0) {
- memmove((char *)num, ai->ai_addr, ai->ai_addrlen);
- if (ai->ai_canonname != 0)
- (void) strcpy(fullhost, ai->ai_canonname);
- return 1;
- } else {
- (void) fprintf(stderr, "***Can't find host %s\n", hname);
- return 0;
- }
- /*NOTREACHED*/
-}
-
-/*
- * nntohost - convert network number to host name. This routine enforces
- * the showhostnames setting.
- */
-char *
-nntohost(
- struct sockaddr_storage *netnum
- )
-{
- if (!showhostnames)
- return stoa(netnum);
- if ((netnum->ss_family == AF_INET) && ISREFCLOCKADR(netnum))
- return refnumtoa(netnum);
- return socktohost(netnum);
-}
-
-
-/*
- * rtdatetolfp - decode an RT-11 date into an l_fp
- */
-static int
-rtdatetolfp(
- char *str,
- l_fp *lfp
- )
-{
- register char *cp;
- register int i;
- struct calendar cal;
- char buf[4];
- static const char *months[12] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
- };
-
- cal.yearday = 0;
-
- /*
- * An RT-11 date looks like:
- *
- * d[d]-Mth-y[y] hh:mm:ss
- *
- * (No docs, but assume 4-digit years are also legal...)
- *
- * d[d]-Mth-y[y[y[y]]] hh:mm:ss
- */
- cp = str;
- if (!isdigit((int)*cp)) {
- if (*cp == '-') {
- /*
- * Catch special case
- */
- L_CLR(lfp);
- return 1;
- }
- return 0;
- }
-
- cal.monthday = (u_char) (*cp++ - '0'); /* ascii dependent */
- if (isdigit((int)*cp)) {
- cal.monthday = (u_char)((cal.monthday << 3) + (cal.monthday << 1));
- cal.monthday = (u_char)(cal.monthday + *cp++ - '0');
- }
-
- if (*cp++ != '-')
- return 0;
-
- for (i = 0; i < 3; i++)
- buf[i] = *cp++;
- buf[3] = '\0';
-
- for (i = 0; i < 12; i++)
- if (STREQ(buf, months[i]))
- break;
- if (i == 12)
- return 0;
- cal.month = (u_char)(i + 1);
-
- if (*cp++ != '-')
- return 0;
-
- if (!isdigit((int)*cp))
- return 0;
- cal.year = (u_short)(*cp++ - '0');
- if (isdigit((int)*cp)) {
- cal.year = (u_short)((cal.year << 3) + (cal.year << 1));
- cal.year = (u_short)(*cp++ - '0');
- }
- if (isdigit((int)*cp)) {
- cal.year = (u_short)((cal.year << 3) + (cal.year << 1));
- cal.year = (u_short)(cal.year + *cp++ - '0');
- }
- if (isdigit((int)*cp)) {
- cal.year = (u_short)((cal.year << 3) + (cal.year << 1));
- cal.year = (u_short)(cal.year + *cp++ - '0');
- }
-
- /*
- * Catch special case. If cal.year == 0 this is a zero timestamp.
- */
- if (cal.year == 0) {
- L_CLR(lfp);
- return 1;
- }
-
- if (*cp++ != ' ' || !isdigit((int)*cp))
- return 0;
- cal.hour = (u_char)(*cp++ - '0');
- if (isdigit((int)*cp)) {
- cal.hour = (u_char)((cal.hour << 3) + (cal.hour << 1));
- cal.hour = (u_char)(cal.hour + *cp++ - '0');
- }
-
- if (*cp++ != ':' || !isdigit((int)*cp))
- return 0;
- cal.minute = (u_char)(*cp++ - '0');
- if (isdigit((int)*cp)) {
- cal.minute = (u_char)((cal.minute << 3) + (cal.minute << 1));
- cal.minute = (u_char)(cal.minute + *cp++ - '0');
- }
-
- if (*cp++ != ':' || !isdigit((int)*cp))
- return 0;
- cal.second = (u_char)(*cp++ - '0');
- if (isdigit((int)*cp)) {
- cal.second = (u_char)((cal.second << 3) + (cal.second << 1));
- cal.second = (u_char)(cal.second + *cp++ - '0');
- }
-
- /*
- * For RT-11, 1972 seems to be the pivot year
- */
- if (cal.year < 72)
- cal.year += 2000;
- if (cal.year < 100)
- cal.year += 1900;
-
- lfp->l_ui = caltontp(&cal);
- lfp->l_uf = 0;
- return 1;
-}
-
-
-/*
- * decodets - decode a timestamp into an l_fp format number, with
- * consideration of fuzzball formats.
- */
-int
-decodets(
- char *str,
- l_fp *lfp
- )
-{
- /*
- * If it starts with a 0x, decode as hex.
- */
- if (*str == '0' && (*(str+1) == 'x' || *(str+1) == 'X'))
- return hextolfp(str+2, lfp);
-
- /*
- * If it starts with a '"', try it as an RT-11 date.
- */
- if (*str == '"') {
- register char *cp = str+1;
- register char *bp;
- char buf[30];
-
- bp = buf;
- while (*cp != '"' && *cp != '\0' && bp < &buf[29])
- *bp++ = *cp++;
- *bp = '\0';
- return rtdatetolfp(buf, lfp);
- }
-
- /*
- * Might still be hex. Check out the first character. Talk
- * about heuristics!
- */
- if ((*str >= 'A' && *str <= 'F') || (*str >= 'a' && *str <= 'f'))
- return hextolfp(str, lfp);
-
- /*
- * Try it as a decimal. If this fails, try as an unquoted
- * RT-11 date. This code should go away eventually.
- */
- if (atolfp(str, lfp))
- return 1;
- return rtdatetolfp(str, lfp);
-}
-
-
-/*
- * decodetime - decode a time value. It should be in milliseconds
- */
-int
-decodetime(
- char *str,
- l_fp *lfp
- )
-{
- return mstolfp(str, lfp);
-}
-
-
-/*
- * decodeint - decode an integer
- */
-int
-decodeint(
- char *str,
- long *val
- )
-{
- if (*str == '0') {
- if (*(str+1) == 'x' || *(str+1) == 'X')
- return hextoint(str+2, (void *)&val);
- return octtoint(str, (void *)&val);
- }
- return atoint(str, val);
-}
-
-
-/*
- * decodeuint - decode an unsigned integer
- */
-int
-decodeuint(
- char *str,
- u_long *val
- )
-{
- if (*str == '0') {
- if (*(str + 1) == 'x' || *(str + 1) == 'X')
- return (hextoint(str + 2, val));
- return (octtoint(str, val));
- }
- return (atouint(str, val));
-}
-
-
-/*
- * decodearr - decode an array of time values
- */
-static int
-decodearr(
- char *str,
- int *narr,
- l_fp *lfparr
- )
-{
- register char *cp, *bp;
- register l_fp *lfp;
- char buf[60];
-
- lfp = lfparr;
- cp = str;
- *narr = 0;
-
- while (*narr < 8) {
- while (isspace((int)*cp))
- cp++;
- if (*cp == '\0')
- break;
-
- bp = buf;
- while (!isspace((int)*cp) && *cp != '\0')
- *bp++ = *cp++;
- *bp++ = '\0';
-
- if (!decodetime(buf, lfp))
- return 0;
- (*narr)++;
- lfp++;
- }
- return 1;
-}
-
-
-/*
- * Finally, the built in command handlers
- */
-
-/*
- * help - tell about commands, or details of a particular command
- */
-static void
-help(
- struct parse *pcmd,
- FILE *fp
- )
-{
- int i;
- int n;
- struct xcmd *xcp;
- char *cmd;
- const char *cmdsort[100];
- int length[100];
- int maxlength;
- int numperline;
- static const char *spaces = " "; /* 20 spaces */
-
- if (pcmd->nargs == 0) {
- n = 0;
- for (xcp = builtins; xcp->keyword != 0; xcp++) {
- if (*(xcp->keyword) != '?')
- cmdsort[n++] = xcp->keyword;
- }
- for (xcp = opcmds; xcp->keyword != 0; xcp++)
- cmdsort[n++] = xcp->keyword;
-
-#ifdef QSORT_USES_VOID_P
- qsort(cmdsort, (size_t)n, sizeof(char *), helpsort);
-#else
- qsort((char *)cmdsort, (size_t)n, sizeof(char *), helpsort);
-#endif
-
- maxlength = 0;
- for (i = 0; i < n; i++) {
- length[i] = strlen(cmdsort[i]);
- if (length[i] > maxlength)
- maxlength = length[i];
- }
- maxlength++;
- numperline = 76 / maxlength;
-
- (void) fprintf(fp, "Commands available:\n");
- for (i = 0; i < n; i++) {
- if ((i % numperline) == (numperline-1)
- || i == (n-1))
- (void) fprintf(fp, "%s\n", cmdsort[i]);
- else
- (void) fprintf(fp, "%s%s", cmdsort[i],
- spaces+20-maxlength+length[i]);
- }
- } else {
- cmd = pcmd->argval[0].string;
- n = findcmd(cmd, builtins, opcmds, &xcp);
- if (n == 0) {
- (void) fprintf(stderr,
- "Command `%s' is unknown\n", cmd);
- return;
- } else if (n >= 2) {
- (void) fprintf(stderr,
- "Command `%s' is ambiguous\n", cmd);
- return;
- }
- (void) fprintf(fp, "function: %s\n", xcp->comment);
- printusage(xcp, fp);
- }
-}
-
-
-/*
- * helpsort - do hostname qsort comparisons
- */
-#ifdef QSORT_USES_VOID_P
-static int
-helpsort(
- const void *t1,
- const void *t2
- )
-{
- char const * const * name1 = (char const * const *)t1;
- char const * const * name2 = (char const * const *)t2;
-
- return strcmp(*name1, *name2);
-}
-
-#else
-static int
-helpsort(
- char **name1,
- char **name2
- )
-{
- return strcmp(*name1, *name2);
-}
-#endif
-
-/*
- * printusage - print usage information for a command
- */
-static void
-printusage(
- struct xcmd *xcp,
- FILE *fp
- )
-{
- register int i;
-
- (void) fprintf(fp, "usage: %s", xcp->keyword);
- for (i = 0; i < MAXARGS && xcp->arg[i] != NO; i++) {
- 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;
- }
-}
-
-
-/*
- * auth_delay - set delay for auth requests
- */
-static void
-auth_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;
- ai_fam_templ = ai_fam_default;
- 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);
- numassoc = 0;
- } else {
- if (havehost)
- (void) fprintf(fp,
- "current host remains %s\n", currenthost);
- else
- (void) fprintf(fp, "still no current host\n");
- }
-}
-
-
-/*
- * poll - do one (or more) polls of the host via NTP
- */
-/*ARGSUSED*/
-static void
-ntp_poll(
- struct parse *pcmd,
- FILE *fp
- )
-{
- (void) fprintf(fp, "poll not implemented yet\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)
- (void) fprintf(fp, "no keyid defined\n");
- else
- (void) fprintf(fp, "keyid is %lu\n", (u_long)info_auth_keyid);
- } else {
- /* allow zero so that keyid can be cleared. */
- if(pcmd->argval[0].uval > NTP_MAXKEY)
- (void) fprintf(fp, "Invalid key identifier\n");
- info_auth_keyid = pcmd->argval[0].uval;
- }
-}
-
-/*
- * keytype - get type of key to use for authenticating requests
- */
-static void
-keytype(
- struct parse *pcmd,
- FILE *fp
- )
-{
- if (pcmd->nargs == 0)
- fprintf(fp, "keytype is %s\n",
- (info_auth_keytype == KEY_TYPE_MD5) ? "MD5" : "???");
- else
- switch (*(pcmd->argval[0].string)) {
- case 'm':
- case 'M':
- info_auth_keytype = KEY_TYPE_MD5;
- break;
-
- default:
- fprintf(fp, "keytype must be 'md5'\n");
- }
-}
-
-
-
-/*
- * passwd - get an authentication key
- */
-/*ARGSUSED*/
-static void
-passwd(
- struct parse *pcmd,
- FILE *fp
- )
-{
- char *pass;
-
- if (info_auth_keyid == 0) {
- int u_keyid = getkeyid("Keyid: ");
- if (u_keyid == 0 || u_keyid > NTP_MAXKEY) {
- (void)fprintf(fp, "Invalid key identifier\n");
- return;
- }
- info_auth_keyid = u_keyid;
- }
- pass = getpass("MD5 Password: ");
- if (*pass == '\0')
- (void) fprintf(fp, "Password unchanged\n");
- else {
- 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); /* cleanliness next to godliness */
- exit(0);
-}
-
-
-/*
- * version - print the current version number
- */
-/*ARGSUSED*/
-static void
-version(
- struct parse *pcmd,
- FILE *fp
- )
-{
-
- (void) fprintf(fp, "%s\n", Version);
- return;
-}
-
-
-/*
- * raw - set raw mode output
- */
-/*ARGSUSED*/
-static void
-raw(
- struct parse *pcmd,
- FILE *fp
- )
-{
- rawmode = 1;
- (void) fprintf(fp, "Output set to raw\n");
-}
-
-
-/*
- * cooked - set cooked mode output
- */
-/*ARGSUSED*/
-static void
-cooked(
- struct parse *pcmd,
- FILE *fp
- )
-{
- rawmode = 0;
- (void) fprintf(fp, "Output set to cooked\n");
- return;
-}
-
-
-/*
- * authenticate - always authenticate requests to this host
- */
-static void
-authenticate(
- struct parse *pcmd,
- FILE *fp
- )
-{
- if (pcmd->nargs == 0) {
- if (always_auth) {
- (void) fprintf(fp,
- "authenticated requests being sent\n");
- } else
- (void) fprintf(fp,
- "unauthenticated requests being sent\n");
- } else {
- if (STREQ(pcmd->argval[0].string, "yes")) {
- always_auth = 1;
- } else if (STREQ(pcmd->argval[0].string, "no")) {
- always_auth = 0;
- } else
- (void)fprintf(stderr, "What?\n");
- }
-}
-
-
-/*
- * ntpversion - choose the NTP version to use
- */
-static void
-ntpversion(
- struct parse *pcmd,
- FILE *fp
- )
-{
- if (pcmd->nargs == 0) {
- (void) fprintf(fp,
- "NTP version being claimed is %d\n", pktversion);
- } else {
- if (pcmd->argval[0].uval < NTP_OLDVERSION
- || pcmd->argval[0].uval > NTP_VERSION) {
- (void) fprintf(stderr, "versions %d to %d, please\n",
- NTP_OLDVERSION, NTP_VERSION);
- } else {
- pktversion = (u_char) pcmd->argval[0].uval;
- }
- }
-}
-
-
-/*
- * 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
- )
-{
- register char *p;
- register int c;
- FILE *fi;
- char pbuf[20];
-
-#ifndef SYS_WINNT
- if ((fi = fdopen(open("/dev/tty", 2), "r")) == NULL)
-#else
- if ((fi = _fdopen((int)GetStdHandle(STD_INPUT_HANDLE), "r")) == NULL)
-#endif /* SYS_WINNT */
- fi = stdin;
- else
- setbuf(fi, (char *)NULL);
- fprintf(stderr, "%s", keyprompt); fflush(stderr);
- for (p=pbuf; (c = getc(fi))!='\n' && c!=EOF;) {
- if (p < &pbuf[18])
- *p++ = (char)c;
- }
- *p = '\0';
- if (fi != stdin)
- fclose(fi);
- if (strcmp(pbuf, "0") == 0)
- return 0;
-
- return (u_long) atoi(pbuf);
-}
-
-
-/*
- * atoascii - printable-ize possibly ascii data using the character
- * transformations cat -v uses.
- */
-static void
-atoascii(
- int length,
- char *data,
- char *outdata
- )
-{
- register u_char *cp;
- register u_char *ocp;
- register u_char c;
-
- if (!data)
- {
- *outdata = '\0';
- return;
- }
-
- ocp = (u_char *)outdata;
- for (cp = (u_char *)data; cp < (u_char *)data + length; cp++) {
- c = *cp;
- if (c == '\0')
- break;
- if (c == '\0')
- break;
- if (c > 0177) {
- *ocp++ = 'M';
- *ocp++ = '-';
- c &= 0177;
- }
-
- if (c < ' ') {
- *ocp++ = '^';
- *ocp++ = (u_char)(c + '@');
- } else if (c == 0177) {
- *ocp++ = '^';
- *ocp++ = '?';
- } else {
- *ocp++ = c;
- }
- if (ocp >= ((u_char *)outdata + length - 4))
- break;
- }
- *ocp++ = '\0';
-}
-
-
-
-/*
- * makeascii - print possibly ascii data using the character
- * transformations that cat -v uses.
- */
-static void
-makeascii(
- int length,
- char *data,
- FILE *fp
- )
-{
- register u_char *cp;
- register int c;
-
- for (cp = (u_char *)data; cp < (u_char *)data + length; cp++) {
- c = (int)*cp;
- if (c > 0177) {
- putc('M', fp);
- putc('-', fp);
- c &= 0177;
- }
-
- if (c < ' ') {
- putc('^', fp);
- putc(c+'@', fp);
- } else if (c == 0177) {
- putc('^', fp);
- putc('?', fp);
- } else {
- putc(c, fp);
- }
- }
-}
-
-
-/*
- * asciize - same thing as makeascii except add a newline
- */
-void
-asciize(
- int length,
- char *data,
- FILE *fp
- )
-{
- makeascii(length, data, fp);
- putc('\n', fp);
-}
-
-
-/*
- * Some circular buffer space
- */
-#define CBLEN 80
-#define NUMCB 6
-
-char circ_buf[NUMCB][CBLEN];
-int nextcb = 0;
-
-/*
- * nextvar - find the next variable in the buffer
- */
-int
-nextvar(
- int *datalen,
- char **datap,
- char **vname,
- char **vvalue
- )
-{
- register char *cp;
- register char *np;
- register char *cpend;
- register char *npend; /* character after last */
- int quoted = 0;
- static char name[MAXVARLEN];
- static char value[MAXVALLEN];
-
- cp = *datap;
- cpend = cp + *datalen;
-
- /*
- * Space past commas and white space
- */
- while (cp < cpend && (*cp == ',' || isspace((int)*cp)))
- cp++;
- if (cp == cpend)
- return 0;
-
- /*
- * Copy name until we hit a ',', an '=', a '\r' or a '\n'. Backspace
- * over any white space and terminate it.
- */
- np = name;
- npend = &name[MAXVARLEN];
- while (cp < cpend && np < npend && *cp != ',' && *cp != '='
- && *cp != '\r' && *cp != '\n')
- *np++ = *cp++;
- /*
- * Check if we ran out of name space, without reaching the end or a
- * terminating character
- */
- if (np == npend && !(cp == cpend || *cp == ',' || *cp == '=' ||
- *cp == '\r' || *cp == '\n'))
- return 0;
- while (isspace((int)(*(np-1))))
- np--;
- *np = '\0';
- *vname = name;
-
- /*
- * Check if we hit the end of the buffer or a ','. If so we are done.
- */
- if (cp == cpend || *cp == ',' || *cp == '\r' || *cp == '\n') {
- if (cp != cpend)
- cp++;
- *datap = cp;
- *datalen = cpend - cp;
- *vvalue = (char *)0;
- return 1;
- }
-
- /*
- * So far, so good. Copy out the value
- */
- cp++; /* past '=' */
- while (cp < cpend && (isspace((int)*cp) && *cp != '\r' && *cp != '\n'))
- cp++;
- np = value;
- npend = &value[MAXVALLEN];
- while (cp < cpend && np < npend && ((*cp != ',') || quoted))
- {
- quoted ^= ((*np++ = *cp++) == '"');
- }
-
- /*
- * Check if we overran the value buffer while still in a quoted string
- * or without finding a comma
- */
- if (np == npend && (quoted || *cp != ','))
- return 0;
- /*
- * Trim off any trailing whitespace
- */
- while (np > value && isspace((int)(*(np-1))))
- np--;
- *np = '\0';
-
- /*
- * Return this. All done.
- */
- if (cp != cpend)
- cp++;
- *datap = cp;
- *datalen = cpend - cp;
- *vvalue = value;
- return 1;
-}
-
-
-/*
- * findvar - see if this variable is known to us
- */
-int
-findvar(
- char *varname,
- struct ctl_var *varlist
- )
-{
- register char *np;
- register struct ctl_var *vl;
-
- vl = varlist;
- np = varname;
- while (vl->fmt != EOV) {
- if (vl->fmt != PADDING && STREQ(np, vl->text))
- return vl->code;
- vl++;
- }
- return 0;
-}
-
-
-
-/*
- * printvars - print variables returned in response packet
- */
-void
-printvars(
- int length,
- char *data,
- int status,
- int sttype,
- FILE *fp
- )
-{
- if (rawmode)
- rawprint(sttype, length, data, status, fp);
- else
- cookedprint(sttype, length, data, status, fp);
-}
-
-
-/*
- * rawprint - do a printout of the data in raw mode
- */
-static void
-rawprint(
- int datatype,
- int length,
- char *data,
- int status,
- FILE *fp
- )
-{
- register char *cp;
- register char *cpend;
-
- /*
- * Essentially print the data as is. We reformat unprintables, though.
- */
- cp = data;
- cpend = data + length;
-
- (void) fprintf(fp, "status=0x%04x,\n", status);
-
- while (cp < cpend) {
- if (*cp == '\r') {
- /*
- * If this is a \r and the next character is a
- * \n, supress this, else pretty print it. Otherwise
- * just output the character.
- */
- if (cp == (cpend-1) || *(cp+1) != '\n')
- makeascii(1, cp, fp);
- } else if (isspace((int)*cp) || isprint((int)*cp)) {
- putc(*cp, fp);
- } else {
- makeascii(1, cp, fp);
- }
- cp++;
- }
-}
-
-
-/*
- * Global data used by the cooked output routines
- */
-int out_chars; /* number of characters output */
-int out_linecount; /* number of characters output on this line */
-
-
-/*
- * startoutput - get ready to do cooked output
- */
-static void
-startoutput(void)
-{
- out_chars = 0;
- out_linecount = 0;
-}
-
-
-/*
- * output - output a variable=value combination
- */
-static void
-output(
- FILE *fp,
- char *name,
- char *value
- )
-{
- int lenname;
- int lenvalue;
-
- lenname = strlen(name);
- lenvalue = strlen(value);
-
- if (out_chars != 0) {
- putc(',', fp);
- out_chars++;
- out_linecount++;
- if ((out_linecount + lenname + lenvalue + 3) > MAXOUTLINE) {
- putc('\n', fp);
- out_chars++;
- out_linecount = 0;
- } else {
- putc(' ', fp);
- out_chars++;
- out_linecount++;
- }
- }
-
- fputs(name, fp);
- putc('=', fp);
- fputs(value, fp);
- out_chars += lenname + 1 + lenvalue;
- out_linecount += lenname + 1 + lenvalue;
-}
-
-
-/*
- * endoutput - terminate a block of cooked output
- */
-static void
-endoutput(
- FILE *fp
- )
-{
- if (out_chars != 0)
- putc('\n', fp);
-}
-
-
-/*
- * outputarr - output an array of values
- */
-static void
-outputarr(
- FILE *fp,
- char *name,
- int narr,
- l_fp *lfp
- )
-{
- register char *bp;
- register char *cp;
- register int i;
- register int len;
- char buf[256];
-
- bp = buf;
- /*
- * Hack to align delay and offset values
- */
- for (i = (int)strlen(name); i < 11; i++)
- *bp++ = ' ';
-
- for (i = narr; i > 0; i--) {
- if (i != narr)
- *bp++ = ' ';
- cp = lfptoms(lfp, 2);
- len = strlen(cp);
- if (len > 7) {
- cp[7] = '\0';
- len = 7;
- }
- while (len < 7) {
- *bp++ = ' ';
- len++;
- }
- while (*cp != '\0')
- *bp++ = *cp++;
- lfp++;
- }
- *bp = '\0';
- output(fp, name, buf);
-}
-
-static char *
-tstflags(
- u_long val
- )
-{
- register char *cb, *s;
- register int i;
- register const char *sep;
-
- sep = "";
- i = 0;
- s = cb = &circ_buf[nextcb][0];
- if (++nextcb >= NUMCB)
- nextcb = 0;
-
- sprintf(cb, "%02lx", val);
- cb += strlen(cb);
- if (!val) {
- strcat(cb, " ok");
- cb += strlen(cb);
- } else {
- *cb++ = ' ';
- for (i = 0; i < 11; i++) {
- if (val & 0x1) {
- sprintf(cb, "%s%s", sep, tstflagnames[i]);
- sep = ", ";
- cb += strlen(cb);
- }
- val >>= 1;
- }
- }
- *cb = '\0';
- return s;
-}
-
-/*
- * cookedprint - output variables in cooked mode
- */
-static void
-cookedprint(
- int datatype,
- int length,
- char *data,
- int status,
- FILE *fp
- )
-{
- register int varid;
- char *name;
- char *value;
- char output_raw;
- int fmt;
- struct ctl_var *varlist;
- l_fp lfp;
- long ival;
- struct sockaddr_storage hval;
- u_long uval;
- l_fp lfparr[8];
- int narr;
-
- switch (datatype) {
- case TYPE_PEER:
- varlist = peer_var;
- break;
- case TYPE_SYS:
- varlist = sys_var;
- break;
- case TYPE_CLOCK:
- varlist = clock_var;
- break;
- default:
- (void) fprintf(stderr, "Unknown datatype(0x%x) in cookedprint\n", datatype);
- return;
- }
-
- (void) fprintf(fp, "status=%04x %s,\n", status,
- statustoa(datatype, status));
-
- startoutput();
- while (nextvar(&length, &data, &name, &value)) {
- varid = findvar(name, varlist);
- if (varid == 0) {
- output_raw = '*';
- } else {
- output_raw = 0;
- fmt = varlist[varid].fmt;
- switch(fmt) {
- case TS:
- if (!decodets(value, &lfp))
- output_raw = '?';
- else
- output(fp, name, prettydate(&lfp));
- break;
- case FL:
- case FU:
- case FS:
- if (!decodetime(value, &lfp))
- output_raw = '?';
- else {
- switch (fmt) {
- case FL:
- output(fp, name,
- lfptoms(&lfp, 3));
- break;
- case FU:
- output(fp, name,
- ulfptoms(&lfp, 3));
- break;
- case FS:
- output(fp, name,
- lfptoms(&lfp, 3));
- break;
- }
- }
- break;
-
- case UI:
- if (!decodeuint(value, &uval))
- output_raw = '?';
- else
- output(fp, name, uinttoa(uval));
- break;
-
- case SI:
- if (!decodeint(value, &ival))
- output_raw = '?';
- else
- output(fp, name, inttoa(ival));
- break;
-
- case HA:
- case NA:
- if (!decodenetnum(value, &hval))
- output_raw = '?';
- else if (fmt == HA){
- output(fp, name, nntohost(&hval));
- } else {
- output(fp, name, stoa(&hval));
- }
- break;
-
- case ST:
- output_raw = '*';
- break;
-
- case RF:
- if (decodenetnum(value, &hval)) {
- if ((hval.ss_family == AF_INET) &&
- ISREFCLOCKADR(&hval))
- output(fp, name,
- refnumtoa(&hval));
- else
- output(fp, name, stoa(&hval));
- } else if ((int)strlen(value) <= 4)
- output(fp, name, value);
- else
- output_raw = '?';
- break;
-
- case LP:
- if (!decodeuint(value, &uval) || uval > 3)
- output_raw = '?';
- else {
- char b[3];
- b[0] = b[1] = '0';
- if (uval & 0x2)
- b[0] = '1';
- if (uval & 0x1)
- b[1] = '1';
- b[2] = '\0';
- output(fp, name, b);
- }
- break;
-
- case OC:
- if (!decodeuint(value, &uval))
- output_raw = '?';
- else {
- char b[10];
-
- (void) sprintf(b, "%03lo", uval);
- output(fp, name, b);
- }
- break;
-
- case MD:
- if (!decodeuint(value, &uval))
- output_raw = '?';
- else
- output(fp, name, uinttoa(uval));
- break;
-
- case AR:
- if (!decodearr(value, &narr, lfparr))
- output_raw = '?';
- else
- outputarr(fp, name, narr, lfparr);
- break;
-
- case FX:
- if (!decodeuint(value, &uval))
- output_raw = '?';
- else
- output(fp, name, tstflags(uval));
- break;
-
- default:
- (void) fprintf(stderr,
- "Internal error in cookedprint, %s=%s, fmt %d\n",
- name, value, fmt);
- break;
- }
-
- }
- if (output_raw != 0) {
- char bn[401];
- char bv[401];
- int len;
-
- atoascii(400, name, bn);
- atoascii(400, value, bv);
- if (output_raw != '*') {
- len = strlen(bv);
- bv[len] = output_raw;
- bv[len+1] = '\0';
- }
- output(fp, bn, bv);
- }
- }
- endoutput(fp);
-}
-
-
-/*
- * sortassoc - sort associations in the cache into ascending order
- */
-void
-sortassoc(void)
-{
- if (numassoc > 1)
- qsort(
-#ifdef QSORT_USES_VOID_P
- (void *)
-#else
- (char *)
-#endif
- assoc_cache, (size_t)numassoc,
- sizeof(struct association), assoccmp);
-}
-
-
-/*
- * assoccmp - compare two associations
- */
-#ifdef QSORT_USES_VOID_P
-static int
-assoccmp(
- const void *t1,
- const void *t2
- )
-{
- const struct association *ass1 = (const struct association *)t1;
- const struct association *ass2 = (const struct association *)t2;
-
- if (ass1->assid < ass2->assid)
- return -1;
- if (ass1->assid > ass2->assid)
- return 1;
- return 0;
-}
-#else
-static int
-assoccmp(
- struct association *ass1,
- struct association *ass2
- )
-{
- if (ass1->assid < ass2->assid)
- return -1;
- if (ass1->assid > ass2->assid)
- return 1;
- return 0;
-}
-#endif /* not QSORT_USES_VOID_P */
diff --git a/contrib/ntp/ntpq/ntpq.h b/contrib/ntp/ntpq/ntpq.h
deleted file mode 100644
index 1bb1028..0000000
--- a/contrib/ntp/ntpq/ntpq.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * ntpq.h - definitions of interest to ntpq
- */
-#include "ntp_fp.h"
-#include "ntp.h"
-#include "ntp_control.h"
-#include "ntp_string.h"
-#include "ntp_malloc.h"
-
-/*
- * Maximum number of arguments
- */
-#define MAXARGS 4
-
-/*
- * Flags for forming descriptors.
- */
-#define OPT 0x80 /* this argument is optional, or'd with type */
-
-#define NO 0x0
-#define STR 0x1 /* string argument */
-#define UINT 0x2 /* unsigned integer */
-#define INT 0x3 /* signed integer */
-#define ADD 0x4 /* IP network address */
-#define IP_VERSION 0x5 /* IP address family */
-
-/*
- * Arguments are returned in a union
- */
-typedef union {
- char *string;
- long ival;
- u_long uval;
- struct sockaddr_storage netnum;
-} arg_v;
-
-/*
- * Structure for passing parsed command line
- */
-struct parse {
- const char *keyword;
- arg_v argval[MAXARGS];
- 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) P((struct parse *, FILE *)); /* command handler */
- u_char arg[MAXARGS]; /* descriptors for arguments */
- const char *desc[MAXARGS]; /* descriptions for arguments */
- const char *comment;
-};
-
-/*
- * Structure to hold association data
- */
-struct association {
- u_short assid;
- u_short status;
-};
-
-#define MAXASSOC 1024
-
-/*
- * Structure for translation tables between text format
- * variable indices and text format.
- */
-struct ctl_var {
- u_short code;
- u_short fmt;
- const char *text;
-};
-
-extern void asciize P((int, char *, FILE *));
-extern int getnetnum P((const char *, struct sockaddr_storage *, char *, int));
-extern void sortassoc P((void));
-extern int doquery P((int, int, int, int, char *, u_short *, int *, char **));
-extern char * nntohost P((struct sockaddr_storage *));
-extern int decodets P((char *, l_fp *));
-extern int decodeuint P((char *, u_long *));
-extern int nextvar P((int *, char **, char **, char **));
-extern int decodetime P((char *, l_fp *));
-extern void printvars P((int, char *, int, int, FILE *));
-extern int decodeint P((char *, long *));
-extern int findvar P((char *, struct ctl_var *));
diff --git a/contrib/ntp/ntpq/ntpq_ops.c b/contrib/ntp/ntpq/ntpq_ops.c
deleted file mode 100644
index c493631..0000000
--- a/contrib/ntp/ntpq/ntpq_ops.c
+++ /dev/null
@@ -1,1734 +0,0 @@
-/*
- * ntpq_ops.c - subroutines which are called to perform operations by ntpq
- */
-
-#include <stdio.h>
-#include <ctype.h>
-#include <sys/types.h>
-#include <sys/time.h>
-#include <netdb.h>
-
-#include "ntpq.h"
-#include "ntp_stdlib.h"
-
-extern char * chosts[];
-extern char currenthost[];
-extern int numhosts;
-int maxhostlen;
-
-/*
- * Declarations for command handlers in here
- */
-static int checkassocid P((u_int32));
-static char * strsave P((char *));
-static struct varlist *findlistvar P((struct varlist *, char *));
-static void doaddvlist P((struct varlist *, char *));
-static void dormvlist P((struct varlist *, char *));
-static void doclearvlist P((struct varlist *));
-static void makequerydata P((struct varlist *, int *, char *));
-static int doquerylist P((struct varlist *, int, int, int, u_short *, int *, char **));
-static void doprintvlist P((struct varlist *, FILE *));
-static void addvars P((struct parse *, FILE *));
-static void rmvars P((struct parse *, FILE *));
-static void clearvars P((struct parse *, FILE *));
-static void showvars P((struct parse *, FILE *));
-static int dolist P((struct varlist *, int, int, int, FILE *));
-static void readlist P((struct parse *, FILE *));
-static void writelist P((struct parse *, FILE *));
-static void readvar P((struct parse *, FILE *));
-static void writevar P((struct parse *, FILE *));
-static void clocklist P((struct parse *, FILE *));
-static void clockvar P((struct parse *, FILE *));
-static int findassidrange P((u_int32, u_int32, int *, int *));
-static void mreadlist P((struct parse *, FILE *));
-static void mreadvar P((struct parse *, FILE *));
-static int dogetassoc P((FILE *));
-static void printassoc P((int, FILE *));
-static void associations P((struct parse *, FILE *));
-static void lassociations P((struct parse *, FILE *));
-static void passociations P((struct parse *, FILE *));
-static void lpassociations P((struct parse *, FILE *));
-
-#ifdef UNUSED
-static void radiostatus P((struct parse *, FILE *));
-#endif /* UNUSED */
-
-static void pstatus P((struct parse *, FILE *));
-static long when P((l_fp *, l_fp *, l_fp *));
-static char * prettyinterval P((char *, long));
-static int doprintpeers P((struct varlist *, int, int, int, char *, FILE *, int));
-static int dogetpeers P((struct varlist *, int, FILE *, int));
-static void dopeers P((int, FILE *, int));
-static void peers P((struct parse *, FILE *));
-static void lpeers P((struct parse *, FILE *));
-static void doopeers P((int, FILE *, int));
-static void opeers P((struct parse *, FILE *));
-static void lopeers P((struct parse *, FILE *));
-
-
-/*
- * Commands we understand. Ntpdc imports this.
- */
-struct xcmd opcmds[] = {
- { "associations", associations, { NO, NO, NO, NO },
- { "", "", "", "" },
- "print list of association ID's and statuses for the server's peers" },
- { "passociations", passociations, { NO, NO, NO, NO },
- { "", "", "", "" },
- "print list of associations returned by last associations command" },
- { "lassociations", lassociations, { NO, NO, NO, NO },
- { "", "", "", "" },
- "print list of associations including all client information" },
- { "lpassociations", lpassociations, { NO, NO, NO, NO },
- { "", "", "", "" },
- "print last obtained list of associations, including client information" },
- { "addvars", addvars, { STR, NO, NO, NO },
- { "name[=value][,...]", "", "", "" },
- "add variables to the variable list or change their values" },
- { "rmvars", rmvars, { STR, NO, NO, NO },
- { "name[,...]", "", "", "" },
- "remove variables from the variable list" },
- { "clearvars", clearvars, { NO, NO, NO, NO },
- { "", "", "", "" },
- "remove all variables from the variable list" },
- { "showvars", showvars, { NO, NO, NO, NO },
- { "", "", "", "" },
- "print variables on the variable list" },
- { "readlist", readlist, { OPT|UINT, NO, NO, NO },
- { "assocID", "", "", "" },
- "read the system or peer variables included in the variable list" },
- { "rl", readlist, { OPT|UINT, NO, NO, NO },
- { "assocID", "", "", "" },
- "read the system or peer variables included in the variable list" },
- { "writelist", writelist, { OPT|UINT, NO, NO, NO },
- { "assocID", "", "", "" },
- "write the system or peer variables included in the variable list" },
- { "readvar", readvar, { OPT|UINT, OPT|STR, NO, NO },
- { "assocID", "name=value[,...]", "", "" },
- "read system or peer variables" },
- { "rv", readvar, { OPT|UINT, OPT|STR, NO, NO },
- { "assocID", "name=value[,...]", "", "" },
- "read system or peer variables" },
- { "writevar", writevar, { UINT, STR, NO, NO },
- { "assocID", "name=value,[...]", "", "" },
- "write system or peer variables" },
- { "mreadlist", mreadlist, { UINT, UINT, NO, NO },
- { "assocID", "assocID", "", "" },
- "read the peer variables in the variable list for multiple peers" },
- { "mrl", mreadlist, { UINT, UINT, NO, NO },
- { "assocID", "assocID", "", "" },
- "read the peer variables in the variable list for multiple peers" },
- { "mreadvar", mreadvar, { UINT, UINT, OPT|STR, NO },
- { "assocID", "assocID", "name=value[,...]", "" },
- "read peer variables from multiple peers" },
- { "mrv", mreadvar, { UINT, UINT, OPT|STR, NO },
- { "assocID", "assocID", "name=value[,...]", "" },
- "read peer variables from multiple peers" },
- { "clocklist", clocklist, { OPT|UINT, NO, NO, NO },
- { "assocID", "", "", "" },
- "read the clock variables included in the variable list" },
- { "cl", clocklist, { OPT|UINT, NO, NO, NO },
- { "assocID", "", "", "" },
- "read the clock variables included in the variable list" },
- { "clockvar", clockvar, { OPT|UINT, OPT|STR, NO, NO },
- { "assocID", "name=value[,...]", "", "" },
- "read clock variables" },
- { "cv", clockvar, { OPT|UINT, OPT|STR, NO, NO },
- { "assocID", "name=value[,...]", "", "" },
- "read clock variables" },
- { "pstatus", pstatus, { UINT, NO, NO, NO },
- { "assocID", "", "", "" },
- "print status information returned for a peer" },
- { "peers", peers, { OPT|IP_VERSION, NO, NO, NO },
- { "-4|-6", "", "", "" },
- "obtain and print a list of the server's peers [IP version]" },
- { "lpeers", lpeers, { OPT|IP_VERSION, NO, NO, NO },
- { "-4|-6", "", "", "" },
- "obtain and print a list of all peers and clients [IP version]" },
- { "opeers", opeers, { OPT|IP_VERSION, NO, NO, NO },
- { "-4|-6", "", "", "" },
- "print peer list the old way, with dstadr shown rather than refid [IP version]" },
- { "lopeers", lopeers, { OPT|IP_VERSION, NO, NO, NO },
- { "-4|-6", "", "", "" },
- "obtain and print a list of all peers and clients showing dstadr [IP version]" },
- { 0, 0, { NO, NO, NO, NO },
- { "-4|-6", "", "", "" }, "" }
-};
-
-
-/*
- * Variable list data space
- */
-#define MAXLIST 64 /* maximum number of variables in list */
-#define LENHOSTNAME 256 /* host name is 256 characters long */
-/*
- * Old CTL_PST defines for version 2.
- */
-#define OLD_CTL_PST_CONFIG 0x80
-#define OLD_CTL_PST_AUTHENABLE 0x40
-#define OLD_CTL_PST_AUTHENTIC 0x20
-#define OLD_CTL_PST_REACH 0x10
-#define OLD_CTL_PST_SANE 0x08
-#define OLD_CTL_PST_DISP 0x04
-#define OLD_CTL_PST_SEL_REJECT 0
-#define OLD_CTL_PST_SEL_SELCAND 1
-#define OLD_CTL_PST_SEL_SYNCCAND 2
-#define OLD_CTL_PST_SEL_SYSPEER 3
-
-
-char flash2[] = " .+* "; /* flash decode for version 2 */
-char flash3[] = " x.-+#*o"; /* flash decode for peer status version 3 */
-
-struct varlist {
- char *name;
- char *value;
-} varlist[MAXLIST] = { { 0, 0 } };
-
-/*
- * Imported from ntpq.c
- */
-extern int showhostnames;
-extern int rawmode;
-extern struct servent *server_entry;
-extern struct association assoc_cache[];
-extern int numassoc;
-extern u_char pktversion;
-extern struct ctl_var peer_var[];
-
-/*
- * For quick string comparisons
- */
-#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0)
-
-
-/*
- * checkassocid - return the association ID, checking to see if it is valid
- */
-static int
-checkassocid(
- u_int32 value
- )
-{
- if (value == 0 || value >= 65536) {
- (void) fprintf(stderr, "***Invalid association ID specified\n");
- return 0;
- }
- return (int)value;
-}
-
-
-/*
- * strsave - save a string
- * XXX - should be in libntp.a
- */
-static char *
-strsave(
- char *str
- )
-{
- char *cp;
- u_int len;
-
- len = strlen(str) + 1;
- if ((cp = (char *)malloc(len)) == NULL) {
- (void) fprintf(stderr, "Malloc failed!!\n");
- exit(1);
- }
-
- memmove(cp, str, len);
- return (cp);
-}
-
-
-/*
- * findlistvar - look for the named variable in a list and return if found
- */
-static struct varlist *
-findlistvar(
- struct varlist *list,
- char *name
- )
-{
- register struct varlist *vl;
-
- for (vl = list; vl < list + MAXLIST && vl->name != 0; vl++)
- if (STREQ(name, vl->name))
- return vl;
- if (vl < list + MAXLIST)
- return vl;
- return (struct varlist *)0;
-}
-
-
-/*
- * doaddvlist - add variable(s) to the variable list
- */
-static void
-doaddvlist(
- struct varlist *vlist,
- char *vars
- )
-{
- register struct varlist *vl;
- int len;
- char *name;
- char *value;
-
- len = strlen(vars);
- while (nextvar(&len, &vars, &name, &value)) {
- vl = findlistvar(vlist, name);
- if (vl == 0) {
- (void) fprintf(stderr, "Variable list full\n");
- return;
- }
-
- if (vl->name == 0) {
- vl->name = strsave(name);
- } else if (vl->value != 0) {
- free(vl->value);
- vl->value = 0;
- }
-
- if (value != 0)
- vl->value = strsave(value);
- }
-}
-
-
-/*
- * dormvlist - remove variable(s) from the variable list
- */
-static void
-dormvlist(
- struct varlist *vlist,
- char *vars
- )
-{
- register struct varlist *vl;
- int len;
- char *name;
- char *value;
-
- len = strlen(vars);
- while (nextvar(&len, &vars, &name, &value)) {
- vl = findlistvar(vlist, name);
- if (vl == 0 || vl->name == 0) {
- (void) fprintf(stderr, "Variable `%s' not found\n",
- name);
- } else {
- free((void *)vl->name);
- if (vl->value != 0)
- free(vl->value);
- for ( ; (vl+1) < (varlist+MAXLIST)
- && (vl+1)->name != 0; vl++) {
- vl->name = (vl+1)->name;
- vl->value = (vl+1)->value;
- }
- vl->name = vl->value = 0;
- }
- }
-}
-
-
-/*
- * doclearvlist - clear a variable list
- */
-static void
-doclearvlist(
- struct varlist *vlist
- )
-{
- register struct varlist *vl;
-
- for (vl = vlist; vl < vlist + MAXLIST && vl->name != 0; vl++) {
- free((void *)vl->name);
- vl->name = 0;
- if (vl->value != 0) {
- free(vl->value);
- vl->value = 0;
- }
- }
-}
-
-
-/*
- * makequerydata - form a data buffer to be included with a query
- */
-static void
-makequerydata(
- struct varlist *vlist,
- int *datalen,
- char *data
- )
-{
- register struct varlist *vl;
- register char *cp, *cpend;
- register int namelen, valuelen;
- register int totallen;
-
- cp = data;
- cpend = data + *datalen;
-
- for (vl = vlist; vl < vlist + MAXLIST && vl->name != 0; vl++) {
- namelen = strlen(vl->name);
- if (vl->value == 0)
- valuelen = 0;
- else
- valuelen = strlen(vl->value);
- totallen = namelen + valuelen + (valuelen != 0) + (cp != data);
- if (cp + totallen > cpend)
- break;
-
- if (cp != data)
- *cp++ = ',';
- memmove(cp, vl->name, (unsigned)namelen);
- cp += namelen;
- if (valuelen != 0) {
- *cp++ = '=';
- memmove(cp, vl->value, (unsigned)valuelen);
- cp += valuelen;
- }
- }
- *datalen = cp - data;
-}
-
-
-/*
- * doquerylist - send a message including variables in a list
- */
-static int
-doquerylist(
- struct varlist *vlist,
- int op,
- int associd,
- int auth,
- u_short *rstatus,
- int *dsize,
- char **datap
- )
-{
- char data[CTL_MAX_DATA_LEN];
- int datalen;
-
- datalen = sizeof(data);
- makequerydata(vlist, &datalen, data);
-
- return doquery(op, associd, auth, datalen, data, rstatus,
- dsize, datap);
-}
-
-
-/*
- * doprintvlist - print the variables on a list
- */
-static void
-doprintvlist(
- struct varlist *vlist,
- FILE *fp
- )
-{
- register struct varlist *vl;
-
- if (vlist->name == 0) {
- (void) fprintf(fp, "No variables on list\n");
- } else {
- for (vl = vlist; vl < vlist + MAXLIST && vl->name != 0; vl++) {
- if (vl->value == 0) {
- (void) fprintf(fp, "%s\n", vl->name);
- } else {
- (void) fprintf(fp, "%s=%s\n",
- vl->name, vl->value);
- }
- }
- }
-}
-
-
-/*
- * addvars - add variables to the variable list
- */
-/*ARGSUSED*/
-static void
-addvars(
- struct parse *pcmd,
- FILE *fp
- )
-{
- doaddvlist(varlist, pcmd->argval[0].string);
-}
-
-
-/*
- * rmvars - remove variables from the variable list
- */
-/*ARGSUSED*/
-static void
-rmvars(
- struct parse *pcmd,
- FILE *fp
- )
-{
- dormvlist(varlist, pcmd->argval[0].string);
-}
-
-
-/*
- * clearvars - clear the variable list
- */
-/*ARGSUSED*/
-static void
-clearvars(
- struct parse *pcmd,
- FILE *fp
- )
-{
- doclearvlist(varlist);
-}
-
-
-/*
- * showvars - show variables on the variable list
- */
-/*ARGSUSED*/
-static void
-showvars(
- struct parse *pcmd,
- FILE *fp
- )
-{
- doprintvlist(varlist, fp);
-}
-
-
-/*
- * dolist - send a request with the given list of variables
- */
-static int
-dolist(
- struct varlist *vlist,
- int associd,
- int op,
- int type,
- FILE *fp
- )
-{
- char *datap;
- int res;
- int dsize;
- u_short rstatus;
-
- res = doquerylist(vlist, op, associd, 0, &rstatus, &dsize, &datap);
-
- if (res != 0)
- return 0;
-
- if (dsize == 0) {
- if (associd == 0)
- (void) fprintf(fp, "No system%s variables returned\n",
- (type == TYPE_CLOCK) ? " clock" : "");
- else
- (void) fprintf(fp,
- "No information returned for%s association %u\n",
- (type == TYPE_CLOCK) ? " clock" : "", associd);
- return 1;
- }
-
- printvars(dsize, datap, (int)rstatus, type, fp);
- return 1;
-}
-
-
-/*
- * readlist - send a read variables request with the variables on the list
- */
-static void
-readlist(
- struct parse *pcmd,
- FILE *fp
- )
-{
- int associd;
-
- if (pcmd->nargs == 0) {
- associd = 0;
- } else {
- /* HMS: I think we want the u_int32 target here, not the u_long */
- if (pcmd->argval[0].uval == 0)
- associd = 0;
- else if ((associd = checkassocid(pcmd->argval[0].uval)) == 0)
- return;
- }
-
- (void) dolist(varlist, associd, CTL_OP_READVAR,
- (associd == 0) ? TYPE_SYS : TYPE_PEER, fp);
-}
-
-
-/*
- * writelist - send a write variables request with the variables on the list
- */
-static void
-writelist(
- struct parse *pcmd,
- FILE *fp
- )
-{
- char *datap;
- int res;
- int associd;
- int dsize;
- u_short rstatus;
-
- if (pcmd->nargs == 0) {
- associd = 0;
- } else {
- /* HMS: Do we really want uval here? */
- if (pcmd->argval[0].uval == 0)
- associd = 0;
- else if ((associd = checkassocid(pcmd->argval[0].uval)) == 0)
- return;
- }
-
- res = doquerylist(varlist, CTL_OP_WRITEVAR, associd, 1, &rstatus,
- &dsize, &datap);
-
- if (res != 0)
- return;
-
- if (dsize == 0)
- (void) fprintf(fp, "done! (no data returned)\n");
- else
- printvars(dsize, datap, (int)rstatus,
- (associd != 0) ? TYPE_PEER : TYPE_SYS, fp);
- return;
-}
-
-
-/*
- * readvar - send a read variables request with the specified variables
- */
-static void
-readvar(
- struct parse *pcmd,
- FILE *fp
- )
-{
- int associd;
- struct varlist tmplist[MAXLIST];
-
- /* HMS: uval? */
- if (pcmd->nargs == 0 || pcmd->argval[0].uval == 0)
- associd = 0;
- else if ((associd = checkassocid(pcmd->argval[0].uval)) == 0)
- return;
-
- memset((char *)tmplist, 0, sizeof(tmplist));
- if (pcmd->nargs >= 2)
- doaddvlist(tmplist, pcmd->argval[1].string);
-
- (void) dolist(tmplist, associd, CTL_OP_READVAR,
- (associd == 0) ? TYPE_SYS : TYPE_PEER, fp);
-
- doclearvlist(tmplist);
-}
-
-
-/*
- * writevar - send a write variables request with the specified variables
- */
-static void
-writevar(
- struct parse *pcmd,
- FILE *fp
- )
-{
- char *datap;
- int res;
- int associd;
- int dsize;
- u_short rstatus;
- struct varlist tmplist[MAXLIST];
-
- /* HMS: uval? */
- if (pcmd->argval[0].uval == 0)
- associd = 0;
- else if ((associd = checkassocid(pcmd->argval[0].uval)) == 0)
- return;
-
- memset((char *)tmplist, 0, sizeof(tmplist));
- doaddvlist(tmplist, pcmd->argval[1].string);
-
- res = doquerylist(tmplist, CTL_OP_WRITEVAR, associd, 1, &rstatus,
- &dsize, &datap);
-
- doclearvlist(tmplist);
-
- if (res != 0)
- return;
-
- if (dsize == 0)
- (void) fprintf(fp, "done! (no data returned)\n");
- else
- printvars(dsize, datap, (int)rstatus,
- (associd != 0) ? TYPE_PEER : TYPE_SYS, fp);
- return;
-}
-
-
-/*
- * clocklist - send a clock variables request with the variables on the list
- */
-static void
-clocklist(
- struct parse *pcmd,
- FILE *fp
- )
-{
- int associd;
-
- /* HMS: uval? */
- if (pcmd->nargs == 0) {
- associd = 0;
- } else {
- if (pcmd->argval[0].uval == 0)
- associd = 0;
- else if ((associd = checkassocid(pcmd->argval[0].uval)) == 0)
- return;
- }
-
- (void) dolist(varlist, associd, CTL_OP_READCLOCK, TYPE_CLOCK, fp);
-}
-
-
-/*
- * clockvar - send a clock variables request with the specified variables
- */
-static void
-clockvar(
- struct parse *pcmd,
- FILE *fp
- )
-{
- int associd;
- struct varlist tmplist[MAXLIST];
-
- /* HMS: uval? */
- if (pcmd->nargs == 0 || pcmd->argval[0].uval == 0)
- associd = 0;
- else if ((associd = checkassocid(pcmd->argval[0].uval)) == 0)
- return;
-
- memset((char *)tmplist, 0, sizeof(tmplist));
- if (pcmd->nargs >= 2)
- doaddvlist(tmplist, pcmd->argval[1].string);
-
- (void) dolist(tmplist, associd, CTL_OP_READCLOCK, TYPE_CLOCK, fp);
-
- doclearvlist(tmplist);
-}
-
-
-/*
- * findassidrange - verify a range of association ID's
- */
-static int
-findassidrange(
- u_int32 assid1,
- u_int32 assid2,
- int *from,
- int *to
- )
-{
- register int i;
- int f, t;
-
- if (assid1 == 0 || assid1 > 65535) {
- (void) fprintf(stderr,
- "***Invalid association ID %lu specified\n", (u_long)assid1);
- return 0;
- }
-
- if (assid2 == 0 || assid2 > 65535) {
- (void) fprintf(stderr,
- "***Invalid association ID %lu specified\n", (u_long)assid2);
- return 0;
- }
-
- f = t = -1;
- for (i = 0; i < numassoc; i++) {
- if (assoc_cache[i].assid == assid1) {
- f = i;
- if (t != -1)
- break;
- }
- if (assoc_cache[i].assid == assid2) {
- t = i;
- if (f != -1)
- break;
- }
- }
-
- if (f == -1 || t == -1) {
- (void) fprintf(stderr,
- "***Association ID %lu not found in list\n",
- (f == -1) ? (u_long)assid1 : (u_long)assid2);
- return 0;
- }
-
- if (f < t) {
- *from = f;
- *to = t;
- } else {
- *from = t;
- *to = f;
- }
- return 1;
-}
-
-
-
-/*
- * mreadlist - send a read variables request for multiple associations
- */
-static void
-mreadlist(
- struct parse *pcmd,
- FILE *fp
- )
-{
- int i;
- int from;
- int to;
-
- /* HMS: uval? */
- if (!findassidrange(pcmd->argval[0].uval, pcmd->argval[1].uval,
- &from, &to))
- return;
-
- for (i = from; i <= to; i++) {
- if (i != from)
- (void) fprintf(fp, "\n");
- if (!dolist(varlist, (int)assoc_cache[i].assid,
- CTL_OP_READVAR, TYPE_PEER, fp))
- return;
- }
- return;
-}
-
-
-/*
- * mreadvar - send a read variables request for multiple associations
- */
-static void
-mreadvar(
- struct parse *pcmd,
- FILE *fp
- )
-{
- int i;
- int from;
- int to;
- struct varlist tmplist[MAXLIST];
-
- /* HMS: uval? */
- if (!findassidrange(pcmd->argval[0].uval, pcmd->argval[1].uval,
- &from, &to))
- return;
-
- memset((char *)tmplist, 0, sizeof(tmplist));
- if (pcmd->nargs >= 3)
- doaddvlist(tmplist, pcmd->argval[2].string);
-
- for (i = from; i <= to; i++) {
- if (i != from)
- (void) fprintf(fp, "\n");
- if (!dolist(varlist, (int)assoc_cache[i].assid,
- CTL_OP_READVAR, TYPE_PEER, fp))
- break;
- }
- doclearvlist(tmplist);
- return;
-}
-
-
-/*
- * dogetassoc - query the host for its list of associations
- */
-static int
-dogetassoc(
- FILE *fp
- )
-{
- u_short *datap;
- int res;
- int dsize;
- u_short rstatus;
-
- res = doquery(CTL_OP_READSTAT, 0, 0, 0, (char *)0, &rstatus,
- &dsize, (void *)&datap);
-
- if (res != 0)
- return 0;
-
- if (dsize == 0) {
- (void) fprintf(fp, "No association ID's returned\n");
- return 0;
- }
-
- if (dsize & 0x3) {
- (void) fprintf(stderr,
- "***Server returned %d octets, should be multiple of 4\n",
- dsize);
- return 0;
- }
-
- numassoc = 0;
- while (dsize > 0) {
- assoc_cache[numassoc].assid = ntohs(*datap);
- datap++;
- assoc_cache[numassoc].status = ntohs(*datap);
- datap++;
- if (++numassoc >= MAXASSOC)
- break;
- dsize -= sizeof(u_short) + sizeof(u_short);
- }
- sortassoc();
- return 1;
-}
-
-
-/*
- * printassoc - print the current list of associations
- */
-static void
-printassoc(
- int showall,
- FILE *fp
- )
-{
- register char *bp;
- int i;
- u_char statval;
- int event;
- u_long event_count;
- const char *conf;
- const char *reach;
- const char *auth;
- const char *condition = "";
- const char *last_event;
- const char *cnt;
- char buf[128];
-
- if (numassoc == 0) {
- (void) fprintf(fp, "No association ID's in list\n");
- return;
- }
-
- /*
- * Output a header
- */
- (void) fprintf(fp,
- "ind assID status conf reach auth condition last_event cnt\n");
- (void) fprintf(fp,
- "===========================================================\n");
- for (i = 0; i < numassoc; i++) {
- statval = (u_char) CTL_PEER_STATVAL(assoc_cache[i].status);
- if (!showall && !(statval & (CTL_PST_CONFIG|CTL_PST_REACH)))
- continue;
- event = CTL_PEER_EVENT(assoc_cache[i].status);
- event_count = CTL_PEER_NEVNT(assoc_cache[i].status);
- if (statval & CTL_PST_CONFIG)
- conf = "yes";
- else
- conf = "no";
- if (statval & CTL_PST_REACH || 1) {
- reach = "yes";
- if (statval & CTL_PST_AUTHENABLE) {
- if (statval & CTL_PST_AUTHENTIC)
- auth = "ok ";
- else
- auth = "bad";
- } else
- auth = "none";
-
- if (pktversion > NTP_OLDVERSION)
- switch (statval & 0x7) {
- case CTL_PST_SEL_REJECT:
- condition = "reject";
- break;
- case CTL_PST_SEL_SANE:
- condition = "falsetick";
- break;
- case CTL_PST_SEL_CORRECT:
- condition = "excess";
- break;
- case CTL_PST_SEL_SELCAND:
- condition = "outlyer";
- break;
- case CTL_PST_SEL_SYNCCAND:
- condition = "candidat";
- break;
- case CTL_PST_SEL_DISTSYSPEER:
- condition = "selected";
- break;
- case CTL_PST_SEL_SYSPEER:
- condition = "sys.peer";
- break;
- case CTL_PST_SEL_PPS:
- condition = "pps.peer";
- break;
- }
- else
- switch (statval & 0x3) {
- case OLD_CTL_PST_SEL_REJECT:
- if (!(statval & OLD_CTL_PST_SANE))
- condition = "insane";
- else if (!(statval & OLD_CTL_PST_DISP))
- condition = "hi_disp";
- else
- condition = "";
- break;
- case OLD_CTL_PST_SEL_SELCAND:
- condition = "sel_cand";
- break;
- case OLD_CTL_PST_SEL_SYNCCAND:
- condition = "sync_cand";
- break;
- case OLD_CTL_PST_SEL_SYSPEER:
- condition = "sys_peer";
- break;
- }
-
- } else {
- reach = "no";
- auth = condition = "";
- }
-
- switch (PEER_EVENT|event) {
- case EVNT_PEERIPERR:
- last_event = "IP error";
- break;
- case EVNT_PEERAUTH:
- last_event = "auth fail";
- break;
- case EVNT_UNREACH:
- last_event = "lost reach";
- break;
- case EVNT_REACH:
- last_event = "reachable";
- break;
- case EVNT_PEERCLOCK:
- last_event = "clock expt";
- break;
-#if 0
- case EVNT_PEERSTRAT:
- last_event = "stratum chg";
- break;
-#endif
- default:
- last_event = "";
- break;
- }
-
- if (event_count != 0)
- cnt = uinttoa(event_count);
- else
- cnt = "";
- (void) sprintf(buf,
- "%3d %5u %04x %3.3s %4s %4.4s %9.9s %11s %2s",
- i+1, assoc_cache[i].assid, assoc_cache[i].status,
- conf, reach, auth, condition, last_event, cnt);
- bp = &buf[strlen(buf)];
- while (bp > buf && *(bp-1) == ' ')
- *(--bp) = '\0';
- (void) fprintf(fp, "%s\n", buf);
- }
-}
-
-
-
-/*
- * associations - get, record and print a list of associations
- */
-/*ARGSUSED*/
-static void
-associations(
- struct parse *pcmd,
- FILE *fp
- )
-{
- if (dogetassoc(fp))
- printassoc(0, fp);
-}
-
-
-/*
- * lassociations - get, record and print a long list of associations
- */
-/*ARGSUSED*/
-static void
-lassociations(
- struct parse *pcmd,
- FILE *fp
- )
-{
- if (dogetassoc(fp))
- printassoc(1, fp);
-}
-
-
-/*
- * passociations - print the association list
- */
-/*ARGSUSED*/
-static void
-passociations(
- struct parse *pcmd,
- FILE *fp
- )
-{
- printassoc(0, fp);
-}
-
-
-/*
- * lpassociations - print the long association list
- */
-/*ARGSUSED*/
-static void
-lpassociations(
- struct parse *pcmd,
- FILE *fp
- )
-{
- printassoc(1, fp);
-}
-
-
-#ifdef UNUSED
-/*
- * radiostatus - print the radio status returned by the server
- */
-/*ARGSUSED*/
-static void
-radiostatus(
- struct parse *pcmd,
- FILE *fp
- )
-{
- char *datap;
- int res;
- int dsize;
- u_short rstatus;
-
- res = doquery(CTL_OP_READCLOCK, 0, 0, 0, (char *)0, &rstatus,
- &dsize, &datap);
-
- if (res != 0)
- return;
-
- if (dsize == 0) {
- (void) fprintf(fp, "No radio status string returned\n");
- return;
- }
-
- asciize(dsize, datap, fp);
-}
-#endif /* UNUSED */
-
-/*
- * pstatus - print peer status returned by the server
- */
-static void
-pstatus(
- struct parse *pcmd,
- FILE *fp
- )
-{
- char *datap;
- int res;
- int associd;
- int dsize;
- u_short rstatus;
-
- /* HMS: uval? */
- if ((associd = checkassocid(pcmd->argval[0].uval)) == 0)
- return;
-
- res = doquery(CTL_OP_READSTAT, associd, 0, 0, (char *)0, &rstatus,
- &dsize, &datap);
-
- if (res != 0)
- return;
-
- if (dsize == 0) {
- (void) fprintf(fp,
- "No information returned for association %u\n",
- associd);
- return;
- }
-
- printvars(dsize, datap, (int)rstatus, TYPE_PEER, fp);
-}
-
-
-/*
- * when - print how long its been since his last packet arrived
- */
-static long
-when(
- l_fp *ts,
- l_fp *rec,
- l_fp *reftime
- )
-{
- l_fp *lasttime;
-
- if (rec->l_ui != 0)
- lasttime = rec;
- else if (reftime->l_ui != 0)
- lasttime = reftime;
- else
- return 0;
-
- return (ts->l_ui - lasttime->l_ui);
-}
-
-
-/*
- * Pretty-print an interval into the given buffer, in a human-friendly format.
- */
-static char *
-prettyinterval(
- char *buf,
- long diff
- )
-{
- if (diff <= 0) {
- buf[0] = '-';
- buf[1] = 0;
- return buf;
- }
-
- if (diff <= 2048) {
- (void) sprintf(buf, "%ld", (long int)diff);
- return buf;
- }
-
- diff = (diff + 29) / 60;
- if (diff <= 300) {
- (void) sprintf(buf, "%ldm", (long int)diff);
- return buf;
- }
-
- diff = (diff + 29) / 60;
- if (diff <= 96) {
- (void) sprintf(buf, "%ldh", (long int)diff);
- return buf;
- }
-
- diff = (diff + 11) / 24;
- (void) sprintf(buf, "%ldd", (long int)diff);
- return buf;
-}
-
-static char
-decodeaddrtype(
- struct sockaddr_storage *sock
- )
-{
- char ch = '-';
- u_int32 dummy;
- struct sockaddr_in6 *sin6;
-
- switch(sock->ss_family) {
- case AF_INET:
- dummy = ((struct sockaddr_in *)sock)->sin_addr.s_addr;
- dummy = ntohl(dummy);
- ch = (char)(((dummy&0xf0000000)==0xe0000000) ? 'm' :
- ((dummy&0x000000ff)==0x000000ff) ? 'b' :
- ((dummy&0xffffffff)==0x7f000001) ? 'l' :
- ((dummy&0xffffffe0)==0x00000000) ? '-' :
- 'u');
- break;
- case AF_INET6:
- sin6 = (struct sockaddr_in6 *)sock;
- if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
- ch = 'm';
- else
- ch = 'u';
- break;
- default:
- ch = '-';
- break;
- }
- return ch;
-}
-
-/*
- * A list of variables required by the peers command
- */
-struct varlist opeervarlist[] = {
- { "srcadr", 0 }, /* 0 */
- { "dstadr", 0 }, /* 1 */
- { "stratum", 0 }, /* 2 */
- { "hpoll", 0 }, /* 3 */
- { "ppoll", 0 }, /* 4 */
- { "reach", 0 }, /* 5 */
- { "delay", 0 }, /* 6 */
- { "offset", 0 }, /* 7 */
- { "jitter", 0 }, /* 8 */
- { "dispersion", 0 }, /* 9 */
- { "rec", 0 }, /* 10 */
- { "reftime", 0 }, /* 11 */
- { "srcport", 0 }, /* 12 */
- { 0, 0 }
-};
-
-struct varlist peervarlist[] = {
- { "srcadr", 0 }, /* 0 */
- { "refid", 0 }, /* 1 */
- { "stratum", 0 }, /* 2 */
- { "hpoll", 0 }, /* 3 */
- { "ppoll", 0 }, /* 4 */
- { "reach", 0 }, /* 5 */
- { "delay", 0 }, /* 6 */
- { "offset", 0 }, /* 7 */
- { "jitter", 0 }, /* 8 */
- { "dispersion", 0 }, /* 9 */
- { "rec", 0 }, /* 10 */
- { "reftime", 0 }, /* 11 */
- { "srcport", 0 }, /* 12 */
- { 0, 0 }
-};
-
-#define HAVE_SRCADR 0
-#define HAVE_DSTADR 1
-#define HAVE_REFID 1
-#define HAVE_STRATUM 2
-#define HAVE_HPOLL 3
-#define HAVE_PPOLL 4
-#define HAVE_REACH 5
-#define HAVE_DELAY 6
-#define HAVE_OFFSET 7
-#define HAVE_JITTER 8
-#define HAVE_DISPERSION 9
-#define HAVE_REC 10
-#define HAVE_REFTIME 11
-#define HAVE_SRCPORT 12
-#define MAXHAVE 13
-
-/*
- * Decode an incoming data buffer and print a line in the peer list
- */
-static int
-doprintpeers(
- struct varlist *pvl,
- int associd,
- int rstatus,
- int datalen,
- char *data,
- FILE *fp,
- int af
- )
-{
- char *name;
- char *value = NULL;
- int i;
- int c;
-
- struct sockaddr_storage srcadr;
- struct sockaddr_storage dstadr;
- u_long srcport = 0;
- char *dstadr_refid = "0.0.0.0";
- u_long stratum = 0;
- long ppoll = 0;
- long hpoll = 0;
- u_long reach = 0;
- l_fp estoffset;
- l_fp estdelay;
- l_fp estjitter;
- l_fp estdisp;
- l_fp reftime;
- l_fp rec;
- l_fp ts;
- u_char havevar[MAXHAVE];
- u_long poll_sec;
- char type = '?';
- char refid_string[10];
- char whenbuf[8], pollbuf[8];
- char clock_name[LENHOSTNAME];
-
- memset((char *)havevar, 0, sizeof(havevar));
- get_systime(&ts);
-
- memset((char *)&srcadr, 0, sizeof(struct sockaddr_storage));
- memset((char *)&dstadr, 0, sizeof(struct sockaddr_storage));
-
- /* Initialize by zeroing out estimate variables */
- memset((char *)&estoffset, 0, sizeof(l_fp));
- memset((char *)&estdelay, 0, sizeof(l_fp));
- memset((char *)&estjitter, 0, sizeof(l_fp));
- memset((char *)&estdisp, 0, sizeof(l_fp));
-
- while (nextvar(&datalen, &data, &name, &value)) {
- struct sockaddr_storage dum_store;
-
- i = findvar(name, peer_var);
- if (i == 0)
- continue; /* don't know this one */
- switch (i) {
- case CP_SRCADR:
- if (decodenetnum(value, &srcadr))
- havevar[HAVE_SRCADR] = 1;
- break;
- case CP_DSTADR:
- if (decodenetnum(value, &dum_store))
- type = decodeaddrtype(&dum_store);
- if (pvl == opeervarlist) {
- if (decodenetnum(value, &dstadr)) {
- havevar[HAVE_DSTADR] = 1;
- dstadr_refid = stoa(&dstadr);
- }
- }
- break;
- case CP_REFID:
- if (pvl == peervarlist) {
- havevar[HAVE_REFID] = 1;
- if (*value == '\0') {
- dstadr_refid = "0.0.0.0";
- } else if (decodenetnum(value, &dstadr)) {
- if (SOCKNUL(&dstadr))
- dstadr_refid = "0.0.0.0";
- else if ((dstadr.ss_family == AF_INET)
- && ISREFCLOCKADR(&dstadr))
- dstadr_refid =
- refnumtoa(&dstadr);
- else
- dstadr_refid =
- stoa(&dstadr);
- } else if ((int)strlen(value) <= 4) {
- refid_string[0] = '.';
- (void) strcpy(&refid_string[1], value);
- i = strlen(refid_string);
- refid_string[i] = '.';
- refid_string[i+1] = '\0';
- dstadr_refid = refid_string;
- } else {
- havevar[HAVE_REFID] = 0;
- }
- }
- break;
- case CP_STRATUM:
- if (decodeuint(value, &stratum))
- havevar[HAVE_STRATUM] = 1;
- break;
- case CP_HPOLL:
- if (decodeint(value, &hpoll)) {
- havevar[HAVE_HPOLL] = 1;
- if (hpoll < 0)
- hpoll = NTP_MINPOLL;
- }
- break;
- case CP_PPOLL:
- if (decodeint(value, &ppoll)) {
- havevar[HAVE_PPOLL] = 1;
- if (ppoll < 0)
- ppoll = NTP_MINPOLL;
- }
- break;
- case CP_REACH:
- if (decodeuint(value, &reach))
- havevar[HAVE_REACH] = 1;
- break;
- case CP_DELAY:
- if (decodetime(value, &estdelay))
- havevar[HAVE_DELAY] = 1;
- break;
- case CP_OFFSET:
- if (decodetime(value, &estoffset))
- havevar[HAVE_OFFSET] = 1;
- break;
- case CP_JITTER:
- if (decodetime(value, &estjitter))
- havevar[HAVE_JITTER] = 1;
- break;
- case CP_DISPERSION:
- if (decodetime(value, &estdisp))
- havevar[HAVE_DISPERSION] = 1;
- break;
- case CP_REC:
- if (decodets(value, &rec))
- havevar[HAVE_REC] = 1;
- break;
- case CP_SRCPORT:
- if (decodeuint(value, &srcport))
- havevar[HAVE_SRCPORT] = 1;
- break;
- case CP_REFTIME:
- havevar[HAVE_REFTIME] = 1;
- if (!decodets(value, &reftime))
- L_CLR(&reftime);
- break;
- default:
- break;
- }
- }
-
- /*
- * Check to see if the srcport is NTP's port. If not this probably
- * isn't a valid peer association.
- */
- if (havevar[HAVE_SRCPORT] && srcport != NTP_PORT)
- return (1);
-
- /*
- * Got everything, format the line
- */
- poll_sec = 1<<max(min3(ppoll, hpoll, NTP_MAXPOLL), NTP_MINPOLL);
- if (pktversion > NTP_OLDVERSION)
- c = flash3[CTL_PEER_STATVAL(rstatus) & 0x7];
- else
- c = flash2[CTL_PEER_STATVAL(rstatus) & 0x3];
- if (numhosts > 1)
- (void) fprintf(fp, "%-*s ", maxhostlen, currenthost);
- if (af == 0 || srcadr.ss_family == af){
- strcpy(clock_name, nntohost(&srcadr));
-
- (void) fprintf(fp,
- "%c%-15.15s %-15.15s %2ld %c %4.4s %4.4s %3lo %7.7s %8.7s %7.7s\n",
- c, clock_name, dstadr_refid, stratum, type,
- prettyinterval(whenbuf, when(&ts, &rec, &reftime)),
- prettyinterval(pollbuf, (int)poll_sec), reach,
- lfptoms(&estdelay, 3), lfptoms(&estoffset, 3),
- havevar[HAVE_JITTER] ? lfptoms(&estjitter, 3) :
- lfptoms(&estdisp, 3));
- return (1);
- }
- else
- return(1);
-}
-
-#undef HAVE_SRCADR
-#undef HAVE_DSTADR
-#undef HAVE_STRATUM
-#undef HAVE_PPOLL
-#undef HAVE_HPOLL
-#undef HAVE_REACH
-#undef HAVE_ESTDELAY
-#undef HAVE_ESTOFFSET
-#undef HAVE_JITTER
-#undef HAVE_ESTDISP
-#undef HAVE_REFID
-#undef HAVE_REC
-#undef HAVE_SRCPORT
-#undef HAVE_REFTIME
-#undef MAXHAVE
-
-
-/*
- * dogetpeers - given an association ID, read and print the spreadsheet
- * peer variables.
- */
-static int
-dogetpeers(
- struct varlist *pvl,
- int associd,
- FILE *fp,
- int af
- )
-{
- char *datap;
- int res;
- int dsize;
- u_short rstatus;
-
-#ifdef notdef
- res = doquerylist(pvl, CTL_OP_READVAR, associd, 0, &rstatus,
- &dsize, &datap);
-#else
- /*
- * Damn fuzzballs
- */
- res = doquery(CTL_OP_READVAR, associd, 0, 0, (char *)0, &rstatus,
- &dsize, &datap);
-#endif
-
- if (res != 0)
- return 0;
-
- if (dsize == 0) {
- (void) fprintf(stderr,
- "***No information returned for association %d\n",
- associd);
- return 0;
- }
-
- return doprintpeers(pvl, associd, (int)rstatus, dsize, datap, fp, af);
-}
-
-
-/*
- * peers - print a peer spreadsheet
- */
-static void
-dopeers(
- int showall,
- FILE *fp,
- int af
- )
-{
- register int i;
- char fullname[LENHOSTNAME];
- struct sockaddr_storage netnum;
-
- if (!dogetassoc(fp))
- return;
-
- for (i = 0; i < numhosts; ++i) {
- if (getnetnum(chosts[i], &netnum, fullname, af))
- if ((int)strlen(fullname) > maxhostlen)
- maxhostlen = strlen(fullname);
- }
- if (numhosts > 1)
- (void) fprintf(fp, "%-*.*s ", maxhostlen, maxhostlen, "host");
- (void) fprintf(fp,
- " remote refid st t when poll reach delay offset jitter\n");
- if (numhosts > 1)
- for (i = 0; i <= maxhostlen; ++i)
- (void) fprintf(fp, "=");
- (void) fprintf(fp,
- "==============================================================================\n");
-
- for (i = 0; i < numassoc; i++) {
- if (!showall &&
- !(CTL_PEER_STATVAL(assoc_cache[i].status)
- & (CTL_PST_CONFIG|CTL_PST_REACH)))
- continue;
- if (!dogetpeers(peervarlist, (int)assoc_cache[i].assid, fp, af)) {
- return;
- }
- }
- return;
-}
-
-
-/*
- * peers - print a peer spreadsheet
- */
-/*ARGSUSED*/
-static void
-peers(
- struct parse *pcmd,
- FILE *fp
- )
-{
- int af = 0;
-
- if (pcmd->nargs == 1) {
- if (pcmd->argval->ival == 6)
- af = AF_INET6;
- else
- af = AF_INET;
- }
- dopeers(0, fp, af);
-}
-
-
-/*
- * lpeers - print a peer spreadsheet including all fuzzball peers
- */
-/*ARGSUSED*/
-static void
-lpeers(
- struct parse *pcmd,
- FILE *fp
- )
-{
- int af = 0;
-
- if (pcmd->nargs == 1) {
- if (pcmd->argval->ival == 6)
- af = AF_INET6;
- else
- af = AF_INET;
- }
- dopeers(1, fp, af);
-}
-
-
-/*
- * opeers - print a peer spreadsheet
- */
-static void
-doopeers(
- int showall,
- FILE *fp,
- int af
- )
-{
- register int i;
-
- if (!dogetassoc(fp))
- return;
-
- (void) fprintf(fp,
- " remote local st t when poll reach delay offset disp\n");
- (void) fprintf(fp,
- "==============================================================================\n");
-
- for (i = 0; i < numassoc; i++) {
- if (!showall &&
- !(CTL_PEER_STATVAL(assoc_cache[i].status)
- & (CTL_PST_CONFIG|CTL_PST_REACH)))
- continue;
- if (!dogetpeers(opeervarlist, (int)assoc_cache[i].assid, fp, af)) {
- return;
- }
- }
- return;
-}
-
-
-/*
- * opeers - print a peer spreadsheet the old way
- */
-/*ARGSUSED*/
-static void
-opeers(
- struct parse *pcmd,
- FILE *fp
- )
-{
- int af = 0;
-
- if (pcmd->nargs == 1) {
- if (pcmd->argval->ival == 6)
- af = AF_INET6;
- else
- af = AF_INET;
- }
- doopeers(0, fp, af);
-}
-
-
-/*
- * lopeers - print a peer spreadsheet including all fuzzball peers
- */
-/*ARGSUSED*/
-static void
-lopeers(
- struct parse *pcmd,
- FILE *fp
- )
-{
- int af = 0;
-
- if (pcmd->nargs == 1) {
- if (pcmd->argval->ival == 6)
- af = AF_INET6;
- else
- af = AF_INET;
- }
- doopeers(1, fp, af);
-}
OpenPOWER on IntegriCloud