Merge branch 'collectd-3.11'
authorFlorian Forster <octo@huhu.verplant.org>
Wed, 30 May 2007 06:06:48 +0000 (08:06 +0200)
committerFlorian Forster <octo@huhu.verplant.org>
Wed, 30 May 2007 06:06:48 +0000 (08:06 +0200)
Conflicts:

ChangeLog
configure.in

1  2 
ChangeLog
src/ntpd.c

diff --combined ChangeLog
+++ b/ChangeLog
@@@ -1,48 -1,9 +1,54 @@@
 +2007-04-02, Version 4.0.0
 +      * collectd: The plugin-infrastructure has been changed to allow for
 +        more types of plugins, namely `write' and `log' plugins.
 +      * collectd: The read-function has been changed to read many plugins in
 +        parallel, using threads. Thus, plugins generally need to use
 +        thread-safe functions from now on.
 +      * collectd: The '-t' command line options allows to perform syntax tests
 +        of the configuration file and exit immediately.
 +      * csv plugin: The new `csv' plugin handles output to `comma separated
 +        values'-files.
 +      * rrdtool plugin: The new `rrdtool' plugin handles output to
 +        RRD-files. Data can be cached to combine multiple updates into one
 +        write to increase IO-performance.
 +      * network plugin: The new `network' plugin handles IO via the network.
 +        It implements a different, much more extensible protocol which can
 +        combine many values in one packet, decreasing the number of UDP-
 +        packets being sent. It can read from and send to the network and
 +        with the appropriate configuration even forward packets to other
 +        networks.
 +      * unixsock plugin: The new `unixsock' plugin provides an interface to
 +        communicate with the daemon while it is running. Right now the
 +        commands `GETVAL' and `PUTVAL' are implemented, but more are to
 +        come.
 +      * perl plugin: The new `perl' plugin allows you to write extensions
 +        for collectd in the scripting-language Perl.
 +      * logfile plugin: The new `logfile' plugin writes logmessages to files
 +        or STDOUT or STDERR.
 +      * syslog plugin: The new `syslog' plugin sends logmessages to the
 +        system's syslog daemon.
 +      * entropy plugin: The new `entropy' plugin collects the amount of
 +        entropy currently being available to the system.
 +      * exec plugin: The new `exec' plugin forks child processes and reads
 +        back values provided by the forked processes.
 +      * iptables plugin: The new `iptables' plugin reads counters from
 +        iptables rules. Thanks to Sjoerd van der Berg for contributing this
 +        plugin.
 +      * irq plugin: The new `irq' plugin collects the IRQ-counters. Thanks
 +        to Peter Holik for contributing this plugin.
 +      * nut plugin: The new `nut' plugin connects the upsd of the `network
 +        ups tools' and reads information about the connected UPS.
 +      * apache plugin: Support for lighttpd's `BusyServers' (aka.
 +        connections) field was added by Florent Monbillard.
 +      * collectd-nagios: The new `collectd-nagios' binary queries values
 +        from collectd, parses them and exits according to Nagios-standards.
 +
+ 2007-05-29, Version 3.11.5
+       * configure: Added `AC_SYS_LARGEFILE' for LFS.
+       * ntpd plugin: Fix a potential buffer overflow.
+       * processes plugin: Fix a bug when run under Linux 2.4. All processes
+         were accounted as `zombies'.
  2007-04-10, Version 3.11.4
        * dns plugin: Change the order of includes to make the plugin compile
          under FreeBSD.
diff --combined src/ntpd.c
@@@ -1,6 -1,6 +1,6 @@@
  /**
   * collectd - src/ntpd.c
 - * Copyright (C) 2006  Florian octo Forster
 + * Copyright (C) 2006-2007  Florian octo Forster
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License as published by the
@@@ -23,6 -23,9 +23,6 @@@
  #include "common.h"
  #include "plugin.h"
  #include "configfile.h"
 -#include "utils_debug.h"
 -
 -#define MODULE_NAME "ntpd"
  
  #if HAVE_SYS_SOCKET_H
  # define NTPD_HAVE_READ 1
  #if HAVE_NETINET_TCP_H
  # include <netinet/tcp.h>
  #endif
 -#if HAVE_SYS_POLL_H
 -# include <sys/poll.h>
 +#if HAVE_POLL_H
 +# include <poll.h>
  #endif
  
 -static char *config_keys[] =
 +static const char *config_keys[] =
  {
        "Host",
        "Port",
  };
  static int config_keys_num = 2;
  
 -/* drift */
 -static char *time_offset_file     = "ntpd/time_offset-%s.rrd";
 -static char *time_dispersion_file = "ntpd/time_dispersion-%s.rrd";
 -static char *time_delay_file      = "ntpd/delay-%s.rrd";
 -
 -/* used for `time_offset', `time_dispersion', and `delay' */
 -static char *sec_ds_def[] =
 -{
 -      "DS:seconds:GAUGE:"COLLECTD_HEARTBEAT":-1000000:1000000",
 -      NULL
 -};
 -static int sec_ds_num = 1;
 -
 -static char *frequency_offset_file = "ntpd/frequency_offset-%s.rrd";
 -static char *frequency_offset_ds_def[] =
 -{
 -      "DS:ppm:GAUGE:"COLLECTD_HEARTBEAT":-1000000:1000000",
 -      NULL
 -};
 -static int frequency_offset_ds_num = 1;
 -
  #if NTPD_HAVE_READ
  # define NTPD_DEFAULT_HOST "localhost"
  # define NTPD_DEFAULT_PORT "123"
  static int   sock_descr = -1;
  static char *ntpd_host = NULL;
  static char *ntpd_port = NULL;
 -#endif
  
  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
   * The following definitions were copied from the NTPd distribution  *
@@@ -261,7 -286,7 +261,7 @@@ static int refclock_names_num = 45
   * End of the copied stuff..                                         *
   * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
  
 -static int ntpd_config (char *key, char *value)
 +static int ntpd_config (const char *key, const char *value)
  {
        if (strcasecmp (key, "host") == 0)
        {
        return (0);
  }
  
 -static void ntpd_init (void)
 -{
 -      return;
 -}
 -
 -static void ntpd_write_sec (char *host, char *inst, char *val, char *file)
 -{
 -      char buf[256];
 -      int  status;
 -
 -      status = snprintf (buf, 256, file, inst);
 -      if ((status < 1) || (status >= 256))
 -              return;
 -
 -      rrd_update_file (host, buf, val,
 -                      sec_ds_def, sec_ds_num);
 -}
 -
 -static void ntpd_write_time_offset (char *host, char *inst, char *val)
 -{
 -      ntpd_write_sec (host, inst, val, time_offset_file);
 -}
 -
 -static void ntpd_write_time_dispersion (char *host, char *inst, char *val)
 -{
 -      ntpd_write_sec (host, inst, val, time_dispersion_file);
 -}
 -
 -static void ntpd_write_delay (char *host, char *inst, char *val)
 -{
 -      ntpd_write_sec (host, inst, val, time_delay_file);
 -}
 -
 -static void ntpd_write_frequency_offset (char *host, char *inst, char *val)
 -{
 -      char buf[256];
 -      int  status;
 -
 -      status = snprintf (buf, 256, frequency_offset_file, inst);
 -      if ((status < 1) || (status >= 256))
 -              return;
 -
 -      rrd_update_file (host, buf, val,
 -                      frequency_offset_ds_def, frequency_offset_ds_num);
 -}
 -
 -#if NTPD_HAVE_READ
 -static void ntpd_submit (char *type, char *inst, double value)
 +static void ntpd_submit (char *type, char *type_inst, double value)
  {
 -      char buf[256];
 +      value_t values[1];
 +      value_list_t vl = VALUE_LIST_INIT;
  
 -      if (snprintf (buf, 256, "%u:%.8f", (unsigned int) curtime, value) >= 256)
 -              return;
 +      values[0].gauge = value;
  
 -      DBG ("type = %s; inst = %s; value = %s;",
 -                      type, inst, buf);
 +      vl.values = values;
 +      vl.values_len = 1;
 +      vl.time = time (NULL);
 +      strcpy (vl.host, hostname_g);
 +      strcpy (vl.plugin, "ntpd");
 +      strcpy (vl.plugin_instance, "");
 +      strncpy (vl.type_instance, type_inst, sizeof (vl.type_instance));
  
 -      plugin_submit (type, inst, buf);
 +      plugin_dispatch_values (type, &vl);
  }
  
  /* returns `tv0 - tv1' in milliseconds or 0 if `tv1 > tv0' */
@@@ -341,7 -408,7 +341,7 @@@ static int ntpd_connect (void
        if (sock_descr >= 0)
                return (sock_descr);
  
 -      DBG ("Opening a new socket");
 +      DEBUG ("Opening a new socket");
  
        host = ntpd_host;
        if (host == NULL)
  
        if ((status = getaddrinfo (host, port, &ai_hints, &ai_list)) != 0)
        {
 -              DBG ("getaddrinfo (%s, %s): %s",
 -                              host, port,
 -                              status == EAI_SYSTEM ? strerror (errno) : gai_strerror (status));
 -              syslog (LOG_ERR, "ntpd plugin: getaddrinfo (%s, %s): %s",
 +              char errbuf[1024];
 +              ERROR ("ntpd plugin: getaddrinfo (%s, %s): %s",
                                host, port,
 -                              status == EAI_SYSTEM ? strerror (errno) : gai_strerror (status));
 +                              (status == EAI_SYSTEM)
 +                              ? sstrerror (errno, errbuf, sizeof (errbuf))
 +                              : gai_strerror (status));
                return (-1);
        }
  
  
        if (sock_descr < 0)
        {
 -              DBG ("Unable to connect to server.");
 -              syslog (LOG_ERR, "ntpd plugin: Unable to connect to server.");
 +              DEBUG ("Unable to connect to server.");
 +              ERROR ("ntpd plugin: Unable to connect to server.");
        }
  
        return (sock_descr);
@@@ -440,9 -507,8 +440,9 @@@ static int ntpd_receive_response (int r
  
        if (gettimeofday (&time_end, NULL) < 0)
        {
 -              syslog (LOG_ERR, "ntpd plugin: gettimeofday failed: %s",
 -                              strerror (errno));
 +              char errbuf[1024];
 +              ERROR ("ntpd plugin: gettimeofday failed: %s",
 +                              sstrerror (errno, errbuf, sizeof (errbuf)));
                return (-1);
        }
        time_end.tv_sec++; /* wait for a most one second */
        {
                if (gettimeofday (&time_now, NULL) < 0)
                {
 -                      syslog (LOG_ERR, "ntpd plugin: gettimeofday failed: %s",
 -                                      strerror (errno));
 +                      char errbuf[1024];
 +                      ERROR ("ntpd plugin: gettimeofday failed: %s",
 +                                      sstrerror (errno, errbuf, sizeof (errbuf)));
                        return (-1);
                }
  
                poll_s.events  = POLLIN | POLLPRI;
                poll_s.revents = 0;
                
 -              DBG ("Polling for %ims", timeout);
 +              DEBUG ("Polling for %ims", timeout);
                status = poll (&poll_s, 1, timeout);
  
                if ((status < 0) && ((errno == EAGAIN) || (errno == EINTR)))
  
                if (status < 0)
                {
 -                      DBG ("poll failed: %s", strerror (errno));
 -                      syslog (LOG_ERR, "ntpd plugin: poll failed: %s",
 -                                      strerror (errno));
 +                      char errbuf[1024];
 +                      ERROR ("ntpd plugin: poll failed: %s",
 +                                      sstrerror (errno, errbuf, sizeof (errbuf)));
                        return (-1);
                }
  
                if (status == 0) /* timeout */
                {
 -                      DBG ("timeout reached.");
 +                      DEBUG ("timeout reached.");
                        break;
                }
  
  
                if (status < 0)
                {
 -                      DBG ("recv(2) failed: %s", strerror (errno));
 -                      DBG ("Closing socket #%i", sd);
 +                      char errbuf[1024];
 +                      DEBUG ("recv(2) failed: %s",
 +                                      sstrerror (errno, errbuf, sizeof (errbuf)));
 +                      DEBUG ("Closing socket #%i", sd);
                        close (sd);
                        sock_descr = sd = -1;
                        return (-1);
                }
  
 -              DBG ("recv'd %i bytes", status);
 +              DEBUG ("recv'd %i bytes", status);
  
                /* 
                 * Do some sanity checks first
                 */
                if (status < RESP_HEADER_SIZE)
                {
 -                      syslog (LOG_WARNING, "ntpd plugin: Short (%i bytes) packet received",
 +                      WARNING ("ntpd plugin: Short (%i bytes) packet received",
                                        (int) status);
                        continue;
                }
                if (INFO_MODE (res.rm_vn_mode) != MODE_PRIVATE)
                {
 -                      syslog (LOG_NOTICE, "ntpd plugin: Packet received with mode %i",
 +                      NOTICE ("ntpd plugin: Packet received with mode %i",
                                        INFO_MODE (res.rm_vn_mode));
                        continue;
                }
                if (INFO_IS_AUTH (res.auth_seq))
                {
 -                      syslog (LOG_NOTICE, "ntpd plugin: Encrypted packet received");
 +                      NOTICE ("ntpd plugin: Encrypted packet received");
                        continue;
                }
                if (!ISRESPONSE (res.rm_vn_mode))
                {
 -                      syslog (LOG_NOTICE, "ntpd plugin: Received request packet, "
 +                      NOTICE ("ntpd plugin: Received request packet, "
                                        "wanted response");
                        continue;
                }
                if (INFO_MBZ (res.mbz_itemsize))
                {
 -                      syslog (LOG_WARNING, "ntpd plugin: Received packet with nonzero "
 +                      WARNING ("ntpd plugin: Received packet with nonzero "
                                        "MBZ field!");
                        continue;
                }
                if (res.implementation != IMPL_XNTPD)
                {
 -                      syslog (LOG_WARNING, "ntpd plugin: Asked for request of type %i, "
 +                      WARNING ("ntpd plugin: Asked for request of type %i, "
                                        "got %i", (int) IMPL_XNTPD, (int) res.implementation);
                        continue;
                }
                /* Check for error code */
                if (INFO_ERR (res.err_nitems) != 0)
                {
 -                      syslog (LOG_ERR, "ntpd plugin: Received error code %i",
 +                      ERROR ("ntpd plugin: Received error code %i",
                                        (int) INFO_ERR(res.err_nitems));
                        return ((int) INFO_ERR (res.err_nitems));
                }
                /* extract number of items in this packet and the size of these items */
                pkt_item_num = INFO_NITEMS (res.err_nitems);
                pkt_item_len = INFO_ITEMSIZE (res.mbz_itemsize);
 -              DBG ("pkt_item_num = %i; pkt_item_len = %i;",
 +              DEBUG ("pkt_item_num = %i; pkt_item_len = %i;",
                                pkt_item_num, pkt_item_len);
  
                /* Check if the reported items fit in the packet */
                if ((pkt_item_num * pkt_item_len) > (status - RESP_HEADER_SIZE))
                {
 -                      syslog (LOG_ERR, "ntpd plugin: %i items * %i bytes > "
 +                      ERROR ("ntpd plugin: %i items * %i bytes > "
                                        "%i bytes - %i bytes header",
                                        (int) pkt_item_num, (int) pkt_item_len,
                                        (int) status, (int) RESP_HEADER_SIZE);
                        continue;
                }
  
+               if (pkt_item_len > res_item_size)
+               {
+                       syslog (LOG_ERR, "ntpd plugin: (pkt_item_len = %i) "
+                                       ">= (res_item_size = %i)",
+                                       pkt_item_len, res_item_size);
+                       continue;
+               }
                /* If this is the first packet (time wise, not sequence wise),
                 * set `res_size'. If it's not the first packet check if the
                 * items have the same size. Discard invalid packets. */
                if (items_num == 0) /* first packet */
                {
 -                      DBG ("*res_size = %i", pkt_item_len);
 +                      DEBUG ("*res_size = %i", pkt_item_len);
                        *res_size = pkt_item_len;
                }
                else if (*res_size != pkt_item_len)
                {
 -                      DBG ("Error: *res_size = %i; pkt_item_len = %i;",
 +                      DEBUG ("Error: *res_size = %i; pkt_item_len = %i;",
                                        *res_size, pkt_item_len);
 -                      syslog (LOG_ERR, "Item sizes differ.");
 +                      ERROR ("Item sizes differ.");
                        continue;
                }
  
+               /*
+                * Because the items in the packet may be smaller than the
+                * items requested, the following holds true:
+                */
+               assert ((*res_size == pkt_item_len)
+                               && (pkt_item_len <= res_item_size));
                /* Calculate the padding. No idea why there might be any padding.. */
                pkt_padding = 0;
-               if (res_item_size > pkt_item_len)
+               if (pkt_item_len < res_item_size)
                        pkt_padding = res_item_size - pkt_item_len;
 -              DBG ("res_item_size = %i; pkt_padding = %i;",
 +              DEBUG ("res_item_size = %i; pkt_padding = %i;",
                                res_item_size, pkt_padding);
  
                /* Extract the sequence number */
                pkt_sequence = INFO_SEQ (res.auth_seq);
                if ((pkt_sequence < 0) || (pkt_sequence > MAXSEQ))
                {
 -                      syslog (LOG_ERR, "ntpd plugin: Received packet with sequence %i",
 +                      ERROR ("ntpd plugin: Received packet with sequence %i",
                                        pkt_sequence);
                        continue;
                }
                /* Check if this sequence has been received before. If so, discard it. */
                if (pkt_recvd[pkt_sequence] != '\0')
                {
 -                      syslog (LOG_NOTICE, "ntpd plugin: Sequence %i received twice",
 +                      NOTICE ("ntpd plugin: Sequence %i received twice",
                                        pkt_sequence);
                        continue;
                }
                {
                        if (pkt_lastseq != -1)
                        {
 -                              syslog (LOG_ERR, "ntpd plugin: Two packets which both "
 +                              ERROR ("ntpd plugin: Two packets which both "
                                                "claim to be the last one in the "
                                                "sequence have been received.");
                                continue;
                        }
                        pkt_lastseq = pkt_sequence;
 -                      DBG ("Last sequence = %i;", pkt_lastseq);
 +                      DEBUG ("Last sequence = %i;", pkt_lastseq);
                }
  
                /*
                 * Enough with the checks. Copy the data now.
                 * We start by allocating some more memory.
                 */
 -              DBG ("realloc (%p, %i)", (void *) *res_data,
 +              DEBUG ("realloc (%p, %i)", (void *) *res_data,
                                (items_num + pkt_item_num) * res_item_size);
                items = realloc ((void *) *res_data,
                                (items_num + pkt_item_num) * res_item_size);
-               items_num += pkt_item_num;
                if (items == NULL)
                {
                        items = *res_data;
 -                      syslog (LOG_ERR, "ntpd plugin: realloc failed.");
 +                      ERROR ("ntpd plugin: realloc failed.");
                        continue;
                }
+               items_num += pkt_item_num;
                *res_data = items;
  
                for (i = 0; i < pkt_item_num; i++)
                {
+                       /* dst: There are already `*res_items' items with
+                        *      res_item_size bytes each in in `*res_data'. Set
+                        *      dst to the first byte after that. */
                        void *dst = (void *) (*res_data + ((*res_items) * res_item_size));
+                       /* src: We use `pkt_item_len' to calculate the offset
+                        *      from the beginning of the packet, because the
+                        *      items in the packet may be smaller than the
+                        *      items that were requested. We skip `i' such
+                        *      items. */
                        void *src = (void *) (((char *) res.data) + (i * pkt_item_len));
  
                        /* Set the padding to zeros */
                                memset (dst, '\0', res_item_size);
                        memcpy (dst, src, (size_t) pkt_item_len);
  
+                       /* Increment `*res_items' by one, so `dst' will end up
+                        * one further in the next round. */
                        (*res_items)++;
-               }
+               } /* for (pkt_item_num) */
  
                pkt_recvd[pkt_sequence] = (char) 1;
                pkt_recvd_num++;
        } /* while (done == 0) */
  
        return (0);
- }
+ } /* int ntpd_receive_response */
  
  /* For a description of the arguments see `ntpd_do_query' below. */
  static int ntpd_send_request (int req_code, int req_items, int req_size, char *req_data)
        if (req_data != NULL)
                memcpy ((void *) req.data, (const void *) req_data, req_data_len);
  
 -      DBG ("req_items = %i; req_size = %i; req_data = %p;",
 +      DEBUG ("req_items = %i; req_size = %i; req_data = %p;",
                        req_items, req_size, (void *) req_data);
  
        status = swrite (sd, (const char *) &req, REQ_LEN_NOMAC);
        if (status < 0)
        {
 -              DBG ("`swrite' failed. Closing socket #%i", sd);
 +              DEBUG ("`swrite' failed. Closing socket #%i", sd);
                close (sd);
                sock_descr = sd = -1;
                return (status);
@@@ -747,7 -835,7 +772,7 @@@ static double ntpd_read_fp (int32_t val
        return (val_double);
  }
  
 -static void ntpd_read (void)
 +static int ntpd_read (void)
  {
        struct info_kernel *ik;
        int                 ik_num;
  
        if (status != 0)
        {
 -              DBG ("ntpd_do_query failed with status %i", status);
 -              return;
 +              DEBUG ("ntpd_do_query failed with status %i", status);
 +              return (-1);
        }
        if ((ik == NULL) || (ik_num == 0) || (ik_size == 0))
        {
 -              DBG ("ntpd_do_query returned: ik = %p; ik_num = %i; ik_size = %i;",
 +              DEBUG ("ntpd_do_query returned: ik = %p; ik_num = %i; ik_size = %i;",
                                (void *) ik, ik_num, ik_size);
 -              return;
 +              return (-1);
        }
  
        /* kerninfo -> estimated error */
  
 -      DBG ("info_kernel:\n"
 +      DEBUG ("info_kernel:\n"
                        "  pll offset    = %.8f\n"
                        "  pll frequency = %.8f\n" /* drift compensation */
                        "  est error     = %.8f\n",
                        ntpd_read_fp (ik->freq),
                        ntpd_read_fp (ik->esterror));
  
 -      ntpd_submit ("ntpd_frequency_offset", "loop",  ntpd_read_fp (ik->freq));
 -      ntpd_submit ("ntpd_time_offset",      "loop",  ntpd_read_fp (ik->offset));
 -      ntpd_submit ("ntpd_time_offset",      "error", ntpd_read_fp (ik->esterror));
 +      ntpd_submit ("frequency_offset", "loop",  ntpd_read_fp (ik->freq));
 +      ntpd_submit ("time_offset",      "loop",  ntpd_read_fp (ik->offset));
 +      ntpd_submit ("time_offset",      "error", ntpd_read_fp (ik->esterror));
  
        free (ik);
        ik = NULL;
                        sizeof (struct info_peer_summary));
        if (status != 0)
        {
 -              DBG ("ntpd_do_query failed with status %i", status);
 -              return;
 +              DEBUG ("ntpd_do_query failed with status %i", status);
 +              return (-1);
        }
        if ((ps == NULL) || (ps_num == 0) || (ps_size == 0))
        {
 -              DBG ("ntpd_do_query returned: ps = %p; ps_num = %i; ps_size = %i;",
 +              DEBUG ("ntpd_do_query returned: ps = %p; ps_num = %i; ps_size = %i;",
                                (void *) ps, ps_num, ps_size);
 -              return;
 +              return (-1);
        }
  
        for (i = 0; i < ps_num; i++)
                                        NULL, 0, 0 /* no flags */);
                        if (status != 0)
                        {
 -                              syslog (LOG_ERR, "ntpd plugin: getnameinfo failed: %s",
 -                                              status == EAI_SYSTEM
 -                                              ? strerror (errno)
 +                              char errbuf[1024];
 +                              ERROR ("ntpd plugin: getnameinfo failed: %s",
 +                                              (status == EAI_SYSTEM)
 +                                              ? sstrerror (errno, errbuf, sizeof (errbuf))
                                                : gai_strerror (status));
                                continue;
                        }
                        }
                }
  
 -              DBG ("peer %i:\n"
 +              DEBUG ("peer %i:\n"
                                "  peername   = %s\n"
                                "  srcadr     = 0x%08x\n"
                                "  delay      = %f\n"
                                ntpd_read_fp (ptr->dispersion));
  
                if (refclock_id != 1) /* not the system clock (offset will always be zero.. */
 -                      ntpd_submit ("ntpd_time_offset", peername, offset);
 -              ntpd_submit ("ntpd_time_dispersion", peername, ntpd_read_fp (ptr->dispersion));
 +                      ntpd_submit ("time_offset", peername, offset);
 +              ntpd_submit ("time_dispersion", peername, ntpd_read_fp (ptr->dispersion));
                if (refclock_id == 0) /* not a reference clock */
 -                      ntpd_submit ("ntpd_delay", peername, ntpd_read_fp (ptr->delay));
 +                      ntpd_submit ("delay", peername, ntpd_read_fp (ptr->delay));
        }
  
        free (ps);
        ps = NULL;
  
 -      return;
 -}
 -#else
 -# define ntpd_read NULL
 +      return (0);
 +} /* int ntpd_read */
  #endif /* NTPD_HAVE_READ */
  
  void module_register (void)
  {
 -      plugin_register (MODULE_NAME, ntpd_init, ntpd_read, NULL);
 -      plugin_register ("ntpd_time_offset", NULL, NULL, ntpd_write_time_offset);
 -      plugin_register ("ntpd_time_dispersion", NULL, NULL, ntpd_write_time_dispersion);
 -      plugin_register ("ntpd_delay", NULL, NULL, ntpd_write_delay);
 -      plugin_register ("ntpd_frequency_offset", NULL, NULL, ntpd_write_frequency_offset);
 -      cf_register (MODULE_NAME, ntpd_config, config_keys, config_keys_num);
 -}
 -
 -#undef MODULE_NAME
 +#if NTPD_HAVE_READ
 +      plugin_register_config ("ntpd", ntpd_config,
 +                      config_keys, config_keys_num);
 +      plugin_register_read ("ntpd", ntpd_read);
 +#endif /* NTPD_HAVE_READ */
 +} /* void module_register */