Revision 1.01 changes
This commit is contained in:
parent
b705164771
commit
747b6a8672
|
@ -4,3 +4,4 @@ ntimed-client
|
||||||
.depend
|
.depend
|
||||||
*.o
|
*.o
|
||||||
_*
|
_*
|
||||||
|
*.kdev4
|
||||||
|
|
65
compiler.h
65
compiler.h
|
@ -42,54 +42,47 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __VBCC__
|
#ifdef __VBCC__
|
||||||
#include <stdint.h>
|
# include <stdint.h>
|
||||||
#include <sys/socket.h>
|
# include <sys/socket.h>
|
||||||
#define nan(p) NAN
|
# define nan(p) NAN
|
||||||
#define __inline
|
# define __inline
|
||||||
#define __printflike(a, b)
|
# define __printflike(a, b)
|
||||||
#define round(x) x > 0.0 ? floor(x + 0.5) : ceil(x - 0.5)
|
# define round(x) x > 0.0 ? floor(x + 0.5) : ceil(x - 0.5)
|
||||||
typedef uint32_t register_t;
|
typedef uint32_t register_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
|
|
||||||
#ifdef AOS3
|
|
||||||
/*
|
|
||||||
* GCC 2.95.3
|
|
||||||
*/
|
|
||||||
#include <machine/limits.h>
|
|
||||||
#include <machine/types.h>
|
|
||||||
#include <math.h>
|
|
||||||
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
|
#ifdef AROS
|
||||||
#include <stdint.h>
|
# define HAVE_WAITSELECT
|
||||||
typedef uint32_t register_t;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# if (__GNUC__ == 2 && __GNUC_MINOR__ == 95)
|
||||||
|
# include <math.h>
|
||||||
|
# include <sys/types.h>
|
||||||
|
# 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 <stdint.h>
|
||||||
|
typedef uint32_t register_t;
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef _ALIGNBYTES
|
#ifndef _ALIGNBYTES
|
||||||
#define _ALIGNBYTES (sizeof(register_t) - 1)
|
# define _ALIGNBYTES (sizeof(register_t) - 1)
|
||||||
#define ALIGN(p) (((uintptr_t)(p) + _ALIGNBYTES) & ~_ALIGNBYTES)
|
# define ALIGN(p) (((uintptr_t)(p) + _ALIGNBYTES) & ~_ALIGNBYTES)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
typedef unsigned int sa_family_t;
|
|
||||||
typedef unsigned int socklen_t;
|
|
||||||
typedef uint16_t in_port_t;
|
typedef uint16_t in_port_t;
|
||||||
|
typedef unsigned int sa_family_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Is this needed since we dont use IPv6 ?
|
// Is this needed since we dont use IPv6 ?
|
||||||
|
|
|
@ -39,10 +39,8 @@ HDRS='
|
||||||
ntp.h
|
ntp.h
|
||||||
ntp_tbl.h
|
ntp_tbl.h
|
||||||
net_getaddrinfo.h
|
net_getaddrinfo.h
|
||||||
net_poll.h
|
|
||||||
param_instance.h
|
param_instance.h
|
||||||
param_tbl.h
|
param_tbl.h
|
||||||
tz.h
|
|
||||||
udp.h
|
udp.h
|
||||||
'
|
'
|
||||||
|
|
||||||
|
@ -54,7 +52,6 @@ SRCS='
|
||||||
combine_delta.c
|
combine_delta.c
|
||||||
mem.c
|
mem.c
|
||||||
net_getaddrinfo.c
|
net_getaddrinfo.c
|
||||||
net_poll.c
|
|
||||||
ntp_filter.c
|
ntp_filter.c
|
||||||
ntp_packet.c
|
ntp_packet.c
|
||||||
ntp_peer.c
|
ntp_peer.c
|
||||||
|
@ -67,19 +64,18 @@ SRCS='
|
||||||
time_amiga.c
|
time_amiga.c
|
||||||
time_sim.c
|
time_sim.c
|
||||||
time_stuff.c
|
time_stuff.c
|
||||||
|
time_unix.c
|
||||||
todo.c
|
todo.c
|
||||||
tz.c
|
|
||||||
udp.c
|
udp.c
|
||||||
'
|
'
|
||||||
|
|
||||||
#################################################
|
#################################################
|
||||||
# TODO: Rewrite logic
|
|
||||||
SRCS1='
|
SRCS1='
|
||||||
main_amiga_client.c
|
main_amiga_client.c
|
||||||
combine_delta.c
|
combine_delta.c
|
||||||
mem.c
|
mem.c
|
||||||
net_getaddrinfo.c
|
net_getaddrinfo.c
|
||||||
net_poll.c
|
|
||||||
ntp_filter.c
|
ntp_filter.c
|
||||||
ntp_packet.c
|
ntp_packet.c
|
||||||
ntp_peer.c
|
ntp_peer.c
|
||||||
|
@ -91,8 +87,8 @@ SRCS1='
|
||||||
suckaddr.c
|
suckaddr.c
|
||||||
time_amiga.c
|
time_amiga.c
|
||||||
time_stuff.c
|
time_stuff.c
|
||||||
|
time_unix.c
|
||||||
todo.c
|
todo.c
|
||||||
tz.c
|
|
||||||
udp.c
|
udp.c
|
||||||
'
|
'
|
||||||
|
|
||||||
|
@ -101,7 +97,6 @@ SRCS2='
|
||||||
combine_delta.c
|
combine_delta.c
|
||||||
mem.c
|
mem.c
|
||||||
net_getaddrinfo.c
|
net_getaddrinfo.c
|
||||||
net_poll.c
|
|
||||||
ntp_filter.c
|
ntp_filter.c
|
||||||
ntp_packet.c
|
ntp_packet.c
|
||||||
ntp_peer.c
|
ntp_peer.c
|
||||||
|
@ -113,8 +108,8 @@ SRCS2='
|
||||||
suckaddr.c
|
suckaddr.c
|
||||||
time_amiga.c
|
time_amiga.c
|
||||||
time_stuff.c
|
time_stuff.c
|
||||||
|
time_unix.c
|
||||||
todo.c
|
todo.c
|
||||||
tz.c
|
|
||||||
udp.c
|
udp.c
|
||||||
'
|
'
|
||||||
|
|
||||||
|
@ -123,7 +118,6 @@ SRCS3='
|
||||||
combine_delta.c
|
combine_delta.c
|
||||||
mem.c
|
mem.c
|
||||||
net_getaddrinfo.c
|
net_getaddrinfo.c
|
||||||
net_poll.c
|
|
||||||
ntp_filter.c
|
ntp_filter.c
|
||||||
ntp_packet.c
|
ntp_packet.c
|
||||||
ntp_peer.c
|
ntp_peer.c
|
||||||
|
@ -133,6 +127,7 @@ SRCS3='
|
||||||
param.c
|
param.c
|
||||||
pll_std.c
|
pll_std.c
|
||||||
suckaddr.c
|
suckaddr.c
|
||||||
|
time_amiga.c
|
||||||
time_sim.c
|
time_sim.c
|
||||||
time_stuff.c
|
time_stuff.c
|
||||||
todo.c
|
todo.c
|
||||||
|
@ -144,7 +139,6 @@ SRCS4='
|
||||||
combine_delta.c
|
combine_delta.c
|
||||||
mem.c
|
mem.c
|
||||||
net_getaddrinfo.c
|
net_getaddrinfo.c
|
||||||
net_poll.c
|
|
||||||
ntp_filter.c
|
ntp_filter.c
|
||||||
ntp_packet.c
|
ntp_packet.c
|
||||||
ntp_peer.c
|
ntp_peer.c
|
||||||
|
@ -156,6 +150,7 @@ SRCS4='
|
||||||
suckaddr.c
|
suckaddr.c
|
||||||
time_amiga.c
|
time_amiga.c
|
||||||
time_stuff.c
|
time_stuff.c
|
||||||
|
time_unix.c
|
||||||
todo.c
|
todo.c
|
||||||
udp.c
|
udp.c
|
||||||
'
|
'
|
||||||
|
@ -165,9 +160,9 @@ SRCS4='
|
||||||
if make -v 2>&1 | grep GNU > /dev/null 2>&1 ; then
|
if make -v 2>&1 | grep GNU > /dev/null 2>&1 ; then
|
||||||
echo "make is GNU make."
|
echo "make is GNU make."
|
||||||
VALID=true
|
VALID=true
|
||||||
else
|
#else
|
||||||
echo "Wrong version of make."
|
# echo "Wrong version of make."
|
||||||
VALID=false
|
# VALID=false
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if $VALID ; then
|
if $VALID ; then
|
||||||
|
@ -177,13 +172,16 @@ if $VALID ; then
|
||||||
echo 'all: ntimed ntimed-poll ntimed-sim ntimed-test'
|
echo 'all: ntimed ntimed-poll ntimed-sim ntimed-test'
|
||||||
echo ''
|
echo ''
|
||||||
if [ -n "$1" ] && [ $1 = "AMIGA" ] ; then
|
if [ -n "$1" ] && [ $1 = "AMIGA" ] ; then
|
||||||
echo 'CC = gcc'
|
echo 'CC = gcc'
|
||||||
echo "CFLAGS += -O2 -DAOS3 -DWITHTEST -Wall -Werror"
|
echo "CFLAGS = -O2 -DAOS3 -DWITHTEST -Wall -Werror"
|
||||||
|
echo "LDLIBS = -lm"
|
||||||
elif [ -n "$1" ] && [ $1 = "AROS" ] ; then
|
elif [ -n "$1" ] && [ $1 = "AROS" ] ; then
|
||||||
echo 'CC = gcc'
|
echo 'CC = gcc'
|
||||||
echo "CFLAGS += -O2 -DAROS -DWITHTEST -Wall -Werror"
|
echo "CFLAGS = -O2 -DAROS -DWITHTEST -Wall -Werror"
|
||||||
|
echo "LDLIBS = -lm"
|
||||||
else
|
else
|
||||||
echo "CFLAGS += -O2 -Wall -DWITHTEST -Werror"
|
echo "CFLAGS = -O2 -Wall -DWITHTEST -Werror"
|
||||||
|
echo "LDLIBS = -lm"
|
||||||
fi
|
fi
|
||||||
echo ''
|
echo ''
|
||||||
|
|
||||||
|
@ -201,7 +199,7 @@ if $VALID ; then
|
||||||
echo
|
echo
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
l=""
|
l=""
|
||||||
for f in ${SRCS}
|
for f in ${SRCS}
|
||||||
do
|
do
|
||||||
|
@ -217,7 +215,6 @@ if $VALID ; then
|
||||||
done
|
done
|
||||||
|
|
||||||
#################################################
|
#################################################
|
||||||
# TODO: Rewrite logic
|
|
||||||
BIN1=""
|
BIN1=""
|
||||||
for f in ${SRCS1}
|
for f in ${SRCS1}
|
||||||
do
|
do
|
||||||
|
@ -245,16 +242,16 @@ if $VALID ; then
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "ntimed: ${BIN1}"
|
echo "ntimed: ${BIN1}"
|
||||||
echo " \${CC} \${CFLAGS} -o ntimed ${BIN1} -lm"
|
echo " \${CC} \${CFLAGS} -o ntimed ${BIN1} \${LDLIBS}"
|
||||||
echo
|
echo
|
||||||
echo "ntimed-poll: ${BIN2}"
|
echo "ntimed-poll: ${BIN2}"
|
||||||
echo " \${CC} \${CFLAGS} -o ntimed-poll ${BIN2} -lm"
|
echo " \${CC} \${CFLAGS} -o ntimed-poll ${BIN2} \${LDLIBS}"
|
||||||
echo
|
echo
|
||||||
echo "ntimed-sim: ${BIN3}"
|
echo "ntimed-sim: ${BIN3}"
|
||||||
echo " \${CC} \${CFLAGS} -o ntimed-sim ${BIN3} -lm"
|
echo " \${CC} \${CFLAGS} -o ntimed-sim ${BIN3} \${LDLIBS}"
|
||||||
echo
|
echo
|
||||||
echo "ntimed-test: ${BIN4}"
|
echo "ntimed-test: ${BIN4}"
|
||||||
echo " \${CC} \${CFLAGS} -o ntimed-test ${BIN4} -lm"
|
echo " \${CC} \${CFLAGS} -o ntimed-test ${BIN4} \${LDLIBS}"
|
||||||
echo
|
echo
|
||||||
echo "clean:"
|
echo "clean:"
|
||||||
echo " rm -f ${l} ntimed ntimed-poll ntimed-sim ntimed-test"
|
echo " rm -f ${l} ntimed ntimed-poll ntimed-sim ntimed-test"
|
||||||
|
|
|
@ -25,14 +25,15 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
//#include <proto/exec.h>
|
||||||
|
|
||||||
#include "ntimed_platform.h"
|
#include "ntimed_platform.h"
|
||||||
#include "ntimed.h"
|
#include "ntimed.h"
|
||||||
#include "tz.h"
|
|
||||||
#include "ntp.h"
|
#include "ntp.h"
|
||||||
#include "udp.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"
|
#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-poll 0.9 (15.04.2015)";
|
const char *vers = "\0$VER: ntimed-client 1.01 (18.04.2015)";
|
||||||
|
|
||||||
#define PARAM_CLIENT PARAM_INSTANCE
|
#define PARAM_CLIENT PARAM_INSTANCE
|
||||||
#define PARAM_TABLE_NAME client_param_table
|
#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_TABLE_NAME
|
||||||
#undef PARAM_CLIENT
|
#undef PARAM_CLIENT
|
||||||
|
|
||||||
void Time_Amiga(struct todolist *);
|
|
||||||
extern int validtime;
|
extern int validtime;
|
||||||
|
int savetime;
|
||||||
BOOL savetime;
|
int started_from_wb;
|
||||||
BOOL started_from_wb;
|
|
||||||
struct Library *BattClockBase;
|
|
||||||
struct Library *UtilityBase = NULL;
|
|
||||||
struct Library *SocketBase = NULL;
|
|
||||||
struct RDArgs *rdargs = NULL;
|
struct RDArgs *rdargs = NULL;
|
||||||
struct ntp_peerset *nps = NULL;
|
struct ntp_peerset *nps = NULL;
|
||||||
struct todolist *tdl = NULL;
|
struct todolist *tdl = NULL;
|
||||||
|
@ -56,7 +52,6 @@ struct udp_socket *usc = NULL;
|
||||||
struct ntimedargs {
|
struct ntimedargs {
|
||||||
char *params;
|
char *params;
|
||||||
char *tracefile;
|
char *tracefile;
|
||||||
char *timezone;
|
|
||||||
char **servers;
|
char **servers;
|
||||||
long synchronize;
|
long synchronize;
|
||||||
long save;
|
long save;
|
||||||
|
@ -64,15 +59,13 @@ struct ntimedargs {
|
||||||
long quiet;
|
long quiet;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void init_libs(struct ntimedargs *args);
|
|
||||||
static void init_logic(struct ntimedargs *args);
|
static void init_logic(struct ntimedargs *args);
|
||||||
static void clean_exit();
|
static void clean_exit();
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct ntimedargs args = {
|
struct ntimedargs args = {
|
||||||
NULL, NULL, NULL, NULL,
|
NULL, NULL, NULL, FALSE, FALSE, FALSE, FALSE
|
||||||
FALSE, FALSE, FALSE, FALSE
|
|
||||||
};
|
};
|
||||||
|
|
||||||
started_from_wb = (argc == 0);
|
started_from_wb = (argc == 0);
|
||||||
|
@ -93,7 +86,7 @@ int main(int argc, char **argv)
|
||||||
if (!rdargs)
|
if (!rdargs)
|
||||||
{
|
{
|
||||||
PrintFault(IoErr(), (ARGPTR)argv[0]);
|
PrintFault(IoErr(), (ARGPTR)argv[0]);
|
||||||
exit(2);
|
exit(5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,11 +98,7 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
init_libs(&args);
|
amiga_open_libs();
|
||||||
|
|
||||||
if (args.timezone) {
|
|
||||||
ArgTimezone(args.timezone);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.tracefile) {
|
if (args.tracefile) {
|
||||||
ArgTracefile(args.tracefile);
|
ArgTracefile(args.tracefile);
|
||||||
|
@ -129,31 +118,6 @@ int main(int argc, char **argv)
|
||||||
return 0;
|
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)
|
static void set_params(char *params)
|
||||||
{
|
{
|
||||||
char *token;
|
char *token;
|
||||||
|
@ -179,12 +143,6 @@ static void init_logic(struct ntimedargs *args)
|
||||||
int i;
|
int i;
|
||||||
int npeer = 0;
|
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();
|
tdl = TODO_NewList();
|
||||||
Time_Amiga(tdl);
|
Time_Amiga(tdl);
|
||||||
|
|
||||||
|
@ -244,22 +202,11 @@ static void clean_exit()
|
||||||
usc = NULL;
|
usc = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UtilityBase != NULL) {
|
|
||||||
CloseLibrary(UtilityBase);
|
|
||||||
UtilityBase = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef AROS
|
|
||||||
if (SocketBase != NULL) {
|
|
||||||
CloseLibrary(SocketBase);
|
|
||||||
SocketBase = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (rdargs) {
|
if (rdargs) {
|
||||||
FreeArgs(rdargs);
|
FreeArgs(rdargs);
|
||||||
rdargs = NULL;
|
rdargs = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
amiga_close_libs();
|
||||||
freeall();
|
freeall();
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,18 +27,13 @@
|
||||||
|
|
||||||
#include "ntimed_platform.h"
|
#include "ntimed_platform.h"
|
||||||
#include "ntimed.h"
|
#include "ntimed.h"
|
||||||
#include "tz.h"
|
|
||||||
#include "ntp.h"
|
#include "ntp.h"
|
||||||
#include "udp.h"
|
#include "udp.h"
|
||||||
|
|
||||||
#define ARGSFORMAT "D=DURATION/N,M=MONITOR/K,T=TRACEFILE/K,Z=TIMEZONE/K,SERVERS/M,SHOW/S,QUIET/S"
|
#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 0.9 (15.04.2015)";
|
const char *vers = "\0$VER: ntimed-poll 1.01 (18.04.2015)";
|
||||||
|
|
||||||
void Time_Amiga_Passive(void);
|
|
||||||
|
|
||||||
BOOL started_from_wb;
|
BOOL started_from_wb;
|
||||||
struct Library *BattClockBase;
|
|
||||||
struct Library *SocketBase = NULL;
|
|
||||||
struct RDArgs *rdargs = NULL;
|
struct RDArgs *rdargs = NULL;
|
||||||
struct udp_socket *usc = NULL;
|
struct udp_socket *usc = NULL;
|
||||||
struct ntp_peerset *npl = NULL;
|
struct ntp_peerset *npl = NULL;
|
||||||
|
@ -48,19 +43,17 @@ struct ntimedargs {
|
||||||
long *duration;
|
long *duration;
|
||||||
char *monitor;
|
char *monitor;
|
||||||
char *tracefile;
|
char *tracefile;
|
||||||
char *timezone;
|
|
||||||
char **servers;
|
char **servers;
|
||||||
long show;
|
long show;
|
||||||
long quiet;
|
long quiet;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void init_libs(struct ntimedargs *args);
|
|
||||||
static void init_logic(struct ntimedargs *args);
|
static void init_logic(struct ntimedargs *args);
|
||||||
static void clean_exit();
|
static void clean_exit();
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
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;
|
started_from_wb = (BOOL)argc;
|
||||||
|
|
||||||
|
@ -70,7 +63,7 @@ int main(int argc, char **argv)
|
||||||
if (!rdargs)
|
if (!rdargs)
|
||||||
{
|
{
|
||||||
PrintFault(IoErr(), (ARGPTR)argv[0]);
|
PrintFault(IoErr(), (ARGPTR)argv[0]);
|
||||||
exit(2);
|
exit(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!args.quiet) {
|
if (!args.quiet) {
|
||||||
|
@ -81,14 +74,12 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
init_libs(&args);
|
amiga_open_libs();
|
||||||
|
|
||||||
if (args.timezone) {
|
if (args.tracefile) {
|
||||||
ArgTimezone(args.timezone);
|
ArgTracefile(args.tracefile);
|
||||||
}
|
}
|
||||||
|
|
||||||
ArgTracefile(args.tracefile);
|
|
||||||
|
|
||||||
init_logic(&args);
|
init_logic(&args);
|
||||||
|
|
||||||
NTP_PeerSet_Poll(NULL, npl, usc, tdl);
|
NTP_PeerSet_Poll(NULL, npl, usc, tdl);
|
||||||
|
@ -97,22 +88,6 @@ int main(int argc, char **argv)
|
||||||
return 0;
|
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
|
static void
|
||||||
mps_filter(struct ocx *ocx, const struct ntp_peer *np)
|
mps_filter(struct ocx *ocx, const struct ntp_peer *np)
|
||||||
{
|
{
|
||||||
|
@ -210,11 +185,6 @@ static void init_logic(struct ntimedargs *args)
|
||||||
exit(1);
|
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);
|
Put(NULL, OCX_TRACE, "# Duration of run set to %d seconds\n", duration);
|
||||||
|
|
||||||
TODO_ScheduleRel(tdl, mps_end, NULL, duration, 0, "End task");
|
TODO_ScheduleRel(tdl, mps_end, NULL, duration, 0, "End task");
|
||||||
|
@ -232,17 +202,11 @@ static void clean_exit()
|
||||||
usc = NULL;
|
usc = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef AROS
|
|
||||||
if (SocketBase != NULL) {
|
|
||||||
CloseLibrary(SocketBase);
|
|
||||||
SocketBase = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (rdargs) {
|
if (rdargs) {
|
||||||
FreeArgs(rdargs);
|
FreeArgs(rdargs);
|
||||||
rdargs = NULL;
|
rdargs = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
amiga_close_libs();
|
||||||
freeall();
|
freeall();
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,13 +26,12 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ntimed_platform.h"
|
#include "ntimed_platform.h"
|
||||||
#include "mem.h"
|
|
||||||
#include "ntimed.h"
|
#include "ntimed.h"
|
||||||
#include "ntp.h"
|
#include "ntp.h"
|
||||||
#include "udp.h"
|
#include "udp.h"
|
||||||
|
|
||||||
#define ARGSFORMAT "P=PARAM/K,B=BUMP/K,T=TRACEFILE/K,SIMFILE/A,QUIET/S"
|
#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_CLIENT PARAM_INSTANCE
|
||||||
#define PARAM_TABLE_NAME client_param_table
|
#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;
|
BOOL started_from_wb;
|
||||||
struct Library *SocketBase = NULL;
|
|
||||||
struct RDArgs *rdargs = NULL;
|
struct RDArgs *rdargs = NULL;
|
||||||
struct todolist *tdl = NULL;
|
struct todolist *tdl = NULL;
|
||||||
|
|
||||||
|
@ -78,7 +76,6 @@ struct ntimedargs {
|
||||||
long quiet;
|
long quiet;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void init_libs(struct ntimedargs *args);
|
|
||||||
static void init_logic(struct ntimedargs *args);
|
static void init_logic(struct ntimedargs *args);
|
||||||
static void set_params(char *params);
|
static void set_params(char *params);
|
||||||
static void clean_exit();
|
static void clean_exit();
|
||||||
|
@ -101,7 +98,7 @@ int main(int argc, char **argv)
|
||||||
EnableDebug();
|
EnableDebug();
|
||||||
}
|
}
|
||||||
|
|
||||||
init_libs(&args);
|
amiga_close_libs();
|
||||||
|
|
||||||
if (args.tracefile) {
|
if (args.tracefile) {
|
||||||
ArgTracefile(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()
|
static void clean_exit()
|
||||||
{
|
{
|
||||||
ArgTracefile(NULL);
|
ArgTracefile(NULL);
|
||||||
|
|
||||||
#ifdef AROS
|
|
||||||
if (SocketBase != NULL) {
|
|
||||||
CloseLibrary(SocketBase);
|
|
||||||
SocketBase = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (rdargs) {
|
if (rdargs) {
|
||||||
FreeArgs(rdargs);
|
FreeArgs(rdargs);
|
||||||
rdargs = NULL;
|
rdargs = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
amiga_close_libs();
|
||||||
freeall();
|
freeall();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,19 +29,12 @@
|
||||||
#include "ntimed.h"
|
#include "ntimed.h"
|
||||||
#include "ntp.h"
|
#include "ntp.h"
|
||||||
|
|
||||||
|
const char *vers = "\0$VER: ntimed-test 1.01 (18.04.2015)";
|
||||||
BOOL started_from_wb;
|
BOOL started_from_wb;
|
||||||
struct Library *BattClockBase;
|
|
||||||
struct Library *SocketBase = NULL;
|
|
||||||
void Time_Amiga_Passive(void);
|
|
||||||
|
|
||||||
static void clean_exit()
|
static void clean_exit()
|
||||||
{
|
{
|
||||||
#ifdef AROS
|
amiga_close_libs();
|
||||||
if (SocketBase != NULL) {
|
|
||||||
CloseLibrary(SocketBase);
|
|
||||||
SocketBase = NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
freeall();
|
freeall();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,20 +46,7 @@ int main(int argc, char * const *argv)
|
||||||
(void)argv;
|
(void)argv;
|
||||||
|
|
||||||
atexit(clean_exit);
|
atexit(clean_exit);
|
||||||
|
amiga_open_libs();
|
||||||
#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
|
|
||||||
|
|
||||||
EnableDebug();
|
EnableDebug();
|
||||||
Time_Amiga_Passive();
|
Time_Amiga_Passive();
|
||||||
TS_RunTest(NULL);
|
TS_RunTest(NULL);
|
||||||
|
|
105
net_poll.c
105
net_poll.c
|
@ -1,105 +0,0 @@
|
||||||
/* ***** BEGIN LICENSE BLOCK *****
|
|
||||||
* Version: APL License
|
|
||||||
*
|
|
||||||
* Copyright (c) 2009 Diego Casorran <dcasorran@gmail.com>
|
|
||||||
*
|
|
||||||
* 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 <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <netinet/tcp.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
#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;
|
|
||||||
}
|
|
54
net_poll.h
54
net_poll.h
|
@ -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
|
|
|
@ -28,75 +28,114 @@
|
||||||
#define NTIMED_PLATFROM_H
|
#define NTIMED_PLATFROM_H
|
||||||
|
|
||||||
#if defined(AROS) || defined(AOS3)
|
#if defined(AROS) || defined(AOS3)
|
||||||
#ifndef AMIGA
|
# ifndef AMIGA
|
||||||
#define AMIGA
|
# define AMIGA
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef AMIGA
|
||||||
|
# include <proto/dos.h>
|
||||||
|
# include <proto/intuition.h>
|
||||||
|
# include <resources/battclock.h>
|
||||||
|
# include <clib/battclock_protos.h>
|
||||||
|
# include <clib/utility_protos.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef AROS
|
||||||
|
# ifdef Debug
|
||||||
|
# undef Debug
|
||||||
|
# endif
|
||||||
|
# include <sys/types.h>
|
||||||
|
# include <sys/socket.h>
|
||||||
|
# include <netinet/in.h>
|
||||||
|
# include <netdb.h>
|
||||||
|
# include <sys/param.h>
|
||||||
|
# include <sys/ioctl.h>
|
||||||
|
# include <errno.h>
|
||||||
|
# include <proto/socket.h>
|
||||||
|
# include <sys/socket.h>
|
||||||
|
# include <bsdsocket/socketbasetags.h>
|
||||||
|
# include <net/if.h>
|
||||||
|
# include <netinet/in.h>
|
||||||
|
# include <arpa/inet.h>
|
||||||
|
# include <netdb.h>
|
||||||
|
# ifdef Debug
|
||||||
|
# undef Debug
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
#include <proto/exec.h>
|
|
||||||
#include <proto/dos.h>
|
|
||||||
#include <proto/intuition.h>
|
|
||||||
#include <resources/battclock.h>
|
|
||||||
#include <clib/battclock_protos.h>
|
|
||||||
#include <clib/utility_protos.h>
|
|
||||||
|
|
||||||
#ifdef AROS
|
|
||||||
#ifdef Debug
|
|
||||||
#undef Debug
|
|
||||||
#endif
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <proto/socket.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <bsdsocket/socketbasetags.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#ifdef Debug
|
|
||||||
#undef Debug
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef AOS3
|
#ifdef AOS3
|
||||||
#define ARGPTR STRPTR
|
# define ARGPTR STRPTR
|
||||||
#define ARGS_FORMAT ARGSFORMAT
|
# define ARGS_FORMAT ARGSFORMAT
|
||||||
#define BSDLIB_NAME "bsdsocket.library"
|
# define BSDLIB_NAME "bsdsocket.library"
|
||||||
#define BSDLIB_REV 04L
|
# define BSDLIB_REV 04L
|
||||||
#define UTILLIB_NAME "utility.library"
|
# define UTILLIB_NAME "utility.library"
|
||||||
#define UTILLIB_REV 33L
|
# define UTILLIB_REV 33L
|
||||||
#define TIMER_NAME TIMERNAME
|
# define LOCALELIB_NAME "locale.library"
|
||||||
#define BATTCLOCK_NAME BATTCLOCKNAME
|
# define LOCALELIB_REV 33L
|
||||||
|
# define TIMER_NAME TIMERNAME
|
||||||
|
# define BATTCLOCK_NAME BATTCLOCKNAME
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef AROS
|
#ifdef AROS
|
||||||
#define ARGPTR CONST_STRPTR
|
# define ARGPTR CONST_STRPTR
|
||||||
#define ARGS_FORMAT (CONST_STRPTR)ARGSFORMAT
|
# define ARGS_FORMAT (CONST_STRPTR)ARGSFORMAT
|
||||||
#define BSDLIB_NAME (CONST_STRPTR)"bsdsocket.library"
|
# define BSDLIB_NAME (CONST_STRPTR)"bsdsocket.library"
|
||||||
#define BSDLIB_REV 04L
|
# define BSDLIB_REV 04L
|
||||||
#define UTILLIB_NAME (CONST_STRPTR)"utility.library"
|
# define UTILLIB_NAME (CONST_STRPTR)"utility.library"
|
||||||
#define UTILLIB_REV 33L
|
# define UTILLIB_REV 33L
|
||||||
#define TIMER_NAME (CONST_STRPTR)TIMERNAME
|
# define LOCALELIB_NAME (CONST_STRPTR)"locale.library"
|
||||||
#define BATTCLOCK_NAME (CONST_STRPTR)BATTCLOCKNAME
|
# define LOCALELIB_REV 33L
|
||||||
#define APRT IPRT
|
# define TIMER_NAME (CONST_STRPTR)TIMERNAME
|
||||||
|
# define BATTCLOCK_NAME (CONST_STRPTR)BATTCLOCKNAME
|
||||||
|
# define APRT IPRT
|
||||||
#endif
|
#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_save_time(void);
|
||||||
void amiga_sync_time(int seconds);
|
void amiga_sync_time(int seconds);
|
||||||
void EnableDebug();
|
void EnableDebug();
|
||||||
void EnableTraceDebug();
|
void EnableTraceDebug();
|
||||||
|
#endif
|
||||||
|
|
||||||
#define SetSyncTime amiga_sync_time
|
#ifdef AROS
|
||||||
#define Time_Amiga_Save amiga_save_time
|
# 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
|
#ifdef Debug
|
||||||
#undef Debug
|
# undef Debug
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
11
ntp_packet.c
11
ntp_packet.c
|
@ -1,5 +1,4 @@
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2015 Carsten Larsen
|
|
||||||
* Copyright (c) 2014 Poul-Henning Kamp
|
* Copyright (c) 2014 Poul-Henning Kamp
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
|
@ -65,10 +64,10 @@
|
||||||
#include "ntimed_endian.h"
|
#include "ntimed_endian.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Seconds between 1900 (NTP epoch) and 1978 (Amiga epoch).
|
* Seconds between 1900 (NTP epoch) and 1970 (UNIX epoch).
|
||||||
* 19 is the number of leapdays.
|
* 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
|
* 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);
|
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;
|
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);
|
CHECK_OBJ_NOTNULL(ts, TIMESTAMP_MAGIC);
|
||||||
Be32enc(dst, ts->sec + NTP_AMIGA);
|
Be32enc(dst, ts->sec + NTP_UNIX);
|
||||||
Be32enc(dst + 4, ts->frac >> 32ULL);
|
Be32enc(dst + 4, ts->frac >> 32ULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
438
time_amiga.c
438
time_amiga.c
|
@ -26,20 +26,23 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "ntimed.h"
|
||||||
|
#include "ntimed_platform.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#include <exec/io.h>
|
#include <exec/io.h>
|
||||||
#include <exec/types.h>
|
#include <exec/types.h>
|
||||||
#include <exec/memory.h>
|
#include <exec/memory.h>
|
||||||
#include <devices/timer.h>
|
#include <devices/timer.h>
|
||||||
#include <proto/dos.h>
|
|
||||||
#include <proto/exec.h>
|
|
||||||
#include <proto/timer.h>
|
#include <proto/timer.h>
|
||||||
#include <proto/locale.h>
|
|
||||||
#include <proto/battclock.h>
|
#include <proto/battclock.h>
|
||||||
#include <clib/alib_protos.h>
|
#include <clib/alib_protos.h>
|
||||||
#include <clib/exec_protos.h>
|
#include <clib/exec_protos.h>
|
||||||
|
#include <clib/locale_protos.h>
|
||||||
#include <clib/utility_protos.h>
|
#include <clib/utility_protos.h>
|
||||||
#include <clib/battclock_protos.h>
|
#include <clib/battclock_protos.h>
|
||||||
|
|
||||||
|
@ -47,116 +50,190 @@
|
||||||
#undef Debug
|
#undef Debug
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "ntimed.h"
|
// 2922 is the number of days between 1.1.1970 and 1.1.1978 (2 leap years and 6 normal)
|
||||||
#include "ntimed_platform.h"
|
#define AMIGAOFFSET 2922 * 24 * 60 * 60
|
||||||
|
int gmtoffset = 0;
|
||||||
|
|
||||||
int amiga_get_time(struct timeval *tv);
|
int create_timer();
|
||||||
int amiga_set_time(struct timeval *tv);
|
int delete_timer();
|
||||||
struct timerequest* create_timer();
|
void adjust_timeval(struct timeval *tv, double offset);
|
||||||
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
|
|
||||||
|
|
||||||
|
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;
|
struct timeval sync_time;
|
||||||
int validtime = 0;
|
int validtime = 0;
|
||||||
int limited_sync = 0;
|
int limited_sync = 0;
|
||||||
float utcoffset = 0.0;
|
|
||||||
|
|
||||||
/**********************************************************************/
|
void amiga_open_libs()
|
||||||
|
|
||||||
static void
|
|
||||||
amiga_setfreq(struct ocx *ocx, double frequency)
|
|
||||||
{
|
{
|
||||||
//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)
|
locale = OpenLocale(NULL);
|
||||||
// long int freq = (long)floor(frequency * (65536 * 1e6));
|
gmtoffset = (int)locale->loc_GMTOffset * 60;
|
||||||
Put(ocx, OCX_TRACE, "KERNPLL %.6e\n", frequency);
|
|
||||||
|
// 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)
|
void amiga_close_libs()
|
||||||
amiga_ticker(struct ocx *ocx, struct todolist *tdl, void *priv)
|
|
||||||
{
|
{
|
||||||
(void)ocx;
|
if (request != NULL) {
|
||||||
AN(tdl);
|
delete_timer();
|
||||||
AZ(priv);
|
}
|
||||||
amiga_setfreq(ocx, adj_freq);
|
|
||||||
ticker = 0;
|
if (locale != NULL) {
|
||||||
return (TODO_OK);
|
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)
|
int create_timer()
|
||||||
amiga_adjust(struct ocx *ocx, double offset, double duration, double frequency)
|
|
||||||
{
|
{
|
||||||
double freq;
|
LONG error;
|
||||||
|
struct MsgPort *port = CreatePort(0, 0);
|
||||||
|
if (port == NULL)
|
||||||
|
return 1;
|
||||||
|
|
||||||
(void)ocx;
|
request = (struct timerequest*)CreateExtIO(port, sizeof(struct timerequest));
|
||||||
assert(duration >= 0.0);
|
if (request == NULL)
|
||||||
|
{
|
||||||
|
DeletePort(port);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (ticker)
|
error = OpenDevice(TIMER_NAME, UNIT_MICROHZ, (struct IORequest*)request, 0L);
|
||||||
TODO_Cancel(kt_tdl, &ticker);
|
if (error != 0)
|
||||||
|
{
|
||||||
|
delete_timer(request);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
adj_offset = offset;
|
return 0;
|
||||||
adj_duration = floor(duration);
|
}
|
||||||
if (adj_offset > 0.0 && adj_duration == 0.0)
|
|
||||||
adj_duration = 1.0;
|
|
||||||
adj_freq = frequency;
|
|
||||||
|
|
||||||
freq = adj_freq;
|
int delete_timer()
|
||||||
if (adj_duration > 0.0)
|
{
|
||||||
freq += adj_offset / adj_duration;
|
struct MsgPort *port;
|
||||||
amiga_setfreq(ocx, freq);
|
if (request == NULL)
|
||||||
if (adj_duration > 0.0)
|
return 1;
|
||||||
ticker = TODO_ScheduleRel(kt_tdl, amiga_ticker, NULL,
|
|
||||||
adj_duration, 0.0, "KT_TICK");
|
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)
|
int gettimeofday(struct timeval *tv, struct timezone *tz)
|
||||||
amiga_step(struct ocx *ocx, double offset)
|
{
|
||||||
|
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;
|
struct timeval tv;
|
||||||
|
|
||||||
Put(ocx, OCX_TRACE, "KERNTIME_STEP %.3e\n", offset);
|
if(!validtime)
|
||||||
|
return;
|
||||||
|
|
||||||
AZ(amiga_get_time(&tv));
|
ResetBattClock();
|
||||||
adjust_timeval(&tv, offset);
|
gettimeofday(&tv, NULL);
|
||||||
AZ(amiga_set_time(&tv));
|
WriteBattClock(tv.tv_secs + gmtoffset - AMIGAOFFSET);
|
||||||
TB_generation++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
static struct timestamp * __match_proto__(tb_now_f)
|
void amiga_sync_time(int seconds)
|
||||||
amiga_now(struct timestamp *storage)
|
|
||||||
{
|
{
|
||||||
struct timeval tv;
|
limited_sync = 1;
|
||||||
AZ(amiga_get_time(&tv));
|
sync_time.tv_secs = seconds;
|
||||||
return (TS_Nanosec(storage, tv.tv_secs, tv.tv_micro * 1000LL));
|
sync_time.tv_micro = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
static int __match_proto__(tb_sleep_f)
|
int amiga_sleep_time(double dur)
|
||||||
amiga_sleep(double dur)
|
|
||||||
{
|
{
|
||||||
ULONG sigs, timersig;
|
ULONG sigs, timersig;
|
||||||
struct timerequest *request;
|
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
tv.tv_secs = 0;
|
tv.tv_secs = 0;
|
||||||
tv.tv_micro = 0;
|
tv.tv_micro = 0;
|
||||||
|
@ -170,10 +247,6 @@ amiga_sleep(double dur)
|
||||||
|
|
||||||
adjust_timeval(&tv, dur);
|
adjust_timeval(&tv, dur);
|
||||||
|
|
||||||
request = create_timer();
|
|
||||||
if (request == NULL)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
request->tr_node.io_Command = TR_ADDREQUEST;
|
request->tr_node.io_Command = TR_ADDREQUEST;
|
||||||
request->tr_time = tv;
|
request->tr_time = tv;
|
||||||
|
|
||||||
|
@ -184,160 +257,95 @@ amiga_sleep(double dur)
|
||||||
if (sigs & SIGBREAKF_CTRL_C) {
|
if (sigs & SIGBREAKF_CTRL_C) {
|
||||||
AbortIO((struct IORequest*)request);
|
AbortIO((struct IORequest*)request);
|
||||||
WaitIO((struct IORequest*)request);
|
WaitIO((struct IORequest*)request);
|
||||||
delete_timer(request);
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
delete_timer(request);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
void Time_Amiga(struct todolist *tdl)
|
void adjust_timeval(struct timeval *tv, double offset)
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
double d1, d2;
|
double d1, d2;
|
||||||
long sec, micro;
|
int secs, micro;
|
||||||
|
|
||||||
d1 = floor(offset);
|
d1 = floor(offset);
|
||||||
d2 = offset - d1;
|
d2 = offset - d1;
|
||||||
|
|
||||||
sec = tv->tv_secs + (long)d1;
|
secs = tv->tv_secs + (int)d1;
|
||||||
micro = tv->tv_micro + (long)floor(d2 * 1e6);
|
micro = tv->tv_micro + (int)floor(d2 * 1e6);
|
||||||
|
|
||||||
if (micro < 0) {
|
if (micro < 0) {
|
||||||
sec -= 1;
|
secs -= 1;
|
||||||
micro += 1000000;
|
micro += 1000000;
|
||||||
} else if (micro >= 1000000) {
|
} else if (micro >= 1000000) {
|
||||||
sec += 1;
|
secs += 1;
|
||||||
micro -= 1000000;
|
micro -= 1000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
tv->tv_secs = sec;
|
tv->tv_secs = secs;
|
||||||
tv->tv_micro = micro;
|
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
|
||||||
|
|
|
@ -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 <errno.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
81
tz.c
81
tz.c
|
@ -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 <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#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);
|
|
||||||
}
|
|
246
tz.h
246
tz.h
|
@ -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}
|
|
||||||
};
|
|
5
udp.c
5
udp.c
|
@ -39,9 +39,9 @@
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
|
|
||||||
|
#include "ntimed_platform.h"
|
||||||
#include "ntimed.h"
|
#include "ntimed.h"
|
||||||
#include "udp.h"
|
#include "udp.h"
|
||||||
#include "net_poll.h"
|
|
||||||
|
|
||||||
struct udp_socket {
|
struct udp_socket {
|
||||||
unsigned magic;
|
unsigned magic;
|
||||||
|
@ -74,9 +74,6 @@ void
|
||||||
UDP_Socket_Destroy(struct udp_socket *usc)
|
UDP_Socket_Destroy(struct udp_socket *usc)
|
||||||
{
|
{
|
||||||
CHECK_OBJ_NOTNULL(usc, UDP_SOCKET_MAGIC);
|
CHECK_OBJ_NOTNULL(usc, UDP_SOCKET_MAGIC);
|
||||||
#ifdef AOS3
|
|
||||||
close(usc->fd4);
|
|
||||||
#endif
|
|
||||||
#ifdef AROS
|
#ifdef AROS
|
||||||
CloseSocket(usc->fd4);
|
CloseSocket(usc->fd4);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue