Browse Source

new OpenNTPD portable tree

First attempt at building a new OpenNTPD portable project, based on the
latest OpenBSD source.
OPENBSD_5_7
Brent Cook 10 years ago
commit
d5b81b8ed2
31 changed files with 1240 additions and 0 deletions
  1. +76
    -0
      .gitignore
  2. +0
    -0
      AUTHORS
  3. +31
    -0
      COPYING
  4. +0
    -0
      ChangeLog
  5. +90
    -0
      INSTALL
  6. +129
    -0
      Makefile.am
  7. +0
    -0
      NEWS
  8. +24
    -0
      README
  9. +1
    -0
      VERSION
  10. +6
    -0
      autogen.sh
  11. +71
    -0
      bsd-adjfreq.c
  12. +28
    -0
      client.patch
  13. +26
    -0
      compat/arc4random.h
  14. +96
    -0
      compat/bsd-asprintf.c
  15. +20
    -0
      compat/imsg.patch
  16. +165
    -0
      compat/setproctitle.c
  17. +39
    -0
      config.patch
  18. +147
    -0
      configure.ac
  19. +7
    -0
      dist.sh
  20. +46
    -0
      fake-sensors.c
  21. +12
    -0
      include/Makefile.am
  22. +15
    -0
      include/poll.h
  23. +10
    -0
      include/signal.h
  24. +21
    -0
      include/unistd.h
  25. +20
    -0
      ntp.patch
  26. +11
    -0
      ntpd.conf
  27. +10
    -0
      ntpd.patch
  28. +15
    -0
      parse.patch
  29. +53
    -0
      server.patch
  30. +58
    -0
      update.sh
  31. +13
    -0
      util.patch

+ 76
- 0
.gitignore View File

@ -0,0 +1,76 @@
*.y
*.5
*.8
*.o
*.la
*.lo
.deps
.dirstamp
.libs
ntpd
openbsd
aclocal.m4
autom4te.cache/
compile
config.guess
config.log
config.status
config.sub
configure
depcomp
install-sh
libtool
ltmain.sh
m4/
missing
ylwrap
Makefile
Makefile.in
compat/arc4random.c
compat/arc4random_freebsd.h
compat/arc4random_linux.h
compat/arc4random_osx.h
compat/arc4random_solaris.h
compat/arc4random_uniform.c
compat/arc4random_win.h
compat/chacha_private.h
compat/explicit_bzero.c
compat/getentropy_freebsd.c
compat/getentropy_linux.c
compat/getentropy_osx.c
compat/getentropy_solaris.c
compat/getentropy_win.c
compat/imsg-buffer.c
compat/imsg.c
compat/md5.c
compat/reallocarray.c
compat/strlcat.c
compat/strlcpy.c
compat/strndup.c
compat/strnlen.c
compat/strtonum.c
client.c
config.c
control.c
include/imsg.h
include/md5.h
include/stdlib.h
include/string.h
include/sys/
log.c
ntp.c
ntp.h
ntp_dns.c
ntp_msg.c
ntpd.c
ntpd.h
parse.c
sensors.c
server.c
util.c

+ 0
- 0
AUTHORS View File


+ 31
- 0
COPYING View File

@ -0,0 +1,31 @@
This is a summary of the licences for the files that make up Portable
OpenNTPD.
Apart from the exceptions listed below, all of the files are under an
ISC-style licence with the following copyright holders, first for the
files from OpenBSD's ntpd:
Henning Brauer
Alexander Guy
and the portability layer:
Darren Tucker
Damien Miller
Internet Software Consortium
Todd C. Miller
Anthony O.Zabelin
/*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/

+ 0
- 0
ChangeLog View File


+ 90
- 0
INSTALL View File

@ -0,0 +1,90 @@
1. Prerequisites
----------------
You will need an entropy (randomness) source. If your OS has arc4random or
getentropy then that is ideal. Otherwise, you can use the builtin arc4random
implementation or the one built into LibreSSL.
2. Building / Installation
--------------------------
To install OpenNTPD with default options:
./configure
make
make install
This will install the OpenNTPD binary in /usr/local/sbin, configuration
files in /usr/local/etc. To specify a different installation prefix,
use the --prefix option to configure:
./configure --prefix=/opt
make
make install
Will install OpenNTPD in /opt/{etc,sbin}. You can also override
specific paths, for example:
./configure --prefix=/opt --sysconfdir=/etc/ntp
make
make install
This will install the binaries in /opt/sbin, but will place the
configuration files in /etc/ntp.
OpenNTPD always uses Privilege Separation (ie the majority of the
processing is done as a chroot'ed, unprivileged user).
This requires that a user, group and directory to be created for it.
The user should not be permitted to log in, and its home directory
should be owned by root and be mode 755.
If you do "make install", the Makefile will create the directory with
the correct permissions and will prompt you for the rest if required.
If, however, you need to perform all of these tasks yourself (eg if you
are moving the built binaries to another system) then you will need to
do something like the following (although the exact commands required
for creating the user and group are system dependant):
# groupadd _ntp
# useradd -g _ntp -s /sbin/nologin -d /var/empty/ntp -c 'OpenNTP daemon' _ntp
# mkdir -p /var/empty/ntp
# chown 0 /var/empty/ntp
# chgrp 0 /var/empty/ntp
# chmod 0755 /var/empty/ntp
There are a few options to the configure script in addition to the ones
provided by autoconf itself:
--with-privsep-user=[user]
Specify unprivileged user used for privilege separation. The default
is "_ntp".
--with-privsep-path=path
Normally ntpd will always use the home directory of the privsep user
to chroot to, however use of this option will cause ntpd to always
use the specified directory.
If you need to pass special options to the compiler or linker, you
can specify these as environment variables before running ./configure.
For example:
CFLAGS="-O -m486" LDFLAGS="-s" LIBS="-lrubbish" LD="/usr/foo/ld" ./configure
3. Configuration
----------------
The runtime configuration files are installed by in ${prefix}/etc or
whatever you specified as your --sysconfdir (/usr/local/etc by default).
If no configuration file exists, the default one is used. The default
configuration file uses a selection of publicly accessible "pool" servers
(see http://twiki.ntp.org/bin/view/Servers/NTPPoolServers).
4. Problems?
------------
If you experience problems compiling, installing or running OpenNTPD,
please report the problem to the address in the README file.

+ 129
- 0
Makefile.am View File

@ -0,0 +1,129 @@
AM_CPPFLAGS = -I$(top_srcdir)/include
SUBDIRS = include
ACLOCAL_AMFLAGS = -Im4
EXTRA_DIST = VERSION
CLEANFILES = parse.c
sbin_PROGRAMS = ntpd
noinst_LTLIBRARIES = libcompat.la libcompatnoopt.la
dist_man_MANS = ntpctl.8 ntpd.8 ntpd.conf.5
ntpd_CFLAGS = $(CFLAGS) $(USER_CFLAGS)
ntpd_LDADD = $(PLATFORM_LDADD) $(PROG_LDADD) libcompat.la libcompatnoopt.la
ntpd_SOURCES = client.c
ntpd_SOURCES += config.c
ntpd_SOURCES += control.c
ntpd_SOURCES += log.c
ntpd_SOURCES += ntp.c
ntpd_SOURCES += ntp.h
ntpd_SOURCES += ntp_dns.c
ntpd_SOURCES += ntp_msg.c
ntpd_SOURCES += ntpd.c
ntpd_SOURCES += ntpd.h
ntpd_SOURCES += parse.y
if !HAVE_ADJFREQ
ntpd_SOURCES += bsd-adjfreq.c
endif
if HAVE_SENSORS
ntpd_SOURCES += sensors.c
else
ntpd_SOURCES += fake-sensors.c
endif
ntpd_SOURCES += server.c
ntpd_SOURCES += util.c
install-exec-hook:
ln -f $(DESTDIR)$(sbindir)/ntpd $(DESTDIR)$(sbindir)/ntpctl
uninstall-local:
-rm -f $(DESTDIR)$(sbindir)/ntpctl
# compatibility functions that need to be built without optimizations
libcompatnoopt_la_CFLAGS = -O0
libcompatnoopt_la_SOURCES =
if !HAVE_EXPLICIT_BZERO
libcompatnoopt_la_SOURCES += compat/explicit_bzero.c
endif
# other compatibility functions
libcompat_la_CFLAGS = $(CFLAGS) $(USER_CFLAGS)
libcompat_la_SOURCES =
libcompat_la_LIBADD = $(PLATFORM_LDADD)
if !HAVE_SETPROCTITLE
libcompat_la_SOURCES += compat/setproctitle.c
endif
if !HAVE_STRLCAT
libcompat_la_SOURCES += compat/strlcat.c
endif
if !HAVE_STRLCPY
libcompat_la_SOURCES += compat/strlcpy.c
endif
if !HAVE_STRNDUP
libcompat_la_SOURCES += compat/strndup.c
# the only user of strnlen is strndup, so only build it if needed
if !HAVE_STRNLEN
libcompat_la_SOURCES += compat/strnlen.c
endif
endif
if !HAVE_STRTONUM
libcompat_la_SOURCES += compat/strtonum.c
endif
if !HAVE_ASPRINTF
libcompat_la_SOURCES += compat/bsd-asprintf.c
endif
if !HAVE_REALLOCARRAY
libcompat_la_SOURCES += compat/reallocarray.c
endif
if !HAVE_MD5
libcompat_la_SOURCES += compat/md5.c
endif
if !HAVE_IMSG
libcompat_la_SOURCES += compat/imsg.c
libcompat_la_SOURCES += compat/imsg-buffer.c
endif
if !HAVE_ARC4RANDOM
libcompat_la_SOURCES += compat/arc4random.c
if !HAVE_GETENTROPY
if HOST_FREEBSD
libcompat_la_SOURCES += compat/getentropy_freebsd.c
endif
if HOST_LINUX
libcompat_la_SOURCES += compat/getentropy_linux.c
ntpd_LDADD += -lcrypto
endif
if HOST_DARWIN
libcompat_la_SOURCES += compat/getentropy_osx.c
ntpd_LDADD += -lcrypto
endif
if HOST_SOLARIS
libcompat_la_SOURCES += compat/getentropy_solaris.c
ntpd_LDADD += -lcrypto
endif
endif
endif
if !HAVE_ARC4RANDOM_UNIFORM
libcompat_la_SOURCES += compat/arc4random_uniform.c
endif
noinst_HEADERS = compat/arc4random.h
noinst_HEADERS += compat/arc4random_freebsd.h
noinst_HEADERS += compat/arc4random_linux.h
noinst_HEADERS += compat/arc4random_osx.h
noinst_HEADERS += compat/arc4random_solaris.h
noinst_HEADERS += compat/arc4random_win.h
noinst_HEADERS += compat/chacha_private.h

+ 0
- 0
NEWS View File


+ 24
- 0
README View File

@ -0,0 +1,24 @@
This is a new port of OpenBSD's native ntpd to other Unix flavours adding
autoconf support and the necessary compatibility layer. It is based on
portability code from the OpenSSH and LibreSSL portable projects.
OpenNTPD has a web site at http://www.openntpd.org/
The current portable tree can be found at https://github.com/openntpd-portable
Platform Requirements
---------------------
adjtime() and settimeofday() syscalls or equivalent.
either poll() or select().
a working arc4random implementation, OpenSSL or LibreSSL
(this project shares the same arc4random compatibility code from LibreSSL)
At the time of writing the Portable version is known to build and work on:
OpenBSD (5.6)
Linux (Ubuntu 12.04, 14.04)
FreeBSD (9.x, 10.x)
Solaris (10.x, 11.x)
Mac OS X (10.9)
It may work on others, newer and older, but it's still a work in progress.
Reports (success or otherwise) and/or diffs welcome.

+ 1
- 0
VERSION View File

@ -0,0 +1 @@
5.7p1

+ 6
- 0
autogen.sh View File

@ -0,0 +1,6 @@
#!/bin/sh
set -e
./update.sh
mkdir -p m4
autoreconf -i -f

+ 71
- 0
bsd-adjfreq.c View File

@ -0,0 +1,71 @@
/*
* Copyright (c) 2007 Sebastian Benoit <benoit-lists@fb12.de>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* RCSID("$Id$"); */
#include <sys/types.h>
#include <unistd.h>
#ifdef HAVE_SYS_TIMEX_H
# include <sys/timex.h>
#endif
#ifdef adjfreq
# undef adjfreq
#endif
#include "ntp.h"
#include "ntpd.h"
/*
* adjfreq (old)freq = nanosec. per seconds shifted left 32 bits
* timex.freq is ppm / left shifted by SHIFT_USEC (16 bits), defined in timex.h
*/
int
adjfreq(const int64_t *freq, int64_t *oldfreq)
{
struct timex txc;
int64_t newfreq;
if (freq != NULL) {
#if defined(__linux__)
txc.modes = ADJ_FREQUENCY;
#else
txc.modes = MOD_FREQUENCY;
#endif
txc.freq = *freq / 1e3 / (1LL << 16);
if ((ntp_adjtime(&txc)) == -1)
log_warn("ntp_adjtime (2) failed");
log_debug("ntp_adjtime adjusted frequency by %fppm",
((txc.freq * 1e3) * (1LL<<16) / 1e3 / (1LL << 32)));
}
if (oldfreq != NULL) {
txc.modes = 0;
if ((ntp_adjtime(&txc)) == -1) {
log_warn("ntp_adjtime (1) failed");
return -1;
}
newfreq = (txc.freq * 1e3) * (1LL<<16);
log_debug("ntp_adjtime returns frequency of %fppm",
newfreq / 1e3 / (1LL << 32));
*oldfreq = newfreq;
}
return 0;
}

+ 28
- 0
client.patch View File

@ -0,0 +1,28 @@
--- client.orig 2014-12-28 11:10:23.875157132 -0600
+++ client.c 2014-12-28 11:12:46.095160215 -0600
@@ -142,10 +142,12 @@
0)) == -1)
fatal("client_query socket");
+#ifdef SO_RTABLE
if (p->rtable != -1 &&
setsockopt(p->query->fd, SOL_SOCKET, SO_RTABLE,
&p->rtable, sizeof(p->rtable)) == -1)
fatal("client_query setsockopt SO_RTABLE");
+#endif
if (connect(p->query->fd, sa, SA_LEN(sa)) == -1) {
if (errno == ECONNREFUSED || errno == ENETUNREACH ||
errno == EHOSTUNREACH || errno == EADDRNOTAVAIL) {
@@ -248,10 +250,12 @@
return (0);
}
+#ifdef SO_RTABLE
if (p->rtable != -1 &&
setsockopt(p->query->fd, SOL_SOCKET, SO_RTABLE, &p->rtable,
sizeof(p->rtable)) == -1)
fatal("client_dispatch setsockopt SO_RTABLE");
+#endif
for (cmsg = CMSG_FIRSTHDR(&somsg); cmsg != NULL;
cmsg = CMSG_NXTHDR(&somsg, cmsg)) {

+ 26
- 0
compat/arc4random.h View File

@ -0,0 +1,26 @@
#ifndef LIBCRYPTOCOMPAT_ARC4RANDOM_H
#define LIBCRYPTOCOMPAT_ARC4RANDOM_H
#include <sys/param.h>
#if defined(__FreeBSD__)
#include "arc4random_freebsd.h"
#elif defined(__linux__)
#include "arc4random_linux.h"
#elif defined(__APPLE__)
#include "arc4random_osx.h"
#elif defined(__sun)
#include "arc4random_solaris.h"
#elif defined(_WIN32)
#include "arc4random_win.h"
#else
#error "No arc4random hooks defined for this platform."
#endif
#endif

+ 96
- 0
compat/bsd-asprintf.c View File

@ -0,0 +1,96 @@
/*
* Copyright (c) 2004 Darren Tucker.
*
* Based originally on asprintf.c from OpenBSD:
* Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef HAVE_ASPRINTF
#include <errno.h>
#include <limits.h> /* for INT_MAX */
#include <stdarg.h>
#include <stdio.h> /* for vsnprintf */
#include <stdlib.h>
#ifndef VA_COPY
# ifdef HAVE_VA_COPY
# define VA_COPY(dest, src) va_copy(dest, src)
# else
# ifdef HAVE___VA_COPY
# define VA_COPY(dest, src) __va_copy(dest, src)
# else
# define VA_COPY(dest, src) (dest) = (src)
# endif
# endif
#endif
#define INIT_SZ 128
int
vasprintf(char **str, const char *fmt, va_list ap)
{
int ret;
va_list ap2;
char *string, *newstr;
size_t len;
if ((string = malloc(INIT_SZ)) == NULL)
goto fail;
VA_COPY(ap2, ap);
ret = vsnprintf(string, INIT_SZ, fmt, ap2);
va_end(ap2);
if (ret >= 0 && ret < INIT_SZ) { /* succeeded with initial alloc */
*str = string;
} else if (ret == INT_MAX || ret < 0) { /* Bad length */
free(string);
goto fail;
} else { /* bigger than initial, realloc allowing for nul */
len = (size_t)ret + 1;
if ((newstr = realloc(string, len)) == NULL) {
free(string);
goto fail;
}
VA_COPY(ap2, ap);
ret = vsnprintf(newstr, len, fmt, ap2);
va_end(ap2);
if (ret < 0 || (size_t)ret >= len) { /* failed with realloc'ed string */
free(newstr);
goto fail;
}
*str = newstr;
}
return (ret);
fail:
*str = NULL;
errno = ENOMEM;
return (-1);
}
int asprintf(char **str, const char *fmt, ...)
{
va_list ap;
int ret;
*str = NULL;
va_start(ap, fmt);
ret = vasprintf(str, fmt, ap);
va_end(ap);
return ret;
}
#endif

+ 20
- 0
compat/imsg.patch View File

@ -0,0 +1,20 @@
--- imsg.orig 2014-12-28 13:24:02.771330936 -0600
+++ imsg.c 2014-12-28 13:24:35.347331642 -0600
@@ -70,6 +70,7 @@
return (-1);
again:
+#ifdef HAVE_GETDTABLECOUNT
if (getdtablecount() + imsg_fd_overhead +
(CMSG_SPACE(sizeof(int))-CMSG_SPACE(0))/sizeof(int)
>= getdtablesize()) {
@@ -77,7 +78,8 @@
free(ifd);
return (-1);
}
-
+#endif
+
if ((n = recvmsg(ibuf->fd, &msg, 0)) == -1) {
if (errno == EMSGSIZE)
goto fail;

+ 165
- 0
compat/setproctitle.c View File

@ -0,0 +1,165 @@
/* Based on conf.c from UCB sendmail 8.8.8 */
/*
* Copyright 2003 Damien Miller
* Copyright (c) 1983, 1995-1997 Eric P. Allman
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef HAVE_SETPROCTITLE
#include <stdarg.h>
#include <stdlib.h>
#include <unistd.h>
#ifdef HAVE_SYS_PSTAT_H
#include <sys/pstat.h>
#endif
#include <string.h>
#define SPT_NONE 0 /* don't use it at all */
#define SPT_PSTAT 1 /* use pstat(PSTAT_SETCMD, ...) */
#define SPT_REUSEARGV 2 /* cover argv with title information */
#ifndef SPT_TYPE
# define SPT_TYPE SPT_NONE
#endif
#ifndef SPT_PADCHAR
# define SPT_PADCHAR '\0'
#endif
#if SPT_TYPE == SPT_REUSEARGV
static char *argv_start = NULL;
static size_t argv_env_len = 0;
#endif
#endif /* HAVE_SETPROCTITLE */
void
compat_init_setproctitle(int argc, char *argv[])
{
#if !defined(HAVE_SETPROCTITLE) && \
defined(SPT_TYPE) && SPT_TYPE == SPT_REUSEARGV
extern char **environ;
char *lastargv = NULL;
char **envp = environ;
int i;
/*
* NB: This assumes that argv has already been copied out of the
* way. This is true for sshd, but may not be true for other
* programs. Beware.
*/
if (argc == 0 || argv[0] == NULL)
return;
/* Fail if we can't allocate room for the new environment */
for (i = 0; envp[i] != NULL; i++)
;
if ((environ = calloc(i + 1, sizeof(*environ))) == NULL) {
environ = envp; /* put it back */
return;
}
/*
* Find the last argv string or environment variable within
* our process memory area.
*/
for (i = 0; i < argc; i++) {
if (lastargv == NULL || lastargv + 1 == argv[i])
lastargv = argv[i] + strlen(argv[i]);
}
for (i = 0; envp[i] != NULL; i++) {
if (lastargv + 1 == envp[i])
lastargv = envp[i] + strlen(envp[i]);
}
argv[1] = NULL;
argv_start = argv[0];
argv_env_len = lastargv - argv[0] - 1;
/*
* Copy environment
* XXX - will truncate env on strdup fail
*/
for (i = 0; envp[i] != NULL; i++)
environ[i] = strdup(envp[i]);
environ[i] = NULL;
#endif /* SPT_REUSEARGV */
}
#ifndef HAVE_SETPROCTITLE
void
setproctitle(const char *fmt, ...)
{
#if SPT_TYPE != SPT_NONE
va_list ap;
char buf[1024], ptitle[1024];
size_t len;
int r;
extern char *__progname;
#if SPT_TYPE == SPT_PSTAT
union pstun pst;
#endif
#if SPT_TYPE == SPT_REUSEARGV
if (argv_env_len <= 0)
return;
#endif
strlcpy(buf, __progname, sizeof(buf));
r = -1;
va_start(ap, fmt);
if (fmt != NULL) {
len = strlcat(buf, ": ", sizeof(buf));
if (len < sizeof(buf))
r = vsnprintf(buf + len, sizeof(buf) - len , fmt, ap);
}
va_end(ap);
if (r == -1 || (size_t)r >= sizeof(buf) - len)
return;
strnvis(ptitle, buf, sizeof(ptitle),
VIS_CSTYLE|VIS_NL|VIS_TAB|VIS_OCTAL);
#if SPT_TYPE == SPT_PSTAT
pst.pst_command = ptitle;
pstat(PSTAT_SETCMD, pst, strlen(ptitle), 0, 0);
#elif SPT_TYPE == SPT_REUSEARGV
/* debug("setproctitle: copy \"%s\" into len %d",
buf, argv_env_len); */
len = strlcpy(argv_start, ptitle, argv_env_len);
for(; len < argv_env_len; len++)
argv_start[len] = SPT_PADCHAR;
#endif
#endif /* SPT_NONE */
}
#endif /* HAVE_SETPROCTITLE */

+ 39
- 0
config.patch View File

@ -0,0 +1,39 @@
--- config.orig 2014-12-28 12:15:23.139241646 -0600
+++ config.c 2014-12-28 12:15:58.843242420 -0600
@@ -75,7 +75,9 @@
if ((h = calloc(1, sizeof(struct ntp_addr))) == NULL)
fatal(NULL);
sa_in = (struct sockaddr_in *)&h->ss;
+#ifdef SIN_LEN
sa_in->sin_len = sizeof(struct sockaddr_in);
+#endif
sa_in->sin_family = AF_INET;
sa_in->sin_addr.s_addr = ina.s_addr;
@@ -97,7 +99,9 @@
if ((h = calloc(1, sizeof(struct ntp_addr))) == NULL)
fatal(NULL);
sa_in6 = (struct sockaddr_in6 *)&h->ss;
+#ifdef SIN6_LEN
sa_in6->sin6_len = sizeof(struct sockaddr_in6);
+#endif
sa_in6->sin6_family = AF_INET6;
memcpy(&sa_in6->sin6_addr,
&((struct sockaddr_in6 *)res->ai_addr)->sin6_addr,
@@ -141,12 +145,16 @@
h->ss.ss_family = res->ai_family;
if (res->ai_family == AF_INET) {
sa_in = (struct sockaddr_in *)&h->ss;
+#ifdef SIN_LEN
sa_in->sin_len = sizeof(struct sockaddr_in);
+#endif
sa_in->sin_addr.s_addr = ((struct sockaddr_in *)
res->ai_addr)->sin_addr.s_addr;
} else {
sa_in6 = (struct sockaddr_in6 *)&h->ss;
+#ifdef SIN6_LEN
sa_in6->sin6_len = sizeof(struct sockaddr_in6);
+#endif
memcpy(&sa_in6->sin6_addr, &((struct sockaddr_in6 *)
res->ai_addr)->sin6_addr, sizeof(struct in6_addr));
}

+ 147
- 0
configure.ac View File

@ -0,0 +1,147 @@
AC_INIT([OpenNTPD], m4_esyscmd([tr -d '\n' < VERSION]))
AC_CANONICAL_HOST
AM_INIT_AUTOMAKE([subdir-objects])
AC_CONFIG_MACRO_DIR([m4])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
AC_SUBST([USER_CFLAGS], "$CFLAGS")
CFLAGS="$CFLAGS -Wall -std=gnu99 -g"
case $host_os in
*darwin*)
HOST_OS=darwin
;;
*freebsd*)
HOST_OS=freebsd
AC_SUBST([PROG_LDADD], ['-lthr'])
;;
*linux*)
HOST_OS=linux
CFLAGS="$CFLAGS -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_SOURCE -D_GNU_SOURCE"
;;
*openbsd*)
AC_DEFINE([HAVE_ATTRIBUTE__BOUNDED__], [1], [OpenBSD gcc has __bounded__])
AC_DEFINE([HAVE_ATTRIBUTE__DEAD], [1], [OpenBSD gcc has __dead])
HAVE_SENSORS=true
;;
*solaris*)
HOST_OS=solaris
CFLAGS="$CFLAGS -D__EXTENSIONS__ -D_XOPEN_SOURCE=600 -DBSD_COMP"
AC_SUBST([PLATFORM_LDADD], ['-lnsl -lsocket'])
;;
*) ;;
esac
AM_CONDITIONAL([HOST_DARWIN], [test x$HOST_OS = xdarwin])
AM_CONDITIONAL([HOST_FREEBSD], [test x$HOST_OS = xfreebsd])
AM_CONDITIONAL([HOST_LINUX], [test x$HOST_OS = xlinux])
AM_CONDITIONAL([HOST_SOLARIS], [test x$HOST_OS = xsolaris])
AM_CONDITIONAL([HAVE_SENSORS], [test x$HAVE_SENSORS = xtrue ])
AC_CHECK_FUNC([clock_gettime],,
[AC_SEARCH_LIBS([clock_gettime],[rt posix4])])
AC_CHECK_FUNC([dl_iterate_phdr],,
[AC_SEARCH_LIBS([dl_iterate_phdr],[dl])])
AC_PROG_CC
AC_PROG_CC_STDC
AM_PROG_CC_C_O
AC_PROG_LIBTOOL
AC_PROG_YACC
save_cflags="$CFLAGS"
CFLAGS=-Wno-pointer-sign
AC_MSG_CHECKING([whether CC supports -Wno-pointer-sign])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([])],
[AC_MSG_RESULT([yes])]
[AM_CFLAGS=-Wno-pointer-sign],
[AC_MSG_RESULT([no])]
)
CFLAGS="$save_cflags $AM_CFLAGS"
AC_MSG_CHECKING([if compiling with clang])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [[
#ifndef __clang__
not clang
#endif
]])],
[AC_MSG_RESULT([yes])]
[CLANG_FLAGS=-Qunused-arguments],
[AC_MSG_RESULT([no])]
)
CFLAGS="$CFLAGS $CLANG_CFLAGS"
LDFLAGS="$LDFLAGS $CLANG_FLAGS"
AC_CHECK_FUNCS([adjfreq arc4random_uniform asprintf explicit_bzero])
AC_CHECK_FUNCS([getentropy memmem poll reallocarray])
AC_CHECK_FUNCS([setproctitle setgroups])
AC_CHECK_FUNCS([strlcat strlcpy strndup strnlen strtonum])
AC_CHECK_FUNCS([MD5Init])
# check if arc4random is in the system or in libcrypto
AC_CHECK_FUNC([arc4random],,
[AC_SEARCH_LIBS([arc4random],[crypto])])
AC_CHECK_FUNC([ibuf_open],,
[AC_SEARCH_LIBS([ibuf_open],[util])])
# Share test results with automake
AM_CONDITIONAL([HAVE_ADJFREQ], [test "x$ac_cv_func_adjfreq" = xyes])
AM_CONDITIONAL([HAVE_ARC4RANDOM], [test "x$ac_cv_func_arc4random" = xyes])
AM_CONDITIONAL([HAVE_ARC4RANDOM_UNIFORM], [test "x$ac_cv_func_arc4random_uniform" = xyes])
AM_CONDITIONAL([HAVE_ASPRINTF], [test "x$ac_cv_func_asprintf" = xyes])
AM_CONDITIONAL([HAVE_EXPLICIT_BZERO], [test "x$ac_cv_func_explicit_bzero" = xyes])
AM_CONDITIONAL([HAVE_GETENTROPY], [test "x$ac_cv_func_getentropy" = xyes])
AM_CONDITIONAL([HAVE_MEMMEM], [test "x$ac_cv_func_memmem" = xyes])
AM_CONDITIONAL([HAVE_POLL], [test "x$ac_cv_func_poll" = xyes])
AM_CONDITIONAL([HAVE_REALLOCARRAY], [test "x$ac_cv_func_reallocarray" = xyes])
AM_CONDITIONAL([HAVE_SETGROUPS], [test "x$ac_cv_func_setgroups" = xyes])
AM_CONDITIONAL([HAVE_SETPROCTITLE], [test "x$ac_cv_func_setproctitle" = xyes])
AM_CONDITIONAL([HAVE_STRLCAT], [test "x$ac_cv_func_strlcat" = xyes])
AM_CONDITIONAL([HAVE_STRLCPY], [test "x$ac_cv_func_strlcpy" = xyes])
AM_CONDITIONAL([HAVE_STRNDUP], [test "x$ac_cv_func_strndup" = xyes])
AM_CONDITIONAL([HAVE_STRNLEN], [test "x$ac_cv_func_strnlen" = xyes])
AM_CONDITIONAL([HAVE_STRTONUM], [test "x$ac_cv_func_strtonum" = xyes])
AM_CONDITIONAL([HAVE_MD5], [test "x$ac_cv_func_MD5Init" = xyes])
AM_CONDITIONAL([HAVE_IMSG], [test "x$ac_cv_func_ibuf_open" = xyes])
# overrides for arc4random_buf implementations with known issues
AM_CONDITIONAL([HAVE_ARC4RANDOM],
[test "x$HOST_OS" != xdarwin -a "x$HOST_OS" != xfreebsd -a "x$ac_cv_func_arc4random" = xyes])
AC_CACHE_CHECK([whether va_copy exists], ac_cv_have_va_copy, [
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <stdarg.h>
va_list x,y;
]], [[ va_copy(x,y); ]])],
[ ac_cv_have_va_copy="yes" ],
[ ac_cv_have_va_copy="no"
])
])
if test "x$ac_cv_have_va_copy" = "xyes" ; then
AC_DEFINE([HAVE_VA_COPY], [1], [Define if va_copy exists])
fi
AC_CACHE_CHECK([whether __va_copy exists], ac_cv_have___va_copy, [
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
#include <stdarg.h>
va_list x,y;
]], [[ __va_copy(x,y); ]])],
[ ac_cv_have___va_copy="yes" ], [ ac_cv_have___va_copy="no"
])
])
if test "x$ac_cv_have___va_copy" = "xyes" ; then
AC_DEFINE([HAVE___VA_COPY], [1], [Define if __va_copy exists])
fi
AC_CHECK_HEADERS([sys/timex.h])
AC_CONFIG_FILES([
Makefile
include/Makefile
])
AC_OUTPUT

+ 7
- 0
dist.sh View File

@ -0,0 +1,7 @@
#!/bin/sh
set -e
rm -f man/*.1 man/*.3
./autogen.sh
./configure --enable-libtls
make distcheck

+ 46
- 0
fake-sensors.c View File

@ -0,0 +1,46 @@
/* $OpenBSD: sensors.c,v 1.46 2012/09/20 12:43:16 patrick Exp $ */
/*
* Copyright (c) 2006 Henning Brauer <henning@openbsd.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "ntpd.h"
void
sensor_init(void)
{
}
int
sensor_scan(void)
{
return 0;
}
void
sensor_query(struct ntp_sensor *s)
{
}
int
sensor_hotplugfd(void)
{
return (-1);
}
void
sensor_hotplugevent(int fd)
{
}

+ 12
- 0
include/Makefile.am View File

@ -0,0 +1,12 @@
noinst_HEADERS =
noinst_HEADERS += signal.h
noinst_HEADERS += unistd.h
noinst_HEADERS += sys/types.h
noinst_HEADERS += sys/socket.h
noinst_HEADERS += sys/time.h
noinst_HEADERS += imsg.h
noinst_HEADERS += string.h
noinst_HEADERS += md5.h
noinst_HEADERS += stdlib.h
noinst_HEADERS += Makefile.in
noinst_HEADERS += poll.h

+ 15
- 0
include/poll.h View File

@ -0,0 +1,15 @@
/*
* Public domain
* poll.h compatibility shim
*/
#include_next <poll.h>
#ifndef LIBCOMPAT_POLL_H
#define LIBCOMPAT_POLL_H
#ifndef INFTIM
#define INFTIM (-1)
#endif
#endif

+ 10
- 0
include/signal.h View File

@ -0,0 +1,10 @@
/*
* Public domain
* signal.h compatibility shim
*/
#include_next <signal.h>
#ifndef SIGINFO
#define SIGINFO SIGUSR1
#endif

+ 21
- 0
include/unistd.h View File

@ -0,0 +1,21 @@
/*
* Public domain
* unistd.h compatibility shim
*/
#include_next <unistd.h>
#ifndef LIBCOMPAT_UNISTD_H
#define LIBCOMPAT_UNISTD_H
#ifndef HAVE_GETENTROPY
int getentropy(void *buf, size_t buflen);
#endif
#include <grp.h>
#ifndef HAVE_SETGROUPS
int setgroups(int ngroups, const gid_t *gidset);
#endif
#endif

+ 20
- 0
ntp.patch View File

@ -0,0 +1,20 @@
--- ntp.orig 2014-12-28 11:48:24.731206568 -0600
+++ ntp.c 2014-12-28 11:49:42.107208245 -0600
@@ -79,7 +79,7 @@
u_int pfd_elms = 0, idx2peer_elms = 0;
u_int listener_cnt, new_cnt, sent_cnt, trial_cnt;
u_int ctl_cnt;
- pid_t pid, dns_pid;
+ pid_t pid;
struct pollfd *pfd = NULL;
struct servent *se;
struct listen_addr *la;
@@ -118,7 +118,7 @@
close(pipe_prnt[0]);
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pipe_dns) == -1)
fatal("socketpair");
- dns_pid = ntp_dns(pipe_dns, nconf, pw);
+ ntp_dns(pipe_dns, nconf, pw);
close(pipe_dns[1]);
if (stat(pw->pw_dir, &stb) == -1)

+ 11
- 0
ntpd.conf View File

@ -0,0 +1,11 @@
# sample ntpd configuration file, see ntpd.conf(5)
# Addresses to listen on (ntpd does not listen by default)
#listen on *
# sync to a single server
#server ntp.example.org
# use a random selection of NTP Pool Time Servers
# see http://support.ntp.org/bin/view/Servers/NTPPoolServers
servers pool.ntp.org

+ 10
- 0
ntpd.patch View File

@ -0,0 +1,10 @@
--- ntpd.orig 2014-12-28 11:51:56.363211155 -0600
+++ ntpd.c 2014-12-28 11:52:00.971211255 -0600
@@ -30,6 +30,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <time.h>
#include <unistd.h>
#include <err.h>

+ 15
- 0
parse.patch View File

@ -0,0 +1,15 @@
--- parse.orig 2014-12-28 11:59:42.075221249 -0600
+++ parse.y 2014-12-28 11:54:22.799214329 -0600
@@ -313,10 +313,12 @@
opts.weight = $2;
}
rtable : RTABLE NUMBER {
+#ifdef RT_TABLEID_MAX
if ($2 < 0 || $2 > RT_TABLEID_MAX) {
yyerror("rtable must be between 1 and RT_TABLEID_MAX");
YYERROR;
}
+#endif
opts.rtable = $2;
}
;

+ 53
- 0
server.patch View File

@ -0,0 +1,53 @@
--- server.orig 2014-12-28 12:16:48.203243490 -0600
+++ server.c 2014-12-28 12:18:07.907245217 -0600
@@ -39,7 +39,10 @@
u_int8_t *a6;
size_t sa6len = sizeof(struct in6_addr);
u_int new_cnt = 0;
- int tos = IPTOS_LOWDELAY, rdomain, fd;
+ int tos = IPTOS_LOWDELAY;
+#ifdef SO_RTABLE
+ int rdomain, fd;
+#endif
TAILQ_FOREACH(lap, &lconf->listen_addrs, entry) {
switch (lap->sa.ss_family) {
@@ -59,6 +62,7 @@
strlcpy(ifr.ifr_name, ifap->ifa_name,
sizeof(ifr.ifr_name));
+#ifdef SO_RTABLE
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (ioctl(fd, SIOCGIFRDOMAIN,
(caddr_t)&ifr) == -1)
@@ -69,6 +73,7 @@
if (lap->rtable != -1 && rdomain != lap->rtable)
continue;
+#endif
if (sa->sa_family == AF_INET &&
((struct sockaddr_in *)sa)->sin_addr.s_addr ==
@@ -87,7 +92,9 @@
fatal("setup_listeners calloc");
memcpy(&la->sa, sa, SA_LEN(sa));
+#ifdef SO_RTABLE
la->rtable = rdomain;
+#endif
TAILQ_INSERT_TAIL(&lconf->listen_addrs, la, entry);
}
@@ -132,10 +139,12 @@
IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) == -1)
log_warn("setsockopt IPTOS_LOWDELAY");
+#ifdef SO_RTABLE
if (la->rtable != -1 &&
setsockopt(la->fd, SOL_SOCKET, SO_RTABLE, &la->rtable,
sizeof(la->rtable)) == -1)
fatal("setup_listeners setsockopt SO_RTABLE");
+#endif
if (bind(la->fd, (struct sockaddr *)&la->sa,
SA_LEN((struct sockaddr *)&la->sa)) == -1) {

+ 58
- 0
update.sh View File

@ -0,0 +1,58 @@
#!/usr/bin/env bash
set -e
openntpd_version=`cat VERSION`
# pull in latest upstream code
echo "pulling upstream openbsd source"
if [ ! -d openbsd ]; then
if [ -z "$OPENNTPD_GIT" ]; then
git clone https://github.com/openntpd-portable/openbsd.git
else
git clone $OPENNTPD_GIT/openbsd
fi
fi
#(cd openbsd
# git checkout master
# git pull --rebase)
# setup source paths
dir=`pwd`
libc_inc=$dir/openbsd/src/include
libc_src=$dir/openbsd/src/lib/libc
libcrypto_src=$dir/openbsd/src/lib/libcrypto
libutil_src=$dir/openbsd/src/lib/libutil
ntpd_src=$dir/openbsd/src/usr.sbin/ntpd
CP='cp -p'
cp $libc_inc/md5.h include/
cp $libutil_src/imsg.h include/
cp $libutil_src/imsg.c compat/
cp $libutil_src/imsg-buffer.c compat/
(cd compat; patch -p0 < imsg.patch)
for i in explicit_bzero.c strlcpy.c strlcat.c strndup.c strnlen.c; do
$CP $libc_src/string/$i compat
done
$CP $libc_src/stdlib/reallocarray.c compat
$CP $libc_src/stdlib/strtonum.c compat
$CP $libc_src/crypt/arc4random.c compat
$CP $libc_src/crypt/arc4random_uniform.c compat
$CP $libc_src/crypt/chacha_private.h compat
$CP $libc_src/hash/md5.c compat
$CP $libcrypto_src/crypto/getentropy_*.c compat
$CP $libcrypto_src/crypto/arc4random_*.h compat
for i in client.c config.c control.c log.c ntp.c ntp.h ntp_dns.c ntp_msg.c \
ntpd.c ntpd.h parse.y sensors.c server.c util.c \
ntpctl.8 ntpd.8 ntpd.conf.5 ; do
cp $ntpd_src/$i .
done
patch -p0 < client.patch
patch -p0 < config.patch
patch -p0 < ntp.patch
patch -p0 < ntpd.patch
patch -p0 < parse.patch
patch -p0 < server.patch
patch -p0 < util.patch

+ 13
- 0
util.patch View File

@ -0,0 +1,13 @@
--- util.orig 2014-12-28 12:18:54.727246232 -0600
+++ util.c 2014-12-28 12:19:04.211246438 -0600
@@ -17,8 +17,10 @@
*/
#include <sys/time.h>
+
#include <limits.h>
#include <stdio.h>
+#include <time.h>
#include "ntpd.h"

Loading…
Cancel
Save