/* Copyright (c) 2012, David Goulet <dgoulet@ev0ke.net>
* Jacob Appelbaum <jacob@torproject.org>
* Copyright (c) 2012, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
* \file clock.h
* \brief Header file for the clock primitives.
**/
#pragma once
#ifndef CLOCK_HEADER_GUARD
#define CLOCK_HEADER_GUARD 1
#include <src/visibility.h>
#ifdef HAVE_TIME_H
#include <time.h>
#endif
#ifdef TARGET_OS_OPENBSD
#include <sys/time.h>
#endif
#ifdef HAVE_MACH_CLOCK_H
#include <mach/clock.h>
#endif
#ifdef HAVE_MACH_MACH_H
#include <mach/mach.h>
#endif
struct tlsdate_time {
#if defined(__linux__) || defined(__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__DragonFly__)
struct timespec tp;
#elif defined(__APPLE__)
mach_timespec_t tp;
#elif _WIN32
void *tp;
#elif TARGET_OS_HAIKU
struct timespec tp;
#elif TARGET_OS_CYGWIN
struct timespec tp;
#elif TARGET_OS_MINGW
struct timespec tp;
#elif TARGET_OS_GNUHURD
struct timespec tp;
#else
struct timespec tp;
#endif
};
TLSDATE_API
int clock_get_real_time(struct tlsdate_time *time);
TLSDATE_API
int clock_set_real_time(const struct tlsdate_time *time);
TLSDATE_API
void clock_init_time(struct tlsdate_time *time, time_t sec, long nsec);
/* Helper macros to access time values */
#define CLOCK_SEC(time) ((time)->tp.tv_sec)
#define CLOCK_MSEC(time) ((time)->tp.tv_nsec / 1000000)
#define CLOCK_USEC(time) ((time)->tp.tv_nsec / 1000)
#define CLOCK_NSEC(time) ((time)->tp.tv_nsec)
/* Helper macros to access time values. TODO: Complete them */
/*
#define CLOCK_SEC(time)
#define CLOCK_MSEC(time)
#define CLOCK_USEC(time)
#define CLOCK_NSEC(time)
*/
#endif // CLOCK_HEADER_GUARD