diff options
-rw-r--r-- | main/chrony/APKBUILD | 34 | ||||
-rw-r--r-- | main/chrony/timepps.h | 216 |
2 files changed, 239 insertions, 11 deletions
diff --git a/main/chrony/APKBUILD b/main/chrony/APKBUILD index 5a7ff1212..8702ea0d3 100644 --- a/main/chrony/APKBUILD +++ b/main/chrony/APKBUILD @@ -1,7 +1,7 @@ # Maintainer: Natanael Copa <ncopa@alpinelinux.org> pkgname=chrony -pkgver=1.29 -pkgrel=1 +pkgver=1.29.1 +pkgrel=0 _ver=${pkgver/_/-} pkgdesc="NTP client and server programs" url="http://chrony.tuxfamily.org/" @@ -17,11 +17,18 @@ source="http://download.tuxfamily.org/chrony/$pkgname-$_ver.tar.gz chronyd.initd chrony.logrotate chrony.conf + timepps.h " _builddir="$srcdir"/$pkgname-$_ver prepare() { local i + # We copy timepps.h to the local build directory instead of + # creating a pps-tools-dev package for ppstime.h + # (See https://github.com/ago/pps-tools) + mkdir -p "$_builddir"/pps-tools/sys + cp timepps.h "$_builddir"/pps-tools/sys/ + cd "$_builddir" for i in $source; do @@ -31,13 +38,15 @@ prepare() { done sed -i "s:/etc/chrony:/etc/chrony/chrony:g" \ chrony*.[158] faq.txt || die "sed failed" + } + build() { - cd "$_builddir" + + cd "$_builddir" + CPPFLAGS="$CPPFLAGS -I./pps-tools/" \ ./configure \ - --build=$CBUILD \ - --host=$CHOST \ --prefix=/usr \ --infodir=/usr/share/info \ --mandir=/usr/share/man \ @@ -61,24 +70,27 @@ package() { touch "$pkgdir"/etc/chrony/chrony.drift install -m644 "$srcdir"/chrony.conf "$pkgdir"/etc/chrony/chrony.conf } -md5sums="6e1a8ee2ce6632bedc2f8b5cdccfa69f chrony-1.29.tar.gz +md5sums="9d49eadac5eb49daec8cc3d92a869b0c chrony-1.29.1.tar.gz c479553205e2dfe1409c7924b0d0f81b 0001-uclibc-res-do-not-call-res_init.patch 1f72a2805160dfa653866e0963256f7f 0002-ntp_sources-decrease-maximum-re-resolving-delay.patch d62521b4c8837e15262c47ac88359307 chronyd.confd f0c73948224cc1706cf9c94e4d2d7b69 chronyd.initd 468eaf2b5465d60b3ee021ce3f948ab1 chrony.logrotate -46f42c52953d398ca44d6baa449618d7 chrony.conf" -sha256sums="c685f072ba0663ab026a7f56870ab2c246bd97ca4629dd2e1899617bd16ad39b chrony-1.29.tar.gz +46f42c52953d398ca44d6baa449618d7 chrony.conf +28f6835098a216f4a620f9218d15b5b8 timepps.h" +sha256sums="658c9bb4d8c8d8ec7d0908429aa266e5f8413ba86bd4acbfd2f9669f6065af27 chrony-1.29.1.tar.gz 4aec957ff59adbba1058e5376c73fe74e1e6fb511d9ca6cb5b6e74fca8c75a9f 0001-uclibc-res-do-not-call-res_init.patch 20be1362eac7f19d5ff3c69d0821d165ef7c29202b563c5e638c0f3092b192d8 0002-ntp_sources-decrease-maximum-re-resolving-delay.patch 29040502f86c419dbfbc7e2627cc658a8df82b37da21b3d1fce2eed9136d8f99 chronyd.confd f3a2a5ff9800bfc6a49897c6c8f64d264a75fc2e65cd98e059beaf9e5446fd1b chronyd.initd d25ce3f5ce4a28184931c68a97340a5b332cbaf071434d172f262122240ad652 chrony.logrotate -43e1bf9c3b0eb95c6330afdc9063f24353086f057d258c00ea711975a86c1194 chrony.conf" -sha512sums="bea384e098a7ea3862e49b31ee85959ae1d23af3a095dd34dbfc6e52329dc9404ff2ca9d0e01eb12ea79d2f5ab484a67f025c152a374bc6bd0e3a803a3bec93e chrony-1.29.tar.gz +43e1bf9c3b0eb95c6330afdc9063f24353086f057d258c00ea711975a86c1194 chrony.conf +ab4f459ee9d1037d7fa962a66ea652b08935539a4f443dc216e82b5717d8bb22 timepps.h" +sha512sums="0573eea9745089f0b5f257faaf9e601b98fd7d773063c41f3354592830bf5d047f4960e1a9e739ab706e5308ff908c29aead913ab7dbcf8b66543d18b85410bd chrony-1.29.1.tar.gz 5b1d0766eceee000d97dfb20c34f95319ac295729c16e571d7fe382e7d737c7335a1a98b67d89792056f969d4bb9eb7296c343ee4bb16c6a0805606f505d16c5 0001-uclibc-res-do-not-call-res_init.patch 765687fe59ba0f0f254e2d443defdb451fe6371d13dc62692d86d935d938dc10eb54c24ea70589227cd519153f94ae5171fcf6a0a08a2e7baf7b76be8abd4ac2 0002-ntp_sources-decrease-maximum-re-resolving-delay.patch 6919c7bddce2a8f81c0f2759c7c58506e97f89102bfeb7b5c19c6da5ed4cbd9070faddd4f3fb411bb4c653fffbdcc93a7f7dc810f38b199f038b1d4072f57640 chronyd.confd fdf97b2e6790b29ba1979326e553808712ba25b500e6c82346651b27711ba4b2e22f1bba9b26b6740127bd9ccaa25a7b7d27514a00489be5823a8bbf4cef13a8 chronyd.initd 8c2f9b396bde7f0124fdc4bb25fb31d154ae4ec73717401e5dd36a3730cd55ff91e60c70bcafb917883e437993ee245ad56e7a12c3711b482c6df592896a42dc chrony.logrotate -23157310e9352736efb000fef9f37cb57bfdc3b0ee95bfd5022b8e00dbfb16bfede1692fd91a128a9bedebfcf938b1668fa0695a112bd0c24525487ee2a53c65 chrony.conf" +23157310e9352736efb000fef9f37cb57bfdc3b0ee95bfd5022b8e00dbfb16bfede1692fd91a128a9bedebfcf938b1668fa0695a112bd0c24525487ee2a53c65 chrony.conf +eb11fc19243d1789016d88eb7645bfe67c46304547781489bf36eb1dd4c252d523681ff835a6488fa0ef62b6b9e2f781c672279f4439f5d5640a3f214a113048 timepps.h" diff --git a/main/chrony/timepps.h b/main/chrony/timepps.h new file mode 100644 index 000000000..8c3bd835d --- /dev/null +++ b/main/chrony/timepps.h @@ -0,0 +1,216 @@ +/* + * timepps.h -- PPS API main header + * + * Copyright (C) 2005-2007 Rodolfo Giometti <giometti@linux.it> + * Copyright (C) 2009-2011 Alexander Gordeev <alex@gordick.net> + * + * 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 Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Source: https://github.com/ago/pps-tools/ - Retreived Dec 2013 + */ + +#ifndef _SYS_TIMEPPS_H_ +#define _SYS_TIMEPPS_H_ + +#include <errno.h> +#include <sys/time.h> +#include <sys/ioctl.h> +#include <linux/types.h> +#include <linux/pps.h> + +#define LINUXPPS 1 /* signal we are using LinuxPPS */ + +/* + * New data structures + */ + +struct ntp_fp { + unsigned int integral; + unsigned int fractional; +}; + +union pps_timeu { + struct timespec tspec; + struct ntp_fp ntpfp; + unsigned long longpad[3]; +}; + +struct pps_info { + unsigned long assert_sequence; /* seq. num. of assert event */ + unsigned long clear_sequence; /* seq. num. of clear event */ + union pps_timeu assert_tu; /* time of assert event */ + union pps_timeu clear_tu; /* time of clear event */ + int current_mode; /* current mode bits */ +}; + +struct pps_params { + int api_version; /* API version # */ + int mode; /* mode bits */ + union pps_timeu assert_off_tu; /* offset compensation for assert */ + union pps_timeu clear_off_tu; /* offset compensation for clear */ +}; + +typedef int pps_handle_t; /* represents a PPS source */ +typedef unsigned long pps_seq_t; /* sequence number */ +typedef struct ntp_fp ntp_fp_t; /* NTP-compatible time stamp */ +typedef union pps_timeu pps_timeu_t; /* generic data type for time stamps */ +typedef struct pps_info pps_info_t; +typedef struct pps_params pps_params_t; + +#define assert_timestamp assert_tu.tspec +#define clear_timestamp clear_tu.tspec + +#define assert_timestamp_ntpfp assert_tu.ntpfp +#define clear_timestamp_ntpfp clear_tu.ntpfp + +#define assert_offset assert_off_tu.tspec +#define clear_offset clear_off_tu.tspec + +#define assert_offset_ntpfp assert_off_tu.ntpfp +#define clear_offset_ntpfp clear_off_tu.ntpfp + +/* + * The PPS API + */ + +static __inline int time_pps_create(int source, pps_handle_t *handle) +{ + int ret; + struct pps_kparams dummy; + + if (!handle) { + errno = EINVAL; + return -1; + } + + /* First we check if current device is a valid PPS one by + * doing a dummy PPS_GETPARAMS... + */ + ret = ioctl(source, PPS_GETPARAMS, &dummy); + if (ret) { + errno = EOPNOTSUPP; + return -1; + } + + /* ... then since in LinuxPPS there are no differences between a + * "PPS source" and a "PPS handle", we simply return the same value. + */ + *handle = source; + + return 0; +} + +static __inline int time_pps_destroy(pps_handle_t handle) +{ + return close(handle); +} + +static __inline int time_pps_getparams(pps_handle_t handle, + pps_params_t *ppsparams) +{ + int ret; + struct pps_kparams __ppsparams; + + ret = ioctl(handle, PPS_GETPARAMS, &__ppsparams); + + ppsparams->api_version = __ppsparams.api_version; + ppsparams->mode = __ppsparams.mode; + ppsparams->assert_off_tu.tspec.tv_sec = __ppsparams.assert_off_tu.sec; + ppsparams->assert_off_tu.tspec.tv_nsec = __ppsparams.assert_off_tu.nsec; + ppsparams->clear_off_tu.tspec.tv_sec = __ppsparams.clear_off_tu.sec; + ppsparams->clear_off_tu.tspec.tv_nsec = __ppsparams.clear_off_tu.nsec; + + return ret; +} + +static __inline int time_pps_setparams(pps_handle_t handle, + const pps_params_t *ppsparams) +{ + struct pps_kparams __ppsparams; + + __ppsparams.api_version = ppsparams->api_version; + __ppsparams.mode = ppsparams->mode; + __ppsparams.assert_off_tu.sec = ppsparams->assert_off_tu.tspec.tv_sec; + __ppsparams.assert_off_tu.nsec = ppsparams->assert_off_tu.tspec.tv_nsec; + __ppsparams.clear_off_tu.sec = ppsparams->clear_off_tu.tspec.tv_sec; + __ppsparams.clear_off_tu.nsec = ppsparams->clear_off_tu.tspec.tv_nsec; + + return ioctl(handle, PPS_SETPARAMS, &__ppsparams); +} + +/* Get capabilities for handle */ +static __inline int time_pps_getcap(pps_handle_t handle, int *mode) +{ + return ioctl(handle, PPS_GETCAP, mode); +} + +static __inline int time_pps_fetch(pps_handle_t handle, const int tsformat, + pps_info_t *ppsinfobuf, + const struct timespec *timeout) +{ + struct pps_fdata __fdata; + int ret; + + /* Sanity checks */ + if (tsformat != PPS_TSFMT_TSPEC) { + errno = EINVAL; + return -1; + } + + if (timeout) { + __fdata.timeout.sec = timeout->tv_sec; + __fdata.timeout.nsec = timeout->tv_nsec; + __fdata.timeout.flags = ~PPS_TIME_INVALID; + } else + __fdata.timeout.flags = PPS_TIME_INVALID; + + ret = ioctl(handle, PPS_FETCH, &__fdata); + + ppsinfobuf->assert_sequence = __fdata.info.assert_sequence; + ppsinfobuf->clear_sequence = __fdata.info.clear_sequence; + ppsinfobuf->assert_tu.tspec.tv_sec = __fdata.info.assert_tu.sec; + ppsinfobuf->assert_tu.tspec.tv_nsec = __fdata.info.assert_tu.nsec; + ppsinfobuf->clear_tu.tspec.tv_sec = __fdata.info.clear_tu.sec; + ppsinfobuf->clear_tu.tspec.tv_nsec = __fdata.info.clear_tu.nsec; + ppsinfobuf->current_mode = __fdata.info.current_mode; + + return ret; +} + +#ifdef PPS_KC_BIND + +static __inline int time_pps_kcbind(pps_handle_t handle, + const int kernel_consumer, + const int edge, const int tsformat) +{ + struct pps_bind_args __bind_args; + + __bind_args.tsformat = tsformat; + __bind_args.edge = edge; + __bind_args.consumer = kernel_consumer; + + return ioctl(handle, PPS_KC_BIND, &__bind_args); +} + +#else /* !PPS_KC_BIND */ + +static __inline int time_pps_kcbind(pps_handle_t handle, + const int kernel_consumer, + const int edge, const int tsformat) +{ + /* LinuxPPS doesn't implement kernel consumer feature */ + errno = EOPNOTSUPP; + return -1; +} + +#endif /* PPS_KC_BIND */ + +#endif /* _SYS_TIMEPPS_H_ */ |