summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gps2udp.c4
-rw-r--r--gpsd.c4
-rw-r--r--gpspipe.c4
-rw-r--r--gpxlogger.c6
-rw-r--r--lcdgps.c6
-rw-r--r--os_compat.c26
-rw-r--r--os_compat.h13
7 files changed, 45 insertions, 18 deletions
diff --git a/gps2udp.c b/gps2udp.c
index b07eaa1f..c02d8929 100644
--- a/gps2udp.c
+++ b/gps2udp.c
@@ -12,7 +12,7 @@
*
*/
-/* strsep() and daemon() needs _DEFAULT_SOURCE */
+/* strsep() needs _DEFAULT_SOURCE */
#define _DEFAULT_SOURCE
#include <time.h>
@@ -428,7 +428,7 @@ int main(int argc, char **argv)
/* Daemonize if the user requested it. */
if (daemonize) {
- if (daemon(0, 0) != 0) {
+ if (os_daemon(0, 0) != 0) {
(void)fprintf(stderr,
"gps2udp: demonization failed: %s\n",
strerror(errno));
diff --git a/gpsd.c b/gpsd.c
index 7aabc269..8aa001d9 100644
--- a/gpsd.c
+++ b/gpsd.c
@@ -10,7 +10,7 @@
/* FreeBSD chokes on this */
/* nice() needs _XOPEN_SOURCE, 500 means X/Open 1995 */
#define _XOPEN_SOURCE 500
-/* setgroups() and daemon() needs _DEFAULT_SOURCE */
+/* setgroups() needs _DEFAULT_SOURCE */
#define _DEFAULT_SOURCE
#endif /* __linux__ */
@@ -1998,7 +1998,7 @@ int main(int argc, char *argv[])
/* might be time to daemonize */
if (go_background) {
/* not SuS/POSIX portable, but we have our own fallback version */
- if (daemon(0, 0) != 0)
+ if (os_daemon(0, 0) != 0)
gpsd_log(&context.errout, LOG_ERROR,
"demonization failed: %s\n",strerror(errno));
}
diff --git a/gpspipe.c b/gpspipe.c
index 6e133f48..680f0625 100644
--- a/gpspipe.c
+++ b/gpspipe.c
@@ -25,8 +25,6 @@
/* cfmakeraw() needs _DEFAULT_SOURCE */
#define _DEFAULT_SOURCE
-/* daemon() needs _DEFAULT_SOURCE */
-#define _DEFAULT_SOURCE
#include <time.h> /* for time_t */
@@ -251,7 +249,7 @@ int main(int argc, char **argv)
/* Daemonize if the user requested it. */
if (daemonize)
- if (daemon(0, 0) != 0)
+ if (os_daemon(0, 0) != 0)
(void)fprintf(stderr,
"gpspipe: demonization failed: %s\n",
strerror(errno));
diff --git a/gpxlogger.c b/gpxlogger.c
index 99bb3d04..b647b35a 100644
--- a/gpxlogger.c
+++ b/gpxlogger.c
@@ -3,9 +3,6 @@
* BSD terms apply: see the file COPYING in the distribution root for details.
*/
-/* daemon() needs _DEFAULT_SOURCE */
-#define _DEFAULT_SOURCE
-
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
@@ -23,6 +20,7 @@
#include "gpsd_config.h"
#include "gpsdclient.h"
#include "revision.h"
+#include "os_compat.h"
static char *progname;
static struct fixsource_t source;
@@ -319,7 +317,7 @@ int main(int argc, char **argv)
/* might be time to daemonize */
if (daemonize) {
/* not SuS/POSIX portable, but we have our own fallback version */
- if (daemon(0, 0) != 0)
+ if (os_daemon(0, 0) != 0)
(void) fprintf(stderr,"demonization failed: %s\n", strerror(errno));
}
diff --git a/lcdgps.c b/lcdgps.c
index 75f99170..eb95f498 100644
--- a/lcdgps.c
+++ b/lcdgps.c
@@ -33,9 +33,6 @@
#define CLIMB 3
-/* daemon() needs _DEFAULT_SOURCE */
-#define _DEFAULT_SOURCE
-
#include <netdb.h>
#ifndef AF_UNSPEC
#include <sys/types.h>
@@ -56,6 +53,7 @@
#include "gps.h"
#include "gpsdclient.h"
#include "revision.h"
+#include "os_compat.h"
/* Prototypes. */
ssize_t sockreadline(int sockd,void *vptr,size_t maxlen);
@@ -344,7 +342,7 @@ int main(int argc, char *argv[])
gpsd_source_spec(NULL, &source);
/* Daemonize... */
- if (daemon(0, 0) != 0)
+ if (os_daemon(0, 0) != 0)
(void)fprintf(stderr,
"lcdgps: demonization failed: %s\n",
strerror(errno));
diff --git a/os_compat.c b/os_compat.c
index 4ffefb08..b110f4ba 100644
--- a/os_compat.c
+++ b/os_compat.c
@@ -62,7 +62,7 @@ int clock_gettime(clockid_t clk_id, struct timespec *ts)
#endif
#endif
-int daemon(int nochdir, int noclose)
+int os_daemon(int nochdir, int noclose)
/* compatible with the daemon(3) found on Linuxes and BSDs */
{
int fd;
@@ -91,6 +91,26 @@ int daemon(int nochdir, int noclose)
return 0;
}
+#else /* HAVE_DAEMON */
+
+#ifdef __linux__
+
+/* daemon() needs _DEFAULT_SOURCE */
+#undef _DEFAULT_SOURCE
+#define _DEFAULT_SOURCE
+#include <unistd.h>
+
+#else /* !__linux__ */
+
+#include <stdlib.h>
+
+#endif /* !__linux__ */
+
+int os_daemon(int nochdir, int noclose)
+{
+ return daemon(nochdir, noclose);
+}
+
#endif /* HAVE_DAEMON */
/* End of daemon section */
@@ -175,7 +195,7 @@ size_t strlcat(char *dst, const char *src, size_t siz)
return (dlen + (s - src)); /* count does not include NUL */
}
#endif /* __UNUSED__ */
-#endif /* HAVE_STRLCAT */
+#endif /* !HAVE_STRLCAT */
#ifndef HAVE_STRLCPY
@@ -242,6 +262,6 @@ size_t strlcpy(char *dst, const char *src, size_t siz)
return ((size_t) (s - src - 1)); /* count does not include NUL */
}
#endif /* __UNUSED__ */
-#endif /* HAVE_STRLCPY */
+#endif /* !HAVE_STRLCPY */
/* End of strlcat()/strlcpy() section */
diff --git a/os_compat.h b/os_compat.h
index 4dbe9de3..93ea8b06 100644
--- a/os_compat.h
+++ b/os_compat.h
@@ -17,6 +17,8 @@ extern "C" {
#ifndef HAVE_CLOCK_GETTIME
+/* Simulate ANSI/POSIX clock_gettime() on platforms that don't have it */
+
#include <time.h>
#ifndef CLOCKID_T_DEFINED
@@ -46,6 +48,17 @@ 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);
+
+/* Provide BSD strlcat()/strlcpy() on platforms that don't have it */
+
#ifndef HAVE_STRLCAT
#include <string.h>