diff --git a/.gitignore b/.gitignore index 3afc609..cb93e5a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ ntimed-client .depend *.o _* +*.kdev4 diff --git a/compiler.h b/compiler.h index 7478a3f..fc5d7c3 100644 --- a/compiler.h +++ b/compiler.h @@ -42,54 +42,47 @@ */ #ifdef __VBCC__ -#include -#include -#define nan(p) NAN -#define __inline -#define __printflike(a, b) -#define round(x) x > 0.0 ? floor(x + 0.5) : ceil(x - 0.5) +# include +# include +# define nan(p) NAN +# define __inline +# define __printflike(a, b) +# define round(x) x > 0.0 ? floor(x + 0.5) : ceil(x - 0.5) typedef uint32_t register_t; #endif -#ifdef __GNUC__ - -#ifdef AOS3 -/* - * GCC 2.95.3 - */ -#include -#include -#include -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; -typedef uint32_t uintptr_t; - -static inline double -round(double x) -{ - return x > 0.0 ? floor(x + 0.5) : ceil(x - 0.5); -} - -#define nan(p) 0./0. -#endif - #ifdef AROS -#include -typedef uint32_t register_t; +# define HAVE_WAITSELECT #endif + +#ifdef __GNUC__ +# if (__GNUC__ == 2 && __GNUC_MINOR__ == 95) +# include +# include +# define round(x) x > 0.0 ? floor(x + 0.5) : ceil(x - 0.5) +# define nan(p) 0./0. +typedef u_int8_t uint8_t; +typedef u_int16_t uint16_t; +typedef u_int32_t uint32_t; +typedef u_int64_t uint64_t; +typedef uint32_t uintptr_t; +typedef unsigned int socklen_t; +# endif + +# ifdef AROS +# include +typedef uint32_t register_t; +# endif #endif #ifndef _ALIGNBYTES -#define _ALIGNBYTES (sizeof(register_t) - 1) -#define ALIGN(p) (((uintptr_t)(p) + _ALIGNBYTES) & ~_ALIGNBYTES) +# define _ALIGNBYTES (sizeof(register_t) - 1) +# define ALIGN(p) (((uintptr_t)(p) + _ALIGNBYTES) & ~_ALIGNBYTES) #endif #ifdef __GNUC__ -typedef unsigned int sa_family_t; -typedef unsigned int socklen_t; typedef uint16_t in_port_t; +typedef unsigned int sa_family_t; #endif // Is this needed since we dont use IPv6 ? diff --git a/configure b/configure old mode 100644 new mode 100755 index 1d7fadc..6e380d0 --- a/configure +++ b/configure @@ -39,10 +39,8 @@ HDRS=' ntp.h ntp_tbl.h net_getaddrinfo.h - net_poll.h param_instance.h param_tbl.h - tz.h udp.h ' @@ -54,7 +52,6 @@ SRCS=' combine_delta.c mem.c net_getaddrinfo.c - net_poll.c ntp_filter.c ntp_packet.c ntp_peer.c @@ -67,19 +64,18 @@ SRCS=' time_amiga.c time_sim.c time_stuff.c + time_unix.c todo.c - tz.c udp.c ' ################################################# -# TODO: Rewrite logic + SRCS1=' main_amiga_client.c combine_delta.c mem.c net_getaddrinfo.c - net_poll.c ntp_filter.c ntp_packet.c ntp_peer.c @@ -91,8 +87,8 @@ SRCS1=' suckaddr.c time_amiga.c time_stuff.c + time_unix.c todo.c - tz.c udp.c ' @@ -101,7 +97,6 @@ SRCS2=' combine_delta.c mem.c net_getaddrinfo.c - net_poll.c ntp_filter.c ntp_packet.c ntp_peer.c @@ -113,8 +108,8 @@ SRCS2=' suckaddr.c time_amiga.c time_stuff.c + time_unix.c todo.c - tz.c udp.c ' @@ -123,7 +118,6 @@ SRCS3=' combine_delta.c mem.c net_getaddrinfo.c - net_poll.c ntp_filter.c ntp_packet.c ntp_peer.c @@ -133,6 +127,7 @@ SRCS3=' param.c pll_std.c suckaddr.c + time_amiga.c time_sim.c time_stuff.c todo.c @@ -144,7 +139,6 @@ SRCS4=' combine_delta.c mem.c net_getaddrinfo.c - net_poll.c ntp_filter.c ntp_packet.c ntp_peer.c @@ -156,6 +150,7 @@ SRCS4=' suckaddr.c time_amiga.c time_stuff.c + time_unix.c todo.c udp.c ' @@ -165,9 +160,9 @@ SRCS4=' if make -v 2>&1 | grep GNU > /dev/null 2>&1 ; then echo "make is GNU make." VALID=true -else - echo "Wrong version of make." - VALID=false +#else +# echo "Wrong version of make." +# VALID=false fi if $VALID ; then @@ -177,13 +172,16 @@ if $VALID ; then echo 'all: ntimed ntimed-poll ntimed-sim ntimed-test' echo '' if [ -n "$1" ] && [ $1 = "AMIGA" ] ; then - echo 'CC = gcc' - echo "CFLAGS += -O2 -DAOS3 -DWITHTEST -Wall -Werror" + echo 'CC = gcc' + echo "CFLAGS = -O2 -DAOS3 -DWITHTEST -Wall -Werror" + echo "LDLIBS = -lm" elif [ -n "$1" ] && [ $1 = "AROS" ] ; then - echo 'CC = gcc' - echo "CFLAGS += -O2 -DAROS -DWITHTEST -Wall -Werror" + echo 'CC = gcc' + echo "CFLAGS = -O2 -DAROS -DWITHTEST -Wall -Werror" + echo "LDLIBS = -lm" else - echo "CFLAGS += -O2 -Wall -DWITHTEST -Werror" + echo "CFLAGS = -O2 -Wall -DWITHTEST -Werror" + echo "LDLIBS = -lm" fi echo '' @@ -201,7 +199,7 @@ if $VALID ; then echo fi done - + l="" for f in ${SRCS} do @@ -217,7 +215,6 @@ if $VALID ; then done ################################################# - # TODO: Rewrite logic BIN1="" for f in ${SRCS1} do @@ -245,16 +242,16 @@ if $VALID ; then echo echo "ntimed: ${BIN1}" - echo " \${CC} \${CFLAGS} -o ntimed ${BIN1} -lm" + echo " \${CC} \${CFLAGS} -o ntimed ${BIN1} \${LDLIBS}" echo echo "ntimed-poll: ${BIN2}" - echo " \${CC} \${CFLAGS} -o ntimed-poll ${BIN2} -lm" + echo " \${CC} \${CFLAGS} -o ntimed-poll ${BIN2} \${LDLIBS}" echo echo "ntimed-sim: ${BIN3}" - echo " \${CC} \${CFLAGS} -o ntimed-sim ${BIN3} -lm" + echo " \${CC} \${CFLAGS} -o ntimed-sim ${BIN3} \${LDLIBS}" echo echo "ntimed-test: ${BIN4}" - echo " \${CC} \${CFLAGS} -o ntimed-test ${BIN4} -lm" + echo " \${CC} \${CFLAGS} -o ntimed-test ${BIN4} \${LDLIBS}" echo echo "clean:" echo " rm -f ${l} ntimed ntimed-poll ntimed-sim ntimed-test" diff --git a/main_amiga_client.c b/main_amiga_client.c index febedce..966397c 100644 --- a/main_amiga_client.c +++ b/main_amiga_client.c @@ -25,14 +25,15 @@ * */ +//#include + #include "ntimed_platform.h" #include "ntimed.h" -#include "tz.h" #include "ntp.h" #include "udp.h" -#define ARGSFORMAT "P=PARAM/K,T=TRACEFILE/K,Z=TIMEZONE/K,SERVERS/M,SYNC/S,SAVE/S,SHOW/S,QUIET/S" -const char *vers = "\0$VER: ntimed-poll 0.9 (15.04.2015)"; +#define ARGSFORMAT "P=PARAM/K,T=TRACEFILE/K,SERVERS/M/A,SYNC/S,SAVE/S,SHOW/S,QUIET/S" +const char *vers = "\0$VER: ntimed-client 1.01 (18.04.2015)"; #define PARAM_CLIENT PARAM_INSTANCE #define PARAM_TABLE_NAME client_param_table @@ -40,14 +41,9 @@ const char *vers = "\0$VER: ntimed-poll 0.9 (15.04.2015)"; #undef PARAM_TABLE_NAME #undef PARAM_CLIENT -void Time_Amiga(struct todolist *); extern int validtime; - -BOOL savetime; -BOOL started_from_wb; -struct Library *BattClockBase; -struct Library *UtilityBase = NULL; -struct Library *SocketBase = NULL; +int savetime; +int started_from_wb; struct RDArgs *rdargs = NULL; struct ntp_peerset *nps = NULL; struct todolist *tdl = NULL; @@ -56,7 +52,6 @@ struct udp_socket *usc = NULL; struct ntimedargs { char *params; char *tracefile; - char *timezone; char **servers; long synchronize; long save; @@ -64,15 +59,13 @@ struct ntimedargs { long quiet; }; -static void init_libs(struct ntimedargs *args); static void init_logic(struct ntimedargs *args); static void clean_exit(); int main(int argc, char **argv) { struct ntimedargs args = { - NULL, NULL, NULL, NULL, - FALSE, FALSE, FALSE, FALSE + NULL, NULL, NULL, FALSE, FALSE, FALSE, FALSE }; started_from_wb = (argc == 0); @@ -93,7 +86,7 @@ int main(int argc, char **argv) if (!rdargs) { PrintFault(IoErr(), (ARGPTR)argv[0]); - exit(2); + exit(5); } } @@ -105,11 +98,7 @@ int main(int argc, char **argv) } } - init_libs(&args); - - if (args.timezone) { - ArgTimezone(args.timezone); - } + amiga_open_libs(); if (args.tracefile) { ArgTracefile(args.tracefile); @@ -129,31 +118,6 @@ int main(int argc, char **argv) return 0; } -static void init_libs(struct ntimedargs *args) -{ - if(!(UtilityBase = (struct Library *)OpenLibrary(UTILLIB_NAME, UTILLIB_REV))) { - Put(NULL, OCX_DIAG, "Cannot open utility library.\n"); - exit(2); - } - - if (args->save) { - BattClockBase = OpenResource(BATTCLOCK_NAME); - } - -#ifdef AROS - if(!(SocketBase = OpenLibrary(BSDLIB_NAME, BSDLIB_REV))) { - Put(NULL, OCX_DIAG, "No TCP/IP Stack running.\n"); - exit(2); - } - - if(SocketBaseTags(SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno))), (IPTR)&errno, - SBTM_SETVAL(SBTC_HERRNOLONGPTR), (IPTR)&h_errno, TAG_DONE)) { - Put(NULL, OCX_DIAG, "Error initializing bsdsocket.\n"); - exit(2); - } -#endif -} - static void set_params(char *params) { char *token; @@ -179,12 +143,6 @@ static void init_logic(struct ntimedargs *args) int i; int npeer = 0; - Put(NULL, OCX_DEBUG, "Timezone set to %s (UTC%s%.2f) %s\n", - tza[tzid].abbr, - tza[tzid].offset < 0.0 ? "-" : "+", - fabs(tza[tzid].offset), - tza[tzid].name); - tdl = TODO_NewList(); Time_Amiga(tdl); @@ -244,22 +202,11 @@ static void clean_exit() usc = NULL; } - if (UtilityBase != NULL) { - CloseLibrary(UtilityBase); - UtilityBase = NULL; - } - -#ifdef AROS - if (SocketBase != NULL) { - CloseLibrary(SocketBase); - SocketBase = NULL; - } -#endif - if (rdargs) { FreeArgs(rdargs); rdargs = NULL; } + amiga_close_libs(); freeall(); } diff --git a/main_amiga_poll.c b/main_amiga_poll.c index 623acef..cd50826 100644 --- a/main_amiga_poll.c +++ b/main_amiga_poll.c @@ -27,18 +27,13 @@ #include "ntimed_platform.h" #include "ntimed.h" -#include "tz.h" #include "ntp.h" #include "udp.h" -#define ARGSFORMAT "D=DURATION/N,M=MONITOR/K,T=TRACEFILE/K,Z=TIMEZONE/K,SERVERS/M,SHOW/S,QUIET/S" -const char *vers = "\0$VER: ntimed-poll 0.9 (15.04.2015)"; - -void Time_Amiga_Passive(void); +#define ARGSFORMAT "D=DURATION/N,M=MONITOR/K,T=TRACEFILE/K,SERVERS/M/A,SHOW/S,QUIET/S" +const char *vers = "\0$VER: ntimed-poll 1.01 (18.04.2015)"; BOOL started_from_wb; -struct Library *BattClockBase; -struct Library *SocketBase = NULL; struct RDArgs *rdargs = NULL; struct udp_socket *usc = NULL; struct ntp_peerset *npl = NULL; @@ -48,19 +43,17 @@ struct ntimedargs { long *duration; char *monitor; char *tracefile; - char *timezone; char **servers; long show; long quiet; }; -static void init_libs(struct ntimedargs *args); static void init_logic(struct ntimedargs *args); static void clean_exit(); int main(int argc, char **argv) { - struct ntimedargs args = { NULL, NULL, NULL, NULL, NULL, FALSE, FALSE }; + struct ntimedargs args = { NULL, NULL, NULL, NULL, FALSE, FALSE }; started_from_wb = (BOOL)argc; @@ -70,7 +63,7 @@ int main(int argc, char **argv) if (!rdargs) { PrintFault(IoErr(), (ARGPTR)argv[0]); - exit(2); + exit(5); } if (!args.quiet) { @@ -81,14 +74,12 @@ int main(int argc, char **argv) } } - init_libs(&args); + amiga_open_libs(); - if (args.timezone) { - ArgTimezone(args.timezone); + if (args.tracefile) { + ArgTracefile(args.tracefile); } - ArgTracefile(args.tracefile); - init_logic(&args); NTP_PeerSet_Poll(NULL, npl, usc, tdl); @@ -97,22 +88,6 @@ int main(int argc, char **argv) return 0; } -static void init_libs(struct ntimedargs *args) -{ -#ifdef AROS - if(!(SocketBase = OpenLibrary(BSDLIB_NAME, BSDLIB_REV))) { - Put(NULL, OCX_DIAG, "No TCP/IP Stack running.\n"); - exit(5); - } - - if(SocketBaseTags(SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno))), (IPTR)&errno, - SBTM_SETVAL(SBTC_HERRNOLONGPTR), (IPTR)&h_errno, TAG_DONE)) { - Put(NULL, OCX_DIAG, "Error initializing bsdsocket.\n"); - exit(5); - } -#endif -} - static void mps_filter(struct ocx *ocx, const struct ntp_peer *np) { @@ -210,11 +185,6 @@ static void init_logic(struct ntimedargs *args) exit(1); } - Put(NULL, OCX_TRACE, "# Timezone set to %s (UTC%s%.2f)\n", - tza[tzid].abbr, - tza[tzid].offset < 0.0 ? "-" : "+", - fabs(tza[tzid].offset)); - Put(NULL, OCX_TRACE, "# Duration of run set to %d seconds\n", duration); TODO_ScheduleRel(tdl, mps_end, NULL, duration, 0, "End task"); @@ -232,17 +202,11 @@ static void clean_exit() usc = NULL; } -#ifdef AROS - if (SocketBase != NULL) { - CloseLibrary(SocketBase); - SocketBase = NULL; - } -#endif - if (rdargs) { FreeArgs(rdargs); rdargs = NULL; } + amiga_close_libs(); freeall(); } diff --git a/main_amiga_sim.c b/main_amiga_sim.c index 7997e87..55e5894 100644 --- a/main_amiga_sim.c +++ b/main_amiga_sim.c @@ -26,13 +26,12 @@ */ #include "ntimed_platform.h" -#include "mem.h" #include "ntimed.h" #include "ntp.h" #include "udp.h" #define ARGSFORMAT "P=PARAM/K,B=BUMP/K,T=TRACEFILE/K,SIMFILE/A,QUIET/S" -const char *vers = "\0$VER: ntimed-poll 0.9 (15.04.2015)"; +const char *vers = "\0$VER: ntimed-sim 1.01 (18.04.2015)"; #define PARAM_CLIENT PARAM_INSTANCE #define PARAM_TABLE_NAME client_param_table @@ -66,7 +65,6 @@ SimFile_Open(struct ocx *ocx, const char *fn, struct todolist *tdl, /**********************************************************************/ BOOL started_from_wb; -struct Library *SocketBase = NULL; struct RDArgs *rdargs = NULL; struct todolist *tdl = NULL; @@ -78,7 +76,6 @@ struct ntimedargs { long quiet; }; -static void init_libs(struct ntimedargs *args); static void init_logic(struct ntimedargs *args); static void set_params(char *params); static void clean_exit(); @@ -101,7 +98,7 @@ int main(int argc, char **argv) EnableDebug(); } - init_libs(&args); + amiga_close_libs(); if (args.tracefile) { ArgTracefile(args.tracefile); @@ -160,38 +157,16 @@ static void init_logic(struct ntimedargs *args) /**********************************************************************/ -static void init_libs(struct ntimedargs *args) -{ -#ifdef AROS - if(!(SocketBase = OpenLibrary(BSDLIB_NAME, BSDLIB_REV))) { - Put(NULL, OCX_DIAG, "No TCP/IP Stack running.\n"); - exit(2); - } - - if(SocketBaseTags(SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno))), (IPTR)&errno, - SBTM_SETVAL(SBTC_HERRNOLONGPTR), (IPTR)&h_errno, TAG_DONE)) { - Put(NULL, OCX_DIAG, "Error initializing bsdsocket.\n"); - exit(2); - } -#endif -} - static void clean_exit() { ArgTracefile(NULL); -#ifdef AROS - if (SocketBase != NULL) { - CloseLibrary(SocketBase); - SocketBase = NULL; - } -#endif - if (rdargs) { FreeArgs(rdargs); rdargs = NULL; } + amiga_close_libs(); freeall(); } diff --git a/main_amiga_test.c b/main_amiga_test.c index cb993ad..959cd2b 100644 --- a/main_amiga_test.c +++ b/main_amiga_test.c @@ -29,19 +29,12 @@ #include "ntimed.h" #include "ntp.h" +const char *vers = "\0$VER: ntimed-test 1.01 (18.04.2015)"; BOOL started_from_wb; -struct Library *BattClockBase; -struct Library *SocketBase = NULL; -void Time_Amiga_Passive(void); static void clean_exit() { -#ifdef AROS - if (SocketBase != NULL) { - CloseLibrary(SocketBase); - SocketBase = NULL; - } -#endif + amiga_close_libs(); freeall(); } @@ -53,20 +46,7 @@ int main(int argc, char * const *argv) (void)argv; atexit(clean_exit); - -#ifdef AROS - if(!(SocketBase = OpenLibrary(BSDLIB_NAME, BSDLIB_REV))) { - Put(NULL, OCX_DIAG, "No TCP/IP Stack running.\n"); - exit(2); - } - - if(SocketBaseTags(SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno))), (IPTR)&errno, - SBTM_SETVAL(SBTC_HERRNOLONGPTR), (IPTR)&h_errno, TAG_DONE)) { - Put(NULL, OCX_DIAG, "Error initializing bsdsocket.\n"); - exit(2); - } -#endif - + amiga_open_libs(); EnableDebug(); Time_Amiga_Passive(); TS_RunTest(NULL); diff --git a/net_poll.c b/net_poll.c deleted file mode 100644 index 2950fb2..0000000 --- a/net_poll.c +++ /dev/null @@ -1,105 +0,0 @@ -/* ***** BEGIN LICENSE BLOCK ***** - * Version: APL License - * - * Copyright (c) 2009 Diego Casorran - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * ***** END LICENSE BLOCK ***** */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "net_poll.h" - -int poll(struct pollfd *pfds, nfds_t nfds, int timeout) -{ - unsigned int i; - int maxfd = -1, ret; - fd_set rset,wset,xset; - struct timeval timeout_tv, *tvp = NULL; - - if (timeout >= 0) - { - timeout_tv.tv_sec = (timeout / 1000); - timeout_tv.tv_usec = (timeout % 1000) * 1000; - tvp = &timeout_tv; - } - - if(pfds==NULL||nfds<1) - { - if(pfds==NULL&&nfds<1&&timeout>=0) - { - ret = select(0,NULL,NULL,NULL,tvp); - return(ret); - } - - errno=EINVAL; - return -1; - } - - FD_ZERO (&rset); - FD_ZERO (&wset); - FD_ZERO (&xset); - - for (i = 0; i < nfds; i++) - { - pfds[i].revents = 0; - - if (pfds[i].events == 0) - continue; - - if (pfds[i].fd > maxfd) - maxfd = pfds[i].fd; - - if (pfds[i].events & POLLIN) - FD_SET (pfds[i].fd, &rset); - - if (pfds[i].events & POLLOUT) - FD_SET (pfds[i].fd, &wset); - - if (pfds[i].events & POLLERR) - FD_SET (pfds[i].fd, &xset); - } - - ret = select (maxfd + 1, &rset, &wset, &xset, tvp); - - if(ret == -1) - return ret; - - for (i = 0; i < nfds; i++) - { - if (pfds[i].events == 0) - continue; - - if (FD_ISSET (pfds[i].fd, &rset)) - pfds[i].revents |= POLLIN; - - if (FD_ISSET (pfds[i].fd, &wset)) - pfds[i].revents |= POLLOUT; - - if (FD_ISSET (pfds[i].fd, &xset)) - pfds[i].revents |= POLLERR; - } - - return ret; -} diff --git a/net_poll.h b/net_poll.h deleted file mode 100644 index 414b245..0000000 --- a/net_poll.h +++ /dev/null @@ -1,54 +0,0 @@ -/*- - * Copyright (c) 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Charles M. Hannum. - * - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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 APOLL_H -#define APOLL_H - -struct pollfd { - int fd; // file descriptor - short events; // events to look for - short revents; // events returned -}; - -typedef unsigned int nfds_t; - -int poll(struct pollfd *, nfds_t, int); - -#define INFTIM -1 -#define POLLIN 0x0001 -#define POLLPRI 0x0002 -#define POLLERR 0x0008 -#define POLLOUT 0x0004 -#define POLLHUP 0x0010 -#define POLLNVAL 0x0020 -#define POLLRDNORM 0x0040 -#define POLLRDBAND 0x0080 -#define POLLWRBAND 0x0100 - -#endif diff --git a/ntimed_platform.h b/ntimed_platform.h index 01b6f67..c542f68 100644 --- a/ntimed_platform.h +++ b/ntimed_platform.h @@ -28,75 +28,114 @@ #define NTIMED_PLATFROM_H #if defined(AROS) || defined(AOS3) -#ifndef AMIGA -#define AMIGA +# ifndef AMIGA +# define AMIGA +# endif #endif + +#ifdef AMIGA +# include +# include +# include +# include +# include +#endif + +#ifdef AROS +# ifdef Debug +# undef Debug +# endif +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# ifdef Debug +# undef Debug +# endif #endif #include "mem.h" -#include -#include -#include -#include -#include -#include - -#ifdef AROS -#ifdef Debug -#undef Debug -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef Debug -#undef Debug -#endif -#endif #ifdef AOS3 -#define ARGPTR STRPTR -#define ARGS_FORMAT ARGSFORMAT -#define BSDLIB_NAME "bsdsocket.library" -#define BSDLIB_REV 04L -#define UTILLIB_NAME "utility.library" -#define UTILLIB_REV 33L -#define TIMER_NAME TIMERNAME -#define BATTCLOCK_NAME BATTCLOCKNAME +# define ARGPTR STRPTR +# define ARGS_FORMAT ARGSFORMAT +# define BSDLIB_NAME "bsdsocket.library" +# define BSDLIB_REV 04L +# define UTILLIB_NAME "utility.library" +# define UTILLIB_REV 33L +# define LOCALELIB_NAME "locale.library" +# define LOCALELIB_REV 33L +# define TIMER_NAME TIMERNAME +# define BATTCLOCK_NAME BATTCLOCKNAME #endif #ifdef AROS -#define ARGPTR CONST_STRPTR -#define ARGS_FORMAT (CONST_STRPTR)ARGSFORMAT -#define BSDLIB_NAME (CONST_STRPTR)"bsdsocket.library" -#define BSDLIB_REV 04L -#define UTILLIB_NAME (CONST_STRPTR)"utility.library" -#define UTILLIB_REV 33L -#define TIMER_NAME (CONST_STRPTR)TIMERNAME -#define BATTCLOCK_NAME (CONST_STRPTR)BATTCLOCKNAME -#define APRT IPRT +# define ARGPTR CONST_STRPTR +# define ARGS_FORMAT (CONST_STRPTR)ARGSFORMAT +# define BSDLIB_NAME (CONST_STRPTR)"bsdsocket.library" +# define BSDLIB_REV 04L +# define UTILLIB_NAME (CONST_STRPTR)"utility.library" +# define UTILLIB_REV 33L +# define LOCALELIB_NAME (CONST_STRPTR)"locale.library" +# define LOCALELIB_REV 33L +# define TIMER_NAME (CONST_STRPTR)TIMERNAME +# define BATTCLOCK_NAME (CONST_STRPTR)BATTCLOCKNAME +# define APRT IPRT #endif +#ifndef AMIGA +struct timeval { + ULONG tv_secs; + ULONG tv_micro; +}; +#endif + +#ifndef HAVE_POLL +#define POLLIN 0x0001 +struct pollfd { + int fd; + short events; + short revents; +}; +typedef unsigned int nfds_t; +int poll(struct pollfd *, nfds_t, int); +#endif + +#ifdef AMIGA +void amiga_open_libs(); +void amiga_close_libs(); void amiga_save_time(void); void amiga_sync_time(int seconds); void EnableDebug(); void EnableTraceDebug(); +#endif -#define SetSyncTime amiga_sync_time -#define Time_Amiga_Save amiga_save_time +#ifdef AROS +# define settimeofday ntimed_settimeofday +# define gettimeofday ntimed_gettimeofday +int gettimeofday(struct timeval *tv, struct timezone *tz); +int settimeofday(const struct timeval *tv, const struct timezone *tz); +#endif + +#ifdef AMIGA +# define Time_Amiga Time_Unix +# define Time_Amiga_Passive Time_Unix_Passive +# define Time_Amiga_Save amiga_save_time +# define SetSyncTime amiga_sync_time +#endif #ifdef Debug -#undef Debug +# undef Debug #endif #endif diff --git a/ntp_packet.c b/ntp_packet.c index 41d1757..7d434f3 100644 --- a/ntp_packet.c +++ b/ntp_packet.c @@ -1,5 +1,4 @@ /*- - * Copyright (c) 2015 Carsten Larsen * Copyright (c) 2014 Poul-Henning Kamp * All rights reserved. * @@ -65,10 +64,10 @@ #include "ntimed_endian.h" /* - * Seconds between 1900 (NTP epoch) and 1978 (Amiga epoch). - * 19 is the number of leapdays. + * Seconds between 1900 (NTP epoch) and 1970 (UNIX epoch). + * 17 is the number of leapdays. */ -#define NTP_AMIGA (((1978U - 1900U) * 365U + 19U) * 24U * 60U * 60U) +#define NTP_UNIX (((1970U - 1900U) * 365U + 17U) * 24U * 60U * 60U) /********************************************************************** * Picking a NTP packet apart in a safe, byte-order agnostic manner @@ -79,7 +78,7 @@ ntp64_2ts(struct timestamp *ts, const uint8_t *ptr) { INIT_OBJ(ts, TIMESTAMP_MAGIC); - ts->sec = Be32dec(ptr) - NTP_AMIGA; + ts->sec = Be32dec(ptr) - NTP_UNIX; ts->frac = (uint64_t)Be32dec(ptr + 4) << 32ULL; } @@ -146,7 +145,7 @@ ts_2ntp64(uint8_t *dst, const struct timestamp *ts) { CHECK_OBJ_NOTNULL(ts, TIMESTAMP_MAGIC); - Be32enc(dst, ts->sec + NTP_AMIGA); + Be32enc(dst, ts->sec + NTP_UNIX); Be32enc(dst + 4, ts->frac >> 32ULL); } diff --git a/time_amiga.c b/time_amiga.c index 583ee21..8dbf375 100644 --- a/time_amiga.c +++ b/time_amiga.c @@ -26,20 +26,23 @@ #include #include -#include #include +#include "ntimed.h" +#include "ntimed_platform.h" + +#include +#include + #include #include #include #include -#include -#include #include -#include #include #include #include +#include #include #include @@ -47,116 +50,190 @@ #undef Debug #endif -#include "ntimed.h" -#include "ntimed_platform.h" +// 2922 is the number of days between 1.1.1970 and 1.1.1978 (2 leap years and 6 normal) +#define AMIGAOFFSET 2922 * 24 * 60 * 60 +int gmtoffset = 0; -int amiga_get_time(struct timeval *tv); -int amiga_set_time(struct timeval *tv); -struct timerequest* create_timer(); -void delete_timer(struct timerequest*); -static void adjust_timeval(struct timeval *tv, double offset); - -// Ntimed internals -static double adj_offset = 0; -static double adj_duration = 0; -static double adj_freq = 0; - -static uintptr_t ticker; -static struct todolist *kt_tdl; - -#ifndef AMIGA -struct timeval { - ULONG tv_secs; - ULONG tv_micro; -}; -#endif +int create_timer(); +int delete_timer(); +void adjust_timeval(struct timeval *tv, double offset); +struct Library *BattClockBase; +struct Library *UtilityBase = NULL; +struct Library *LocaleBase = NULL; +struct Library *SocketBase = NULL; +struct Locale *locale = NULL; +struct timerequest *request = NULL; struct timeval sync_time; int validtime = 0; int limited_sync = 0; -float utcoffset = 0.0; -/**********************************************************************/ - -static void -amiga_setfreq(struct ocx *ocx, double frequency) +void amiga_open_libs() { - //assert(isfinite(frequency)); + if(!(LocaleBase = (struct Library *)OpenLibrary(LOCALELIB_NAME, LOCALELIB_REV))) { + Put(NULL, OCX_DIAG, "Cannot open locale library.\n"); + exit(10); + } - // frequency offset (scaled ppm) - // long int freq = (long)floor(frequency * (65536 * 1e6)); - Put(ocx, OCX_TRACE, "KERNPLL %.6e\n", frequency); + locale = OpenLocale(NULL); + gmtoffset = (int)locale->loc_GMTOffset * 60; + + // TODO: use tzlib.a + // get tm header and invoke: + // time_t now = time(NULL); + // struct tm lcl = *localtime(&now) + // And use gmt filed from tm header if != 0 + + if(!(UtilityBase = (struct Library *)OpenLibrary(UTILLIB_NAME, UTILLIB_REV))) { + Put(NULL, OCX_DIAG, "Cannot open utility library.\n"); + exit(10); + } + + BattClockBase = OpenResource(BATTCLOCK_NAME); + +#ifdef AROS + if(!(SocketBase = OpenLibrary(BSDLIB_NAME, BSDLIB_REV))) { + Put(NULL, OCX_DIAG, "No TCP/IP Stack running.\n"); + exit(10); + } + + if(SocketBaseTags(SBTM_SETVAL(SBTC_ERRNOPTR(sizeof(errno))), (IPTR)&errno, + SBTM_SETVAL(SBTC_HERRNOLONGPTR), (IPTR)&h_errno, TAG_DONE)) { + Put(NULL, OCX_DIAG, "Error initializing bsdsocket.\n"); + exit(10); + } +#endif + + if (create_timer() != 0) { + Put(NULL, OCX_DIAG, "Cannot open timer device.\n"); + exit(10); + } } -static enum todo_e __match_proto__(todo_f) -amiga_ticker(struct ocx *ocx, struct todolist *tdl, void *priv) +void amiga_close_libs() { - (void)ocx; - AN(tdl); - AZ(priv); - amiga_setfreq(ocx, adj_freq); - ticker = 0; - return (TODO_OK); + if (request != NULL) { + delete_timer(); + } + + if (locale != NULL) { + CloseLocale(locale); + locale = NULL; + } + + if (LocaleBase != NULL) { + CloseLibrary(LocaleBase); + LocaleBase = NULL; + } + + if (UtilityBase != NULL) { + CloseLibrary(UtilityBase); + UtilityBase = NULL; + } + +#ifdef AROS + if (SocketBase != NULL) { + CloseLibrary(SocketBase); + SocketBase = NULL; + } +#endif } -static void __match_proto__(tb_adjust_f) -amiga_adjust(struct ocx *ocx, double offset, double duration, double frequency) +int create_timer() { - double freq; + LONG error; + struct MsgPort *port = CreatePort(0, 0); + if (port == NULL) + return 1; - (void)ocx; - assert(duration >= 0.0); + request = (struct timerequest*)CreateExtIO(port, sizeof(struct timerequest)); + if (request == NULL) + { + DeletePort(port); + return 1; + } - if (ticker) - TODO_Cancel(kt_tdl, &ticker); + error = OpenDevice(TIMER_NAME, UNIT_MICROHZ, (struct IORequest*)request, 0L); + if (error != 0) + { + delete_timer(request); + return 1; + } - adj_offset = offset; - adj_duration = floor(duration); - if (adj_offset > 0.0 && adj_duration == 0.0) - adj_duration = 1.0; - adj_freq = frequency; + return 0; +} - freq = adj_freq; - if (adj_duration > 0.0) - freq += adj_offset / adj_duration; - amiga_setfreq(ocx, freq); - if (adj_duration > 0.0) - ticker = TODO_ScheduleRel(kt_tdl, amiga_ticker, NULL, - adj_duration, 0.0, "KT_TICK"); +int delete_timer() +{ + struct MsgPort *port; + if (request == NULL) + return 1; + + port = request->tr_node.io_Message.mn_ReplyPort; + + if (port != 0) + DeletePort(port); + + CloseDevice((struct IORequest*)request); + DeleteExtIO((struct IORequest*)request); + + return 0; } /**********************************************************************/ -static void __match_proto__(tb_step_f) -amiga_step(struct ocx *ocx, double offset) +int gettimeofday(struct timeval *tv, struct timezone *tz) +{ + request->tr_node.io_Command = TR_GETSYSTIME; + DoIO((struct IORequest*)request); + + tv->tv_secs = (int)request->tr_time.tv_secs - gmtoffset + AMIGAOFFSET; + tv->tv_micro = request->tr_time.tv_micro; + + return 0; +} + +int settimeofday(const struct timeval *tv, const struct timezone *tz) +{ + request->tr_node.io_Command = TR_SETSYSTIME; + request->tr_time.tv_secs = (int)tv->tv_secs + gmtoffset - AMIGAOFFSET; + request->tr_time.tv_micro = tv->tv_micro; + + DoIO((struct IORequest*)request); + + validtime = 1; + return 0; +} + +/**********************************************************************/ + +void amiga_save_time(void) { struct timeval tv; - Put(ocx, OCX_TRACE, "KERNTIME_STEP %.3e\n", offset); + if(!validtime) + return; - AZ(amiga_get_time(&tv)); - adjust_timeval(&tv, offset); - AZ(amiga_set_time(&tv)); - TB_generation++; + ResetBattClock(); + gettimeofday(&tv, NULL); + WriteBattClock(tv.tv_secs + gmtoffset - AMIGAOFFSET); } + /**********************************************************************/ -static struct timestamp * __match_proto__(tb_now_f) -amiga_now(struct timestamp *storage) +void amiga_sync_time(int seconds) { - struct timeval tv; - AZ(amiga_get_time(&tv)); - return (TS_Nanosec(storage, tv.tv_secs, tv.tv_micro * 1000LL)); + limited_sync = 1; + sync_time.tv_secs = seconds; + sync_time.tv_micro = 0; } /**********************************************************************/ -static int __match_proto__(tb_sleep_f) -amiga_sleep(double dur) +int amiga_sleep_time(double dur) { ULONG sigs, timersig; - struct timerequest *request; struct timeval tv; tv.tv_secs = 0; tv.tv_micro = 0; @@ -170,10 +247,6 @@ amiga_sleep(double dur) adjust_timeval(&tv, dur); - request = create_timer(); - if (request == NULL) - return 1; - request->tr_node.io_Command = TR_ADDREQUEST; request->tr_time = tv; @@ -184,160 +257,95 @@ amiga_sleep(double dur) if (sigs & SIGBREAKF_CTRL_C) { AbortIO((struct IORequest*)request); WaitIO((struct IORequest*)request); - delete_timer(request); exit(1); } - delete_timer(request); return 0; } /**********************************************************************/ -void Time_Amiga(struct todolist *tdl) -{ - AN(tdl); - TB_Step = amiga_step; - TB_Adjust = amiga_adjust; - TB_Sleep = amiga_sleep; - TB_Now = amiga_now; - kt_tdl = tdl; -} - -void Time_Amiga_Passive(void) -{ - TB_Sleep = amiga_sleep; - TB_Now = amiga_now; -} - -/**********************************************************************/ - -struct timerequest* create_timer() -{ - LONG error; - struct timerequest *request; - struct MsgPort *port = CreatePort(0, 0); - if (port == NULL) - return NULL; - - request = (struct timerequest*)CreateExtIO(port, sizeof(struct timerequest)); - if (request == NULL) - { - DeletePort(port); - return NULL; - } - - error = OpenDevice(TIMER_NAME, UNIT_MICROHZ, (struct IORequest*)request, 0L); - if (error != 0) - { - delete_timer(request); - return NULL; - } - - return request; -} - -void delete_timer(struct timerequest *request) -{ - struct MsgPort *port; - if (request == NULL) - return; - - port = request->tr_node.io_Message.mn_ReplyPort; - - if (port != 0) - DeletePort(port); - - CloseDevice((struct IORequest*)request); - DeleteExtIO((struct IORequest*)request); -} - -/**********************************************************************/ - -int amiga_get_time(struct timeval *tv) -{ - struct timerequest *request; - long tzoffset = (long)round(utcoffset * 60.0 * 60.0); - - request = create_timer(); - if (request == NULL) - return 1; - - request->tr_node.io_Command = TR_GETSYSTIME; - DoIO((struct IORequest*)request); - - *tv = request->tr_time; - tv->tv_secs = (long)tv->tv_secs - tzoffset; - - delete_timer(request); - return 0; -} - -int amiga_set_time(struct timeval *tv) -{ - struct timerequest *request; - long tzoffset = (long)round(utcoffset * 60.0 * 60.0); - - request = create_timer(); - if (request == NULL) - return 1; - - request->tr_node.io_Command = TR_SETSYSTIME; - request->tr_time = *tv; - request->tr_time.tv_secs += tzoffset; - - DoIO((struct IORequest*)request); - - delete_timer(request); - validtime = 1; - return 0; -} - -/**********************************************************************/ - -void amiga_save_time(void) -{ - struct timeval tv; - long tzoffset; - - if(!validtime) - return; - - ResetBattClock(); - amiga_get_time(&tv); - - tzoffset = (long)round(utcoffset * 60.0 * 60.0); - WriteBattClock((long)tv.tv_secs + tzoffset); -} - -void amiga_sync_time(int seconds) -{ - limited_sync = 1; - sync_time.tv_secs = seconds; - sync_time.tv_micro = 0; -} - -/**********************************************************************/ - -static void adjust_timeval(struct timeval *tv, double offset) +void adjust_timeval(struct timeval *tv, double offset) { double d1, d2; - long sec, micro; + int secs, micro; d1 = floor(offset); d2 = offset - d1; - sec = tv->tv_secs + (long)d1; - micro = tv->tv_micro + (long)floor(d2 * 1e6); + secs = tv->tv_secs + (int)d1; + micro = tv->tv_micro + (int)floor(d2 * 1e6); if (micro < 0) { - sec -= 1; + secs -= 1; micro += 1000000; } else if (micro >= 1000000) { - sec += 1; + secs += 1; micro -= 1000000; } - tv->tv_secs = sec; + tv->tv_secs = secs; tv->tv_micro = micro; } + +/**********************************************************************/ +#ifndef HAVE_POLL +int poll(struct pollfd *pfds, nfds_t nfds, int timeout) +{ + unsigned int i; + int maxfd = -1, ret; + fd_set rset,wset,xset; + struct timeval timeout_tv, *tvp = NULL; + + if(pfds == NULL || nfds < 1) + { + return amiga_sleep_time(timeout / 1000); + } + + if (timeout >= 0) + { + timeout_tv.tv_sec = (timeout / 1000); + timeout_tv.tv_usec = (timeout % 1000) * 1000; + tvp = &timeout_tv; + } + + FD_ZERO(&rset); + FD_ZERO(&wset); + FD_ZERO(&xset); + + for (i = 0; i < nfds; i++) + { + pfds[i].revents = 0; + + if (pfds[i].events == 0) + continue; + + if (pfds[i].fd > maxfd) + maxfd = pfds[i].fd; + + if (pfds[i].events & POLLIN) + FD_SET(pfds[i].fd, &rset); + + } + +#ifdef HAVE_WAITSELECT + ret = WaitSelect(maxfd + 1, &rset, &wset, &xset, tvp, NULL); +#else + ret = select(maxfd + 1, &rset, &wset, &xset, tvp); +#endif + + if(ret == -1) + return ret; + + for (i = 0; i < nfds; i++) + { + if (pfds[i].events == 0) + continue; + + if (FD_ISSET(pfds[i].fd, &rset)) + pfds[i].revents |= POLLIN; + } + + return ret; +} +#endif diff --git a/time_unix.c b/time_unix.c new file mode 100644 index 0000000..6240c04 --- /dev/null +++ b/time_unix.c @@ -0,0 +1,262 @@ +/*- + * Copyright (c) 2014 Poul-Henning Kamp + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + * + * UNIX timebase + * ============= + * + * Implement the timebase functions on top of a modern UNIX kernel which + * has the some version of the Mills/Kamp kernel PLL code and either + * [gs]ettimeofday(2) or better: clock_[gs]ettime(2) API. + * + */ + +#include +#include +#include +#include + +#include "ntimed.h" +#include "ntimed_platform.h" + +static double adj_offset = 0; +static double adj_duration = 0; +static double adj_freq = 0; + +static uintptr_t ticker; +static struct todolist *kt_tdl; + +// #undef CLOCK_REALTIME /* Test old unix code */ + +/********************************************************************** + * The NTP-pll in UNIX kernels apply the offset correction in an + * exponential-decay fashion for historical and wrong reasons. + * + * The short explanation is that this ends up confusing all PLLs I have + * ever seen, by introducing mainly odd harmonics of the PLL update period + * into all time-measurements in the system. + * + * A much more sane mode would be to tell the kernel "I want this much + * offset accumulated over this many seconds", giving a constant frequency + * over the PLL update period while still falling back to the frequency + * estimate should the time-steering userland process fail. + * + * I will add such a mode to the FreeBSD kernel as a reference implementation + * at a later date, in the mean time this code implements it by updating the + * kernel frequency from userland as needed. + * + * XXX: Optimise to only wake up when truly needed, rather than every second. + * XXX: Requires TODO cancellation. + */ + +static void +kt_setfreq(struct ocx *ocx, double frequency) +{ +/* + struct timex tx; + int i; + + assert(isfinite(frequency)); + + memset(&tx, 0, sizeof tx); + tx.modes = MOD_STATUS; +#if defined(MOD_NANO) + tx.modes |= MOD_NANO; +#elif defined(MOD_MICRO) + tx.modes |= MOD_MICRO; +#endif + + tx.status = STA_PLL | STA_FREQHOLD; + tx.modes = MOD_FREQUENCY; + tx.freq = (long)floor(frequency * (65536 * 1e6)); + errno = 0; + i = ntp_adjtime(&tx); +*/ + Put(ocx, OCX_TRACE, "KERNPLL %.6e %d\n", frequency, 0); + /* XXX: what is the correct error test here ? */ +// assert(i >= 0); +} + +static enum todo_e __match_proto__(todo_f) +kt_ticker(struct ocx *ocx, struct todolist *tdl, void *priv) +{ + + (void)ocx; + AN(tdl); + AZ(priv); + kt_setfreq(ocx, adj_freq); + ticker = 0; + return (TODO_OK); +} + +static void __match_proto__(tb_adjust_f) +kt_adjust(struct ocx *ocx, double offset, double duration, double frequency) +{ + double freq; + + (void)ocx; + assert(duration >= 0.0); + + if (ticker) + TODO_Cancel(kt_tdl, &ticker); + + adj_offset = offset; + adj_duration = floor(duration); + if (adj_offset > 0.0 && adj_duration == 0.0) + adj_duration = 1.0; + adj_freq = frequency; + + freq = adj_freq; + if (adj_duration > 0.0) + freq += adj_offset / adj_duration; + kt_setfreq(ocx, freq); + if (adj_duration > 0.0) + ticker = TODO_ScheduleRel(kt_tdl, kt_ticker, NULL, + adj_duration, 0.0, "KT_TICK"); +} + +/**********************************************************************/ + +#ifdef CLOCK_REALTIME + +static void __match_proto__(tb_step_f) +kt_step(struct ocx *ocx, double offset) +{ + double d; + struct timespec ts; + + Put(ocx, OCX_TRACE, "KERNTIME_STEP %.3e\n", offset); + d = floor(offset); + offset -= d; + + AZ(clock_gettime(CLOCK_REALTIME, &ts)); + ts.tv_sec += (long)d; + ts.tv_nsec += (long)floor(offset * 1e9); + if (ts.tv_nsec < 0) { + ts.tv_sec -= 1; + ts.tv_nsec += 1000000000; + } else if (ts.tv_nsec >= 1000000000) { + ts.tv_sec += 1; + ts.tv_nsec -= 1000000000; + } + AZ(clock_settime(CLOCK_REALTIME, &ts)); + TB_generation++; +} + +#else + +static void __match_proto__(tb_step_f) +kt_step(struct ocx *ocx, double offset) +{ + double d; + struct timeval tv; + + Put(ocx, OCX_TRACE, "KERNTIME_STEP %.3e\n", offset); + d = floor(offset); + offset -= d; + + AZ(gettimeofday(&tv, NULL)); + tv.tv_sec += (long)d; + tv.tv_usec += (long)floor(offset * 1e6); + if (tv.tv_usec < 0) { + tv.tv_sec -= 1; + tv.tv_usec += 1000000; + } else if (tv.tv_usec >= 1000000) { + tv.tv_sec += 1; + tv.tv_usec -= 1000000; + } + AZ(settimeofday(&tv, NULL)); + TB_generation++; +} + +#endif + +/**********************************************************************/ + +#if defined (CLOCK_REALTIME) + +static struct timestamp * __match_proto__(tb_now_f) +kt_now(struct timestamp *storage) +{ + struct timespec ts; + + AZ(clock_gettime(CLOCK_REALTIME, &ts)); + return (TS_Nanosec(storage, ts.tv_sec, ts.tv_nsec)); +} + +#else + +static struct timestamp * __match_proto__(tb_now_f) +kt_now(struct timestamp *storage) +{ + struct timeval tv; + + AZ(gettimeofday(&tv, NULL)); + return (TS_Nanosec(storage, tv.tv_sec, tv.tv_usec * 1000LL)); +} + +#endif + +/**********************************************************************/ + +static int __match_proto__(tb_sleep_f) +kt_sleep(double dur) +{ + struct pollfd fds[1]; + int i; + + i = poll(fds, 0, (int)floor(dur * 1e3)); + if (i < 0 && errno == EINTR) + return (1); + AZ(i); + return (0); +} + +/**********************************************************************/ + +void +Time_Unix(struct todolist *tdl) +{ + + AN(tdl); + TB_Step = kt_step; + TB_Adjust = kt_adjust; + TB_Sleep = kt_sleep; + TB_Now = kt_now; + kt_tdl = tdl; + + /* XXX: test if we have perms */ +} + +/********************************************************************** + * Non-tweaking subset. + */ + +void +Time_Unix_Passive(void) +{ + + TB_Sleep = kt_sleep; + TB_Now = kt_now; +} diff --git a/tz.c b/tz.c deleted file mode 100644 index 065618b..0000000 --- a/tz.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (c) 2015 Carsten Larsen - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - * - */ - -#include -#include -#include - -#include "tz.h" -#include "ntimed.h" - -int tzid = 0; - -void ArgTimezone(const char *tz) -{ - unsigned int i; - static const unsigned int count = sizeof(tza) / sizeof(struct tzabbr); - - if (tz == NULL) - return; - - if (!strcmp(tz, "-")) { - tzid = 0; - utcoffset = 0.0; - return; - } - - if (!strcmp(tz, "?")) { - PrintTimeZones(); - return; - } - - for (i = 0; i < count; i++) { - if (!strcmp(tza[i].abbr, tz)) { - tzid = i; - utcoffset = tza[i].offset; - return; - } - } - - Fail(NULL, 0, "Unknown timezone. Try TIMEZONE=?"); -} - -void PrintTimeZones() -{ - unsigned int i; - static const unsigned int count = sizeof(tza) / sizeof(struct tzabbr); - - for (i = 0; i < count; i++) { - Put(NULL, OCX_DEBUG, - "%s\t%s%.2f\t%s\n", - tza[i].abbr, - tza[i].offset < 0.0 ? "-" : "+", - fabs(tza[i].offset), - tza[i].name); - } - - exit(1); -} diff --git a/tz.h b/tz.h deleted file mode 100644 index 241b199..0000000 --- a/tz.h +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (c) 2015 Carsten Larsen - * 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. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - * - */ - -extern int tzid; -extern float utcoffset; - -void ArgTimezone(const char *tz); -void PrintTimeZones(); - -typedef struct tzabbr { - const char *abbr; - const char *name; - float offset; -} tzabbr; - -static const tzabbr tza[] = { - {"Z", "Zulu Time (Coordinated Universal Time)", 0.0}, -#ifndef SMALL - {"ACDT", "Australian Central Daylight Savings Time", 10.5}, - {"ACST", "Australian Central Standard Time", 9.5}, - {"ACT", "ASEAN Common Time", 8}, - {"ADT", "Atlantic Daylight Time", -3}, - {"AEDT", "Australian Eastern Daylight Savings Time", 11}, - {"AEST", "Australian Eastern Standard Time", 10}, - {"AFT", "Afghanistan Time", 4.5}, - {"AKDT", "Alaska Daylight Time", -8}, - {"AKST", "Alaska Standard Time", -9}, - {"AMST", "Armenia Summer Time", 5}, - {"AMT", "Armenia Time", 4}, - {"ART", "Argentina Time", -3}, - {"AST", "Arabia Standard Time", 3}, - {"AWDT", "Australian Western Daylight Time", 9}, - {"AWST", "Australian Western Standard Time", 8}, - {"AZOST", "Azores Standard Time", -1}, - {"AZT", "Azerbaijan Time", 4}, - {"BDT", "Brunei Time", 8}, - {"BIOT", "British Indian Ocean Time", 6}, - {"BIT", "Baker Island Time", -12}, - {"BOT", "Bolivia Time", -4}, - {"BRT", "Brasilia Time", -3}, - {"BST", "Bangladesh Standard Time", 6}, - {"BTT", "Bhutan Time", 6}, - {"CAT", "Central Africa Time", 2}, - {"CCT", "Cocos Islands Time", 6.5}, - {"CDT", "Central Daylight Time (North America)", -5}, - {"CEDT", "Central European Daylight Time", 2}, - {"CEST", "Central European Summer Time", 2}, - {"CET", "Central European Time", 1}, - {"CHADT", "Chatham Daylight Time", 13.75}, - {"CHAST", "Chatham Standard Time", 12.75}, - {"CHOT", "Choibalsan", 8}, - {"ChST", "Chamorro Standard Time", 10}, - {"CHUT", "Chuuk Time", 10}, - {"CIST", "Clipperton Island Standard Time", -8}, - {"CIT", "Central Indonesia Time", 8}, - {"CKT", "Cook Island Time", -10}, - {"CLST", "Chile Summer Time", -3}, - {"CLT", "Chile Standard Time", -4}, - {"COST", "Colombia Summer Time", -4}, - {"COT", "Colombia Time", -5}, - {"CST", "Central Standard Time (North America)", -6}, - {"CT", "China time", 8}, - {"CVT", "Cape Verde Time", -1}, - {"CXT", "Christmas Island Time", 7}, - {"DAVT", "Davis Time", 7}, - {"DDUT", "Dumont d'Urville Time", 10}, - {"EASST", "Easter Island Standard Summer Time", -5}, - {"EAST", "Easter Island Standard Time", -6}, - {"EAT", "East Africa Time", 3}, - {"ECT", "Ecuador Time", -5}, - {"EDT", "Eastern Daylight Time (North America)", -4}, - {"EEDT", "Eastern European Daylight Time", 3}, - {"EEST", "Eastern European Summer Time", 3}, - {"EET", "Eastern European Time", 2}, - {"EGST", "Eastern Greenland Summer Time", 0}, - {"EGT", "Eastern Greenland Time", -1}, - {"EIT", "Eastern Indonesian Time", 9}, - {"EST", "Eastern Standard Time (North America)", -5}, - {"FET", "Further-eastern European Time", 3}, - {"FJT", "Fiji Time", 12}, - {"FKST", "Falkland Islands Standard Time", -3}, - {"FKST", "Falkland Islands Summer Time", -3}, - {"FKT", "Falkland Islands Time", -4}, - {"FNT", "Fernando de Noronha Time", -2}, - {"GALT", "Galapagos Time", -6}, - {"GAMT", "Gambier Islands", -9}, - {"GET", "Georgia Standard Time", 4}, - {"GFT", "French Guiana Time", -3}, - {"GILT", "Gilbert Island Time", 12}, - {"GIT", "Gambier Island Time", -9}, - {"GMT", "Greenwich Mean Time", 0}, - {"GST", "South Georgia and the South Sandwich Islands", -2}, - {"GST", "Gulf Standard Time", 4}, - {"GYT", "Guyana Time", -4}, - {"HADT", "Hawaii-Aleutian Daylight Time", -9}, - {"HAEC", "Heure Avancée d'Europe Centrale francised name for CEST", 2}, - {"HAST", "Hawaii-Aleutian Standard Time", -10}, - {"HKT", "Hong Kong Time", 8}, - {"HMT", "Heard and McDonald Islands Time", 5}, - {"HOVT", "Khovd Time", 7}, - {"HST", "Hawaii Standard Time", -10}, - {"ICT", "Indochina Time", 7}, - {"IDT", "Israel Daylight Time", 3}, - {"IOT", "Indian Ocean Time", 3}, - {"IRDT", "Iran Daylight Time", 4.5}, - {"IRKT", "Irkutsk Time", 8}, - {"IRST", "Iran Standard Time", 3.5}, - {"IST", "Indian Standard Time", 5.5}, - {"JST", "Japan Standard Time", 9}, - {"KGT", "Kyrgyzstan time", 6}, - {"KOST", "Kosrae Time", 11}, - {"KRAT", "Krasnoyarsk Time", 7}, - {"KST", "Korea Standard Time", 9}, - {"LHST", "Lord Howe Standard Time", 10.5}, - {"LINT", "Line Islands Time", 14}, - {"MAGT", "Magadan Time", 12}, - {"MART", "Marquesas Islands Time", -8.5}, - {"MAWT", "Mawson Station Time", 5}, - {"MDT", "Mountain Daylight Time (North America)", -6}, - {"MET", "Middle European Time Same zone as CET", 1}, - {"MEST", "Middle European Saving Time Same zone as CEST", 2}, - {"MHT", "Marshall Islands", 12}, - {"MIST", "Macquarie Island Station Time", 11}, - {"MIT", "Marquesas Islands Time", -8.5}, - {"MMT", "Myanmar Time", 6.5}, - {"MSK", "Moscow Time", 3}, - {"MST", "Myanmar Standard Time", 6.5}, - {"MUT", "Mauritius Time", 4}, - {"MVT", "Maldives Time", 5}, - {"MYT", "Malaysia Time", 8}, - {"NCT", "New Caledonia Time", 11}, - {"NDT", "Newfoundland Daylight Time", -1.5}, - {"NFT", "Norfolk Time", 11.5}, - {"NPT", "Nepal Time", 5.75}, - {"NST", "Newfoundland Standard Time", -2.5}, - {"NT", "Newfoundland Time", -2.5}, - {"NUT", "Niue Time", -11}, - {"NZDT", "New Zealand Daylight Time", 13}, - {"NZST", "New Zealand Standard Time", 12}, - {"OMST", "Omsk Time", 6}, - {"ORAT", "Oral Time", 5}, - {"PDT", "Pacific Daylight Time (North America)", -7}, - {"PET", "Peru Time", -5}, - {"PETT", "Kamchatka Time", 12}, - {"PGT", "Papua New Guinea Time", 10}, - {"PHOT", "Phoenix Island Time", 13}, - {"PKT", "Pakistan Standard Time", 5}, - {"PMDT", "Saint Pierre and Miquelon Daylight time", -2}, - {"PMST", "Saint Pierre and Miquelon Standard Time", -3}, - {"PONT", "Pohnpei Standard Time", 11}, - {"PST", "Pacific Standard Time (North America)", -8}, - {"PYST", "Paraguay Summer Time (South America)", -3}, - {"PYT", "Paraguay Time (South America)", -4}, - {"RET", "Réunion Time", 4}, - {"ROTT", "Rothera Research Station Time", -3}, - {"SAKT", "Sakhalin Island time", 11}, - {"SAMT", "Samara Time", 4}, - {"SAST", "South African Standard Time", 2}, - {"SBT", "Solomon Islands Time", 11}, - {"SCT", "Seychelles Time", 4}, - {"SGT", "Singapore Time", 8}, - {"SLST", "Sri Lanka Time", 5.5}, - {"SRET", "Srednekolymsk Time", 11}, - {"SRT", "Suriname Time", -3}, - {"SST", "Samoa Standard Time", -11}, - {"SYOT", "Showa Station Time", 3}, - {"TAHT", "Tahiti Time", -10}, - {"THA", "Thailand Standard Time", 7}, - {"TFT", "Indian/Kerguelen", 5}, - {"TJT", "Tajikistan Time", 5}, - {"TKT", "Tokelau Time", 13}, - {"TLT", "Timor Leste Time", 9}, - {"TMT", "Turkmenistan Time", 5}, - {"TOT", "Tonga Time", 13}, - {"TVT", "Tuvalu Time", 12}, - {"UCT", "Coordinated Universal Time", 0}, - {"ULAT", "Ulaanbaatar Time", 8}, - {"USZ1", "Kaliningrad Time", 2}, - {"UTC", "Coordinated Universal Time", 0}, - {"UYST", "Uruguay Summer Time", -2}, - {"UYT", "Uruguay Standard Time", -3}, - {"UZT", "Uzbekistan Time", 5}, - {"VET", "Venezuelan Standard Time", -3.5}, - {"VLAT", "Vladivostok Time", 10}, - {"VOLT", "Volgograd Time", 4}, - {"VOST", "Vostok Station Time", 6}, - {"VUT", "Vanuatu Time", 11}, - {"WAKT", "Wake Island Time", 12}, - {"WAST", "West Africa Summer Time", 2}, - {"WAT", "West Africa Time", 1}, - {"WEDT", "Western European Daylight Time", 1}, - {"WEST", "Western European Summer Time", 1}, - {"WET", "Western European Time", 0}, - {"WIT", "Western Indonesian Time", 7}, - {"WST", "Western Standard Time", 8}, - {"YAKT", "Yakutsk Time", 9}, - {"YEKT", "Yekaterinburg Time", 5}, -#endif - {"+1", "Coordinated Universal Time +1", 1.0}, - {"+2", "Coordinated Universal Time +2", 2.0}, - {"+3", "Coordinated Universal Time +3", 3.0}, - {"+4", "Coordinated Universal Time +4", 4.0}, - {"+5", "Coordinated Universal Time +5", 5.0}, - {"+6", "Coordinated Universal Time +6", 6.0}, - {"+7", "Coordinated Universal Time +7", 7.0}, - {"+8", "Coordinated Universal Time +8", 8.0}, - {"+9", "Coordinated Universal Time +9", 9.0}, - {"+10", "Coordinated Universal Time +10", 10.0}, - {"+11", "Coordinated Universal Time +11", 11.0}, - {"+12", "Coordinated Universal Time +12", 12.0}, - {"-1", "Coordinated Universal Time -1", -1.0}, - {"-2", "Coordinated Universal Time -2", -2.0}, - {"-3", "Coordinated Universal Time -3", -3.0}, - {"-4", "Coordinated Universal Time -4", -4.0}, - {"-5", "Coordinated Universal Time -5", -5.0}, - {"-6", "Coordinated Universal Time -6", -6.0}, - {"-7", "Coordinated Universal Time -7", -7.0}, - {"-8", "Coordinated Universal Time -8", -8.0}, - {"-9", "Coordinated Universal Time -9", -9.0}, - {"-10", "Coordinated Universal Time -10", -10.0}, - {"-11", "Coordinated Universal Time -11", -11.0}, - {"-12", "Coordinated Universal Time -12", -12.0} -}; diff --git a/udp.c b/udp.c index 6d8e38b..908148f 100644 --- a/udp.c +++ b/udp.c @@ -39,9 +39,9 @@ #include #include +#include "ntimed_platform.h" #include "ntimed.h" #include "udp.h" -#include "net_poll.h" struct udp_socket { unsigned magic; @@ -74,9 +74,6 @@ void UDP_Socket_Destroy(struct udp_socket *usc) { CHECK_OBJ_NOTNULL(usc, UDP_SOCKET_MAGIC); -#ifdef AOS3 - close(usc->fd4); -#endif #ifdef AROS CloseSocket(usc->fd4); #endif