diff -Paur --no-dereference -- ntpd.upstream/compat/bsd-setresuid.c ntpd/compat/bsd-setresuid.c --- ntpd.upstream/compat/bsd-setresuid.c +++ ntpd/compat/bsd-setresuid.c @@ -44,6 +44,7 @@ return -1; # endif +#if !defined(__sortix__) /* * When real, effective and saved uids are the same and we have * changed uids, sanity check that we cannot restore the old uid. @@ -62,6 +63,7 @@ errno = EACCES; return -1; } +#endif return ret; } diff -Paur --no-dereference -- ntpd.upstream/compat/imsg-buffer.c ntpd/compat/imsg-buffer.c --- ntpd.upstream/compat/imsg-buffer.c +++ ntpd/compat/imsg-buffer.c @@ -27,6 +27,10 @@ #include #include +#if defined(__sortix__) && !defined(IOV_MAX) +#include +#endif + #include "imsg.h" static int ibuf_realloc(struct ibuf *, size_t); @@ -252,7 +256,7 @@ msg.msg_iovlen = i; if (buf != NULL && buf->fd != -1) { - msg.msg_control = (caddr_t)&cmsgbuf.buf; + msg.msg_control = (char*)&cmsgbuf.buf; msg.msg_controllen = sizeof(cmsgbuf.buf); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_len = CMSG_LEN(sizeof(int)); diff -Paur --no-dereference -- ntpd.upstream/include/imsg.h ntpd/include/imsg.h --- ntpd.upstream/include/imsg.h +++ ntpd/include/imsg.h @@ -23,6 +23,8 @@ #include +typedef unsigned char u_char; + #define IBUF_READ_SIZE 65535 #define IMSG_HEADER_SIZE sizeof(struct imsg_hdr) #define MAX_IMSGSIZE 16384 diff -Paur --no-dereference -- ntpd.upstream/include/machine/endian.h ntpd/include/machine/endian.h --- ntpd.upstream/include/machine/endian.h +++ ntpd/include/machine/endian.h @@ -32,7 +32,7 @@ #include #else -#include_next +#include #endif diff -Paur --no-dereference -- ntpd.upstream/Makefile.in ntpd/Makefile.in --- ntpd.upstream/Makefile.in +++ ntpd/Makefile.in @@ -824,17 +824,14 @@ install-exec-hook: - @if [ ! -f "$(DESTDIR)$(sysconfdir)/ntpd.conf" ]; then \ - $(INSTALL) -m 644 "$(srcdir)/ntpd.conf" "$(DESTDIR)$(sysconfdir)/ntpd.conf"; \ - else \ - echo; \ - echo " $(DESTDIR)$(sysconfdir)/ntpd.conf already exists, install will not overwrite"; \ - fi + $(MKDIR_P) "$(DESTDIR)$(sysconfdir)/default" + $(INSTALL) -m 644 "$(srcdir)/ntpd.conf" "$(DESTDIR)$(sysconfdir)/default/ntpd.conf" + $(MKDIR_P) "$(DESTDIR)$(sysconfdir)/default/passwd.d" + echo "_ntp:x:100:100:_ntp:/var/empty:sh" > "$(DESTDIR)$(sysconfdir)/default/passwd.d/ntpd" + $(MKDIR_P) "$(DESTDIR)$(sysconfdir)/default/group.d" + echo "_ntp::100:_ntp" > "$(DESTDIR)$(sysconfdir)/default/group.d/ntpd" uninstall-local: - @if cmp -s "$(DESTDIR)$(sysconfdir)/ntpd.conf" "$(srcdir)/ntpd.conf"; then \ - rm -f "$(DESTDIR)$(sysconfdir)/ntpd.conf"; \ - fi @rm -f "$(DESTDIR)$(sbindir)/ntpctl" # Tell versions [3.59,3.63) of GNU make to not export all variables. diff -Paur --no-dereference -- ntpd.upstream/src/client.c ntpd/src/client.c --- ntpd.upstream/src/client.c +++ ntpd/src/client.c @@ -128,7 +128,9 @@ int client_query(struct ntp_peer *p) { +#ifdef IPTOS_LOWDELAY int val; +#endif if (p->addr == NULL && client_nextaddr(p) == -1) { if (conf->settime) @@ -189,10 +191,12 @@ } else fatal("client_query connect"); } +#ifdef IPTOS_LOWDELAY val = IPTOS_LOWDELAY; if (p->addr->ss.ss_family == AF_INET && setsockopt(p->query->fd, IPPROTO_IP, IP_TOS, &val, sizeof(val)) == -1) log_warn("setsockopt IPTOS_LOWDELAY"); +#endif #ifdef SO_TIMESTAMP val = 1; if (setsockopt(p->query->fd, SOL_SOCKET, SO_TIMESTAMP, @@ -307,7 +311,10 @@ somsg.msg_controllen = sizeof(cmsgbuf.buf); if ((size = recvmsg(p->query->fd, &somsg, 0)) == -1) { - if (errno == EHOSTUNREACH || errno == EHOSTDOWN || + if (errno == EHOSTUNREACH || +#ifdef EHOSTDOWN + errno == EHOSTDOWN || +#endif errno == ENETUNREACH || errno == ENETDOWN || errno == ECONNREFUSED || errno == EADDRNOTAVAIL || errno == ENOPROTOOPT || errno == ENOENT) { @@ -405,10 +412,11 @@ if (p->reply[p->shift].delay < 0) { interval = error_interval(); set_next(p, interval); - log_info("reply from %s: negative delay %fs, " + log_info("reply from %s: negative delay %lldms, " "next query %llds", log_sockaddr((struct sockaddr *)&p->addr->ss), - p->reply[p->shift].delay, (long long)interval); + (long long)(p->reply[p->shift].delay * 1000.0), + (long long)interval); return (0); } p->reply[p->shift].error = (T2 - T1) - (T3 - T4); @@ -470,10 +478,10 @@ else interval = scale_interval(INTERVAL_QUERY_NORMAL); - log_debug("reply from %s: offset %f delay %f, " + log_debug("reply from %s: offset %lldms delay %lldms, " "next query %llds", log_sockaddr((struct sockaddr *)&p->addr->ss), - offset, delay, + (long long)(offset * 1000), (long long)(delay * 1000), (long long)interval); set_next(p, interval); diff -Paur --no-dereference -- ntpd.upstream/src/config.c ntpd/src/config.c --- ntpd.upstream/src/config.c +++ ntpd/src/config.c @@ -25,7 +25,9 @@ #include #include #include +#if __has_include() #include +#endif #include #include "ntpd.h" diff -Paur --no-dereference -- ntpd.upstream/src/constraint.c ntpd/src/constraint.c --- ntpd.upstream/src/constraint.c +++ ntpd/src/constraint.c @@ -48,6 +48,10 @@ #define IMF_FIXDATE "%a, %d %h %Y %T GMT" #define X509_DATE "%Y-%m-%d %T UTC" +#if defined(__sortix__) +#define setgroups(a, b) ((void) (a), (void) (b), 0) +#endif + int constraint_addr_init(struct constraint *); void constraint_addr_head_clear(struct constraint *); struct constraint * @@ -265,7 +269,8 @@ constraint_add(cstr); constraint_cnt++; - if (socketpair(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, AF_UNSPEC, + /* PATCH: AF_UNIX SOCK_DGRAM isn't implemented on Sortix. */ + if (socketpair(AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, AF_UNSPEC, pipes) == -1) fatal("%s pipes", __func__); @@ -683,9 +688,9 @@ offset = gettime_from_timeval(&tv[0]) - gettime_from_timeval(&tv[1]); - log_info("constraint reply from %s: offset %f", + log_info("constraint reply from %s: offset %lld ms", log_sockaddr((struct sockaddr *)&cstr->addr->ss), - offset); + (long long)(offset * 1000)); cstr->state = STATE_REPLY_RECEIVED; cstr->last = getmonotime(); @@ -1095,6 +1100,13 @@ /* Return parsed date as local time */ t = timegm(&httpsdate->tls_tm); + /* PATCH: Adjust for leap seconds in Sortix CLOCK_REALTIME. */ +#ifdef CLOCK_REALTIME_HAS_LEAP_SECONDS + if (!sub_leap_seconds(&t) || !sub_leap_seconds(&when.tv_sec)) { + return (NULL); /* Ignore during added leap second. */ + } +#endif + /* Report parsed Date: as "received time" */ rectv->tv_sec = t; rectv->tv_usec = 0; diff -Paur --no-dereference -- ntpd.upstream/src/control.c ntpd/src/control.c --- ntpd.upstream/src/control.c +++ ntpd/src/control.c @@ -42,7 +42,7 @@ struct sockaddr_un saddr; int fd; - bzero(&saddr, sizeof(saddr)); + memset(&saddr, 0, sizeof(saddr)); saddr.sun_family = AF_UNIX; strlcpy(saddr.sun_path, path, sizeof(saddr.sun_path)); @@ -97,10 +97,12 @@ umask(old_umask); if (chmod(path, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) == -1) { +#if !defined(__sortix__) log_warn("control_init: chmod"); close(fd); (void)unlink(path); return (-1); +#endif } session_socket_nonblockmode(fd); diff -Paur --no-dereference -- ntpd.upstream/src/init/ntpd ntpd/src/init/ntpd --- ntpd.upstream/src/init/ntpd +++ ntpd/src/init/ntpd @@ -0,0 +1,2 @@ +require network +exec ntpd -d diff -Paur --no-dereference -- ntpd.upstream/src/Makefile.in ntpd/src/Makefile.in --- ntpd.upstream/src/Makefile.in +++ ntpd/src/Makefile.in @@ -1003,6 +1003,8 @@ info-am: install-data-am: install-man + mkdir -p $(DESTDIR)$(datadir)/init + cp init/ntpd $(DESTDIR)$(datadir)/init/ntpd install-dvi: install-dvi-am diff -Paur --no-dereference -- ntpd.upstream/src/ntp.c ntpd/src/ntp.c --- ntpd.upstream/src/ntp.c +++ ntpd/src/ntp.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -35,6 +36,10 @@ #include "ntpd.h" +#if defined(__sortix__) +#define setgroups(a, b) ((void) (a), (void) (b), 0) +#endif + #define PFD_PIPE_MAIN 0 #define PFD_PIPE_DNS 1 #define PFD_SOCK_CTL 2 @@ -79,7 +84,9 @@ u_int listener_cnt, new_cnt, sent_cnt, trial_cnt; u_int ctl_cnt; struct pollfd *pfd = NULL; +#if !defined(__sortix__) struct servent *se; +#endif struct listen_addr *la; struct ntp_peer *p; struct ntp_peer **idx2peer = NULL; @@ -96,7 +103,7 @@ pipe_dns) == -1) fatal("socketpair"); - start_child(NTPDNS_PROC_NAME, pipe_dns[1], argc, argv); + pid_t dns_pid = start_child(NTPDNS_PROC_NAME, pipe_dns[1], argc, argv); log_init(nconf->debug ? LOG_TO_STDERR : LOG_TO_SYSLOG, nconf->verbose, LOG_DAEMON); @@ -104,8 +111,10 @@ fatal("setsid"); log_procinit("ntp"); +#if !defined(__sortix__) if ((se = getservbyname("ntp", "udp")) == NULL) fatal("getservbyname"); +#endif /* Start control socket. */ if ((fd_ctl = control_init(CTLSOCKET)) == -1) @@ -137,14 +146,20 @@ setproctitle("ntp engine"); conf = nconf; +#if defined(__sortix__) + setup_listeners(NULL, conf, &listener_cnt); +#else setup_listeners(se, conf, &listener_cnt); +#endif if (setgroups(1, &pw->pw_gid) || setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) || setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid)) fatal("can't drop privileges"); +#if !defined(__sortix__) endservent(); +#endif /* The ntp process will want to open NTP client sockets -> "inet" */ if (pledge("stdio inet", NULL) == -1) @@ -464,6 +479,9 @@ msgbuf_clear(&ibuf_dns->w); free(ibuf_dns); + kill(dns_pid, SIGTERM); + waitpid(dns_pid, NULL, 0); + log_info("ntp engine exiting"); exit(0); } diff -Paur --no-dereference -- ntpd.upstream/src/ntpd.c ntpd/src/ntpd.c --- ntpd.upstream/src/ntpd.c +++ ntpd/src/ntpd.c @@ -45,6 +45,53 @@ #include "ntpd.h" +#if defined(__sortix__) +#include + +int adjtime(const struct timeval *delta, struct timeval *olddelta) +{ + if (delta) { + struct timespec deltats = { + .tv_sec = delta->tv_sec, + .tv_nsec = delta->tv_usec * 1000 + }; + struct timespec oldnow; + if (clock_gettime(CLOCK_REALTIME, &oldnow) < 0) + return -1; + struct timespec newnow = timespec_add(oldnow, deltats); + if (clock_settime(CLOCK_REALTIME, &newnow) < 0) + return -1; + } + if (olddelta) { + olddelta->tv_sec = 0; + olddelta->tv_usec = 0; + } + return 0; +} + +int +adjfreq(const int64_t *freq, int64_t *oldfreq) +{ + (void) freq; + (void) oldfreq; + //log_warnx("adjfreq is not implemented"); + if (oldfreq) + *oldfreq = 0; + return 0; +} + +/* + * The RTC is only updated if the clock is not marked as unsynced. + */ + +void +update_time_sync_status(int synced) +{ + (void) synced; + //log_warnx("update_time_sync_status is not implemented"); +} +#endif + void sighdlr(int); __dead void usage(void); int auto_preconditions(const struct ntpd_conf *); @@ -70,6 +117,7 @@ volatile sig_atomic_t sigchld = 0; struct imsgbuf *ibuf; int timeout = INFTIM; +int readyfd = -1; extern u_int constraint_cnt; @@ -108,6 +156,17 @@ } } +void +ready(void) +{ + if (0 <= readyfd) { + char c = '\n'; + write(readyfd, &c, 1); + close(readyfd); + readyfd = -1; + } +} + __dead void usage(void) { @@ -176,7 +235,10 @@ /* NOTREACHED */ } - conffile = CONFFILE; + if (access(CONFFILE, F_OK) < 0 && access(DEFAULTCONFFILE, F_OK) == 0) + conffile = DEFAULTCONFFILE; + else + conffile = CONFFILE; memset(&lconf, 0, sizeof(lconf)); @@ -222,6 +284,12 @@ } } + if (getenv("READYFD")) { + readyfd = atoi(getenv("READYFD")); + unsetenv("READYENV"); + fcntl(readyfd, F_SETFD, O_CLOEXEC | O_CLOFORK); + } + /* log to stderr until daemonized */ logdest = LOG_TO_STDERR; if (!lconf.debug) @@ -287,11 +355,13 @@ logdest = lconf.debug ? LOG_TO_STDERR : LOG_TO_SYSLOG; if (!lconf.settime) { log_init(logdest, lconf.verbose, LOG_DAEMON); +#if 0 /* PATCH: Modern daemons must not background. */ if (!lconf.debug) { if (daemon(1, 0)) fatal("daemon"); writepid(&lconf); } +#endif } else { settime_deadline = getmonotime(); timeout = 100; @@ -375,11 +445,14 @@ log_init(logdest, lconf.verbose, LOG_DAEMON); log_warnx("no reply received in time, skipping initial " "time setting"); +#if 0 if (!lconf.debug) { if (daemon(1, 0)) fatal("daemon"); writepid(&lconf); } +#endif + ready(); } if (nfds > 0 && (pfd[PFD_PIPE].revents & POLLOUT)) @@ -473,20 +546,25 @@ case IMSG_SETTIME: if (imsg.hdr.len != IMSG_HEADER_SIZE + sizeof(d)) fatalx("invalid IMSG_SETTIME received"); - if (!lconf->settime) + if (!lconf->settime) { + ready(); break; + } log_init(lconf->debug ? LOG_TO_STDERR : LOG_TO_SYSLOG, lconf->verbose, LOG_DAEMON); memcpy(&d, imsg.data, sizeof(d)); ntpd_settime(d); +#if 0 /* daemonize now */ if (!lconf->debug) { if (daemon(1, 0)) fatal("daemon"); writepid(lconf); } +#endif lconf->settime = 0; timeout = INFTIM; + ready(); break; case IMSG_CONSTRAINT_QUERY: priv_constraint_msg(imsg.hdr.peerid, @@ -507,9 +585,8 @@ void reset_adjtime(void) { - struct timeval tv; + struct timeval tv = { .tv_sec = 0, .tv_usec = 0 }; - timerclear(&tv); if (adjtime(&tv, NULL) == -1) log_warn("reset adjtime failed"); } @@ -523,9 +600,9 @@ d += getoffset(); if (d >= threshold || d <= -1 * threshold) - log_info("adjusting local clock by %fs", d); + log_info("adjusting local clock by %lldms", (long long)(d * 1000)); else - log_debug("adjusting local clock by %fs", d); + log_debug("adjusting local clock by %lldms", (long long)(d * 1000)); #ifdef HAVE_ADJTIMEX int rc; @@ -582,12 +659,12 @@ if (wrlog) { if (ppmfreq >= LOG_NEGLIGIBLE_ADJFREQ || ppmfreq <= -LOG_NEGLIGIBLE_ADJFREQ) - log_info("adjusting clock frequency by %f to %fppm%s", - ppmfreq, curfreq / 1e3 / (1LL << 32), + log_info("adjusting clock frequency by %lld to %lldppm%s", + (long long)ppmfreq, (long long)(curfreq / 1e3 / (1LL << 32)), r ? "" : " (no drift file)"); else - log_debug("adjusting clock frequency by %f to %fppm%s", - ppmfreq, curfreq / 1e3 / (1LL << 32), + log_debug("adjusting clock frequency by %lld to %lldppm%s", + (long long)ppmfreq, (long long)(curfreq / 1e3 / (1LL << 32)), r ? "" : " (no drift file)"); } @@ -610,18 +687,36 @@ return; } d_to_tv(d, &tv); +#ifdef CLOCK_REALTIME_HAS_LEAP_SECONDS + if (!add_leap_seconds(&tv.tv_sec)) { + /* You finally, really did it. You maniacs! You blew it up! God damn + you. God damn you all to hell. */ + return; /* Removed leap seconds have no representation here. */ + } +#endif curtime.tv_usec += tv.tv_usec + 1000000; curtime.tv_sec += tv.tv_sec - 1 + (curtime.tv_usec / 1000000); curtime.tv_usec %= 1000000; +#if defined(__sortix__) + struct timespec ts = { + .tv_sec = curtime.tv_sec, + .tv_nsec = curtime.tv_usec * 1000 + }; + if (clock_settime(CLOCK_REALTIME, &ts) == -1) { + log_warn("settimeofday"); + return; + } +#else if (settimeofday(&curtime, NULL) == -1) { log_warn("settimeofday"); return; } +#endif tval = curtime.tv_sec; strftime(buf, sizeof(buf), "%a %b %e %H:%M:%S %Z %Y", localtime(&tval)); - log_info("set local clock to %s (offset %fs)", buf, d); + log_info("set local clock to %s (offset %lldms)", buf, (long long)(d * 1000.0)); } static FILE *freqfp; @@ -632,6 +727,7 @@ int64_t current; int fd; double d; + long long lld; fd = open(DRIFTFILE, O_RDWR); if (fd == -1) { @@ -649,7 +745,8 @@ if (adjfreq(NULL, ¤t) == -1) log_warn("adjfreq failed"); else if (current == 0 && freqfp) { - if (fscanf(freqfp, "%lf", &d) == 1) { + if (fscanf(freqfp, "%lld", &lld) == 1) { + d = (double)lld; d /= 1e6; /* scale from ppm */ ntpd_adjfreq(d, 0); } else @@ -667,7 +764,8 @@ if (freqfp == NULL) return 0; rewind(freqfp); - r = fprintf(freqfp, "%.3f\n", d * 1e6); /* scale to ppm */ + long long lld = (long long)(d * 1e6); + r = fprintf(freqfp, "%lld\n", lld); /* scale to ppm */ if (r < 0 || fflush(freqfp) != 0) { if (warnonce) { log_warnx("can't write %s", DRIFTFILE); @@ -901,8 +999,8 @@ clock_offset = cstatus->clock_offset < 0 ? -1.0 * cstatus->clock_offset : cstatus->clock_offset; if (clock_offset > 5e-7) - printf(", clock offset is %.3fms\n", - cstatus->clock_offset); + printf(", clock offset is %lldms\n", + (long long)cstatus->clock_offset); else printf("\n"); } @@ -952,8 +1050,8 @@ (long long)cpeer->next, (long long)cpeer->poll); if (cpeer->trustlevel >= TRUSTLEVEL_BADPEER) - printf(" %12.3fms %9.3fms %8.3fms\n", cpeer->offset, - cpeer->delay, cpeer->jitter); + printf(" %12lldms %9lldms %8lldms\n", (long long)cpeer->offset, + (long long)cpeer->delay, (long long)cpeer->jitter); else printf(" ---- peer not valid ----\n"); diff -Paur --no-dereference -- ntpd.upstream/src/ntpd.h ntpd/src/ntpd.h --- ntpd.upstream/src/ntpd.h +++ ntpd/src/ntpd.h @@ -23,7 +23,9 @@ #include #include #include +#if __has_include() #include +#endif #include #include #include @@ -31,6 +33,11 @@ #include #include +typedef unsigned char u_char; +typedef unsigned short u_short; +typedef unsigned int u_int; +typedef unsigned long u_long; + #include "ntp.h" #include "log.h" @@ -44,6 +51,7 @@ #define SYSCONFDIR "/etc" #endif #define CONFFILE SYSCONFDIR "/ntpd.conf" +#define DEFAULTCONFFILE SYSCONFDIR "/default/ntpd.conf" #ifndef LOCALSTATEDIR #define LOCALSTATEDIR "/var" diff -Paur --no-dereference -- ntpd.upstream/src/ntp_dns.c ntpd/src/ntp_dns.c --- ntpd.upstream/src/ntp_dns.c +++ ntpd/src/ntp_dns.c @@ -20,8 +20,10 @@ #include #include #include +#ifndef __sortix__ #include #include +#endif #include @@ -33,11 +35,17 @@ #include #include #include +#ifndef __sortix__ #include +#endif #include #include "ntpd.h" +#ifdef __sortix__ +#define setgroups(a, b) ((void) (a), (void) (b), 0) +#endif + volatile sig_atomic_t quit_dns = 0; static struct imsgbuf *ibuf_dns; extern int non_numeric; @@ -64,7 +72,9 @@ struct pollfd pfd[1]; int nfds, nullfd; +#ifndef __sortix__ res_init(); +#endif if (setpriority(PRIO_PROCESS, 0, 0) == -1) log_warn("could not set priority"); @@ -214,6 +224,9 @@ return (0); } +/* PATCH: Sortix doesn't have res_qury but it's only used to check if the DNS + is online, but init(8) already ensures that's the case. */ +#ifndef __sortix__ int probe_root_ns(void) { @@ -238,18 +251,21 @@ return ret; } +#endif void probe_root(void) { int n; +#ifndef __sortix__ n = probe_root_ns(); if (n < 0) { /* give programs like unwind a second chance */ sleep(1); n = probe_root_ns(); } +#endif if (imsg_compose(ibuf_dns, IMSG_PROBE_ROOT, 0, 0, -1, &n, sizeof(int)) == -1) fatalx("probe_root"); diff -Paur --no-dereference -- ntpd.upstream/src/ntp_msg.c ntpd/src/ntp_msg.c --- ntpd.upstream/src/ntp_msg.c +++ ntpd/src/ntp_msg.c @@ -53,7 +53,11 @@ n = sendto(fd, msg, sizeof(*msg), 0, sa, sa_len); if (n == -1) { if (errno == ENOBUFS || errno == EHOSTUNREACH || - errno == ENETDOWN || errno == EHOSTDOWN) { + errno == ENETDOWN +#ifdef EHOSTDOWN + || errno == EHOSTDOWN +#endif + ) { /* logging is futile */ return (-1); } diff -Paur --no-dereference -- ntpd.upstream/src/server.c ntpd/src/server.c --- ntpd.upstream/src/server.c +++ ntpd/src/server.c @@ -41,7 +41,9 @@ u_int8_t *a6; size_t sa6len = sizeof(struct in6_addr); u_int new_cnt = 0; +#ifdef IPTOS_LOWDELAY int tos = IPTOS_LOWDELAY; +#endif #ifdef IPV6_V6ONLY int on = 1; #endif @@ -109,12 +111,20 @@ case AF_INET: if (((struct sockaddr_in *)&la->sa)->sin_port == 0) ((struct sockaddr_in *)&la->sa)->sin_port = +#if defined(__sortix__) + 123; +#else se->s_port; +#endif break; case AF_INET6: if (((struct sockaddr_in6 *)&la->sa)->sin6_port == 0) ((struct sockaddr_in6 *)&la->sa)->sin6_port = +#if defined(__sortix__) + 123; +#else se->s_port; +#endif break; case AF_UNSPEC: nla = TAILQ_NEXT(la, entry); @@ -133,9 +143,11 @@ if ((la->fd = socket(la->sa.ss_family, SOCK_DGRAM, 0)) == -1) fatal("socket"); +#ifdef IPTOS_LOWDELAY if (la->sa.ss_family == AF_INET && setsockopt(la->fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) == -1) log_warn("setsockopt IPTOS_LOWDELAY"); +#endif #ifdef IPV6_V6ONLY if (la->sa.ss_family == AF_INET6 && setsockopt(la->fd, @@ -183,7 +195,10 @@ fsa_len = sizeof(fsa); if ((size = recvfrom(fd, &buf, sizeof(buf), 0, (struct sockaddr *)&fsa, &fsa_len)) == -1) { - if (errno == EHOSTUNREACH || errno == EHOSTDOWN || + if (errno == EHOSTUNREACH || +#ifdef EHOSTDOWN + errno == EHOSTDOWN || +#endif errno == ENETUNREACH || errno == ENETDOWN) { log_warn("recvfrom %s", log_sockaddr((struct sockaddr *)&fsa)); diff -Paur --no-dereference -- ntpd.upstream/src/util.c ntpd/src/util.c --- ntpd.upstream/src/util.c +++ ntpd/src/util.c @@ -25,6 +25,8 @@ #include "ntpd.h" +int adjtime(const struct timeval *delta, struct timeval *olddelta); + double gettime_corrected(void) { @@ -48,6 +50,17 @@ if (gettimeofday(&tv, NULL) == -1) fatal("gettimeofday"); +/* PATCH: Sortix counts leap seconds in CLOCK_REALTIME but ntpd doesn't measure + leap seconds. Subtract them from the internal time to be UTC. */ +#ifdef CLOCK_REALTIME_HAS_LEAP_SECONDS + while (!sub_leap_seconds(&tv.tv_sec)) { + /* UTC cannot represent the current second because a leap second is + being inserted right now. Wait for it to pass and ignore it. */ + sleep(1); + gettimeofday(&tv, NULL); + } +#endif + return (gettime_from_timeval(&tv)); }