aboutsummaryrefslogtreecommitdiff
path: root/ports/winnt/include/timepps.h
diff options
context:
space:
mode:
Diffstat (limited to 'ports/winnt/include/timepps.h')
-rw-r--r--ports/winnt/include/timepps.h400
1 files changed, 14 insertions, 386 deletions
diff --git a/ports/winnt/include/timepps.h b/ports/winnt/include/timepps.h
index 76b1bfada1ab..b39951c3f394 100644
--- a/ports/winnt/include/timepps.h
+++ b/ports/winnt/include/timepps.h
@@ -223,8 +223,6 @@ typedef struct pps_params {
#include <windows.h>
#include <errno.h>
-#include <stddef.h> /* offsetof() */
-#include <io.h> /* _get_osfhandle() */
#ifndef EOPNOTSUPP
#define EOPNOTSUPP 45
@@ -232,10 +230,6 @@ typedef struct pps_params {
typedef UINT_PTR pps_handle_t; /* pps handlebars */
-#ifndef inline
-#define inline __inline
-#endif
-
/*
* ntpd on Windows is typically distributed as a binary as few users
* have the tools needed to build from source. Rather than build
@@ -327,61 +321,6 @@ typedef struct pps_provider_tag {
provtime_pps_kcbind ptime_pps_kcbind;
} ppsapi_provider;
-static ppsapi_provider * g_provider_list;
-static ppsapi_provider * g_curr_provider;
-
-
-static inline pps_handle_t
-internal_create_pps_handle(
- void * prov_context
- )
-{
- pps_unit_t * punit;
-
- if (NULL == g_curr_provider) {
- fprintf(stderr, "create_pps_handle: provider backend called me outside time_pps_create\n");
- punit = NULL;
- } else
- punit = malloc(sizeof(*punit));
- if (punit != NULL) {
- punit->provider = g_curr_provider;
- punit->context = prov_context;
- punit->magic = PPSAPI_MAGIC_UNIT;
- memset(&punit->params, 0, sizeof(punit->params));
- }
- return (pps_handle_t)punit;
-}
-
-static inline pps_unit_t *
-unit_from_ppsapi_handle(
- pps_handle_t handle
- )
-{
- pps_unit_t *punit;
-
- punit = (pps_unit_t *)handle;
- if (PPSAPI_MAGIC_UNIT != punit->magic)
- punit = NULL;
- return punit;
-}
-
-/*
- * ntpd on Windows only looks to errno after finding
- * GetLastError returns NO_ERROR. To accomodate its
- * use of msyslog in portable code such as refclock_atom.c,
- * this implementation always clears the Windows
- * error code using SetLastError(NO_ERROR) when
- * returning an errno. This is also a good idea
- * for any non-ntpd clients as they should rely only
- * the errno for PPSAPI functions.
- */
-#define RETURN_PPS_ERRNO(e) \
-do { \
- SetLastError(NO_ERROR); \
- errno = (e); \
- return -1; \
-} while (0)
-
#ifdef OWN_PPS_NTP_TIMESTAMP_FROM_COUNTER
extern void pps_ntp_timestamp_from_counter(ntp_fp_t *, ULONGLONG, ULONGLONG);
@@ -422,98 +361,6 @@ pps_ntp_timestamp_from_counter(
#endif
-static inline int
-load_pps_provider(
- char * dllpath
- )
-{
- char short_name[16];
- char full_name[64];
- ppsapi_provider * prov;
- HMODULE hmod;
- pppsapi_prov_init pprov_init;
-
- prov = malloc(sizeof(*prov));
- if (NULL == prov)
- return ENOMEM;
-
- hmod = LoadLibrary(dllpath);
- if (NULL == hmod) {
- fprintf(stderr, "load_pps_provider: LoadLibrary(%s) error %u\n", dllpath, GetLastError());
- free(prov);
- return ENOENT;
- }
-
- pprov_init = (pppsapi_prov_init)GetProcAddress(hmod, "ppsapi_prov_init");
- if (NULL == pprov_init) {
- fprintf(stderr, "load_pps_provider: entrypoint ppsapi_prov_init not found in %s\n", dllpath);
- free(prov);
- FreeLibrary(hmod);
- return EFAULT;
- }
-
- prov->caps = (*pprov_init)(PPSAPI_TIMEPPS_PROV_VER,
- &internal_create_pps_handle,
- &pps_ntp_timestamp_from_counter,
- short_name, sizeof(short_name),
- full_name, sizeof(full_name));
-
- if (!prov->caps) {
- free(prov);
- FreeLibrary(hmod);
- return EACCES;
- }
-
- prov->short_name = _strdup(short_name);
- prov->full_name = _strdup(full_name);
-
- if (NULL == prov->short_name || !prov->short_name[0]
- || NULL == prov->full_name || !prov->full_name[0]) {
-
- if (prov->short_name)
- free(prov->short_name);
- if (prov->full_name)
- free(prov->full_name);
- free(prov);
- FreeLibrary(hmod);
- return EINVAL;
- }
-
- prov->ptime_pps_create = (provtime_pps_create)
- GetProcAddress(hmod, "prov_time_pps_create");
- prov->ptime_pps_destroy = (provtime_pps_destroy)
- GetProcAddress(hmod, "prov_time_pps_destroy");
- prov->ptime_pps_setparams = (provtime_pps_setparams)
- GetProcAddress(hmod, "prov_time_pps_setparams");
- prov->ptime_pps_fetch = (provtime_pps_fetch)
- GetProcAddress(hmod, "prov_time_pps_fetch");
- prov->ptime_pps_kcbind = (provtime_pps_kcbind)
- GetProcAddress(hmod, "prov_time_pps_kcbind");
-
- if (NULL == prov->ptime_pps_create
- || NULL == prov->ptime_pps_destroy
- || NULL == prov->ptime_pps_setparams
- || NULL == prov->ptime_pps_fetch
- || NULL == prov->ptime_pps_kcbind) {
-
- fprintf(stderr, "PPSAPI provider %s missing entrypoint\n",
- prov->short_name);
- free(prov->short_name);
- free(prov->full_name);
- free(prov);
- FreeLibrary(hmod);
- return EINVAL;
- }
-
- fprintf(stderr, "loaded PPSAPI provider %s caps 0x%x provider %p\n",
- prov->full_name, prov->caps, prov);
-
- prov->next = g_provider_list;
- g_provider_list = prov;
-
- return 0;
-}
-
/*
* time_pps_create - create PPS handle from file descriptor
@@ -524,288 +371,69 @@ load_pps_provider(
* descriptor namespace, though it may have been converted from a
* native Windows HANDLE using _open_osfhandle().
*/
-static inline int
+extern int
time_pps_create(
int filedes,/* device file descriptor */
pps_handle_t * phandle /* returned handle */
- )
-{
- HANDLE winhandle;
- char * dlls;
- char * dll;
- char * pch;
- ppsapi_provider * prov;
- pps_handle_t ppshandle;
- int err;
-
- if (NULL == phandle)
- RETURN_PPS_ERRNO(EFAULT);
-
- winhandle = (HANDLE)_get_osfhandle(filedes);
- fprintf(stderr, "time_pps_create(%d) got winhandle %p\n", filedes, winhandle);
- if (INVALID_HANDLE_VALUE == winhandle)
- RETURN_PPS_ERRNO(EBADF);
-
- /*
- * For initial testing the list of PPSAPI backend
- * providers is provided by the environment variable
- * PPSAPI_DLLS, separated by semicolons such as
- * PPSAPI_DLLS=c:\ntp\serial_ppsapi.dll;..\parport_ppsapi.dll
- * There are a million better ways, such as a well-known
- * registry key under which a value is created for each
- * provider DLL installed, or even a platform-specific
- * ntp.conf directive or command-line switch.
- */
- dlls = getenv("PPSAPI_DLLS");
- if (dlls != NULL && NULL == g_provider_list) {
- dlls = dll = _strdup(dlls);
- fprintf(stderr, "getenv(PPSAPI_DLLS) gives %s\n", dlls);
- } else
- dlls = dll = NULL;
-
- while (dll != NULL && dll[0]) {
- pch = strchr(dll, ';');
- if (pch != NULL)
- *pch = 0;
- err = load_pps_provider(dll);
- if (err) {
- fprintf(stderr, "load_pps_provider(%s) got errno %d\n", dll, err);
- RETURN_PPS_ERRNO(err);
- }
- dll = (NULL == pch)
- ? NULL
- : pch + 1;
- }
-
- if (NULL != dlls)
- free(dlls);
- dlls = dll = NULL;
-
- /*
- * Hand off to each provider in turn until one returns a PPS
- * handle or they've all declined.
- */
- for (prov = g_provider_list; prov != NULL; prov = prov->next) {
- ppshandle = 0;
- g_curr_provider = prov;
- err = (*prov->ptime_pps_create)(winhandle, &ppshandle);
- g_curr_provider = NULL;
- fprintf(stderr, "%s prov_time_pps_create(%p) returned %d\n",
- prov->short_name, winhandle, err);
- if (!err && ppshandle) {
- *phandle = ppshandle;
- return 0;
- }
- }
-
- fprintf(stderr, "PPSAPI provider list %p\n", g_provider_list);
-
- RETURN_PPS_ERRNO(ENOEXEC);
-}
-
+ );
/*
* release PPS handle
*/
-
-static inline int
+extern int
time_pps_destroy(
pps_handle_t handle
- )
-{
- pps_unit_t * punit;
- int err;
-
- if (!handle)
- RETURN_PPS_ERRNO(EBADF);
-
- punit = unit_from_ppsapi_handle(handle);
-
- if (NULL == punit)
- RETURN_PPS_ERRNO(EBADF);
-
- err = (*punit->provider->ptime_pps_destroy)(punit, punit->context);
-
- free(punit);
-
- if (err)
- RETURN_PPS_ERRNO(err);
- else
- return 0;
-}
+ );
/*
* set parameters for handle
*/
-
-static inline int
+extern int
time_pps_setparams(
pps_handle_t handle,
const pps_params_t *params
- )
-{
- pps_unit_t * punit;
- int err;
-
- /*
- * Check for valid arguments and set parameters.
- */
- if (!handle)
- RETURN_PPS_ERRNO(EBADF);
-
- punit = unit_from_ppsapi_handle(handle);
-
- if (NULL == punit)
- RETURN_PPS_ERRNO(EBADF);
-
- if (NULL == params)
- RETURN_PPS_ERRNO(EFAULT);
-
- err = (*punit->provider->ptime_pps_setparams)(punit, punit->context, params);
-
- if (err)
- RETURN_PPS_ERRNO(err);
- else
- return 0;
-}
+ );
/*
* get parameters for handle
*/
-
-static inline int
+extern int
time_pps_getparams(
pps_handle_t handle,
pps_params_t *params_buf
- )
-{
- pps_unit_t * punit;
-
- /*
- * Check for valid arguments and get parameters.
- */
- if (!handle)
- RETURN_PPS_ERRNO(EBADF);
-
- punit = unit_from_ppsapi_handle(handle);
-
- if (NULL == punit)
- RETURN_PPS_ERRNO(EBADF);
-
- if (NULL == params_buf)
- RETURN_PPS_ERRNO(EFAULT);
-
- *params_buf = punit->params;
- return 0;
-}
-
+ );
/*
* time_pps_getcap - get capabilities for handle
*/
-static inline int
+extern int
time_pps_getcap(
pps_handle_t handle,
int *pmode
- )
-{
- pps_unit_t * punit;
-
- /*
- * Check for valid arguments and get capabilities.
- */
- if (!handle)
- RETURN_PPS_ERRNO(EBADF);
-
- punit = unit_from_ppsapi_handle(handle);
-
- if (NULL == punit)
- RETURN_PPS_ERRNO(EBADF);
-
- if (NULL == pmode)
- RETURN_PPS_ERRNO(EFAULT);
-
- *pmode = punit->provider->caps;
- return 0;
-}
+ );
/*
* Fetch timestamps
*/
-
-static inline int
+extern int
time_pps_fetch(
pps_handle_t handle,
const int tsformat,
pps_info_t * pinfo,
const struct timespec * ptimeout
- )
-{
- pps_unit_t * punit;
- int err;
-
- /*
- * Check for valid arguments and fetch timestamps
- */
- if (!handle)
- RETURN_PPS_ERRNO(EBADF);
-
- if (NULL == pinfo)
- RETURN_PPS_ERRNO(EFAULT);
-
- punit = unit_from_ppsapi_handle(handle);
-
- if (NULL == punit)
- RETURN_PPS_ERRNO(EBADF);
-
- err = (*punit->provider->ptime_pps_fetch)(punit,
- punit->context,
- tsformat,
- pinfo,
- ptimeout);
-
- if (err)
- RETURN_PPS_ERRNO(err);
- else
- return 0;
-}
+ );
/*
* time_pps_kcbind - specify kernel consumer
*
* Not supported so far by Windows.
*/
-
-static inline int
+extern int
time_pps_kcbind(
pps_handle_t handle,
const int kernel_consumer,
const int edge, const int tsformat
- )
-{
- pps_unit_t * punit;
- int err;
-
- if (!handle)
- RETURN_PPS_ERRNO(EBADF);
-
- punit = unit_from_ppsapi_handle(handle);
-
- if (NULL == punit)
- RETURN_PPS_ERRNO(EBADF);
-
- err = (*punit->provider->ptime_pps_kcbind)(
- punit,
- punit->context,
- kernel_consumer,
- edge,
- tsformat);
-
- if (err)
- RETURN_PPS_ERRNO(err);
- else
- return 0;
-}
+ );
#endif /* TIMEPPS_H */