/* * This file is Copyright (c) 2017 by the GPSD project * SPDX-License-Identifier: BSD-2-clause * * This is the header for os_compat.c, which contains functions dealing with * compatibility issues across OSes. */ #ifndef _GPSD_OS_COMPAT_H_ #define _GPSD_OS_COMPAT_H_ /* Determine which of these functions we need */ #include "gpsd_config.h" # ifdef __cplusplus extern "C" { # endif #ifndef HAVE_CLOCK_GETTIME /* Simulate ANSI/POSIX clock_gettime() on platforms that don't have it */ #include #ifndef CLOCKID_T_DEFINED typedef int clockid_t; #define CLOCKID_T_DEFINED #endif /* !CLOCKID_T_DEFINED */ /* * OS X 10.5 and later use _STRUCT_TIMESPEC (like other OSes) * 10.4 uses _TIMESPEC * 10.3 and earlier use _TIMESPEC_DECLARED */ #if !defined(_STRUCT_TIMESPEC) && \ !defined(_TIMESPEC) && \ !defined(_TIMESPEC_DECLARED) && \ !defined(__timespec_defined) #define _STRUCT_TIMESPEC struct timespec { time_t tv_sec; long tv_nsec; }; #endif /* !_STRUCT_TIMESPEC ... */ /* OS X does not have clock_gettime */ #define CLOCK_REALTIME 0 int clock_gettime(clockid_t, struct timespec *); #endif /* !HAVE_CLOCK_GETTIME */ /* * Wrapper or substitute for Linux/BSD daemon() * * There are some issues with this function even when it's present, so * wrapping it confines the issues to a single place in os_compat.c. */ int os_daemon(int nochdir, int noclose); #ifdef HAVE_SYSLOG_H #include #else /* * Substitutes for syslog functions * (only subset of defines used by gpsd components listed) * */ /* Copy of syslog.h defines when otherwise not available */ /* priorities (these are ordered) */ #define LOG_EMERG 0 /* system is unusable */ #define LOG_ALERT 1 /* action must be taken immediately */ #define LOG_CRIT 2 /* critical conditions */ #define LOG_ERR 3 /* error conditions */ #define LOG_WARNING 4 /* warning conditions */ #define LOG_NOTICE 5 /* normal but significant condition */ #define LOG_INFO 6 /* informational */ #define LOG_DEBUG 7 /* debug-level messages */ /* Option flags for openlog */ #define LOG_PID 0x01 /* log the pid with each message */ #define LOG_PERROR 0x20 /* log to stderr as well */ /* facility codes */ #define LOG_USER (1<<3) /* random user-level messages */ #define LOG_DAEMON (3<<3) /* system daemons */ void syslog(int priority, const char *format, ...); void openlog(const char *__ident, int __option, int __facility); void closelog(void); #endif /* !HAVE_SYSLOG_H */ /* Provide BSD strlcat()/strlcpy() on platforms that don't have it */ #ifndef HAVE_STRLCAT #include size_t strlcat(char *dst, const char *src, size_t size); #endif /* !HAVE_STRLCAT */ #ifndef HAVE_STRLCPY #include size_t strlcpy(char *dst, const char *src, size_t size); #endif /* !HAVE_STRLCPY */ /* Provide missing signal numbers for non-POSIX builds */ #ifndef SIGHUP #define SIGHUP 1 #endif #ifndef SIGQUIT #define SIGQUIT 3 #endif /* Provide missing open flags for non-POSIX builds */ #ifndef O_NOCTTY #define O_NOCTTY 0400 #endif # ifdef __cplusplus } # endif #endif /* _GPSD_OS_COMPAT_H_ */