diff options
Diffstat (limited to 'ports/winnt/include/timepps.h')
-rw-r--r-- | ports/winnt/include/timepps.h | 400 |
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 */ |