From: Damjan Marion Date: Fri, 16 May 2014 21:18:53 +0000 (+0200) Subject: osx: initial support for OS X X-Git-Tag: v4.1~2041^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5a8b5e7fe2093be94a71fa7d6b9a6fb964a4edcb;p=thirdparty%2Ftvheadend.git osx: initial support for OS X --- diff --git a/Makefile b/Makefile index dee8c4122..1bf97c332 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,16 @@ CFLAGS += -Wmissing-prototypes -fms-extensions CFLAGS += -g -funsigned-char -O2 CFLAGS += -D_FILE_OFFSET_BITS=64 CFLAGS += -I${BUILDDIR} -I${ROOTDIR}/src -I${ROOTDIR} -LDFLAGS += -lrt -ldl -lpthread -lm +LDFLAGS += -ldl -lpthread -lm +ifneq ($(PLATFORM), darwin) +LDFLAGS += -lrt +endif + +ifeq ($(COMPILER), clang) +CFLAGS += -Wno-microsoft -Qunused-arguments -Wno-unused-function +CFLAGS += -Wno-unused-value -Wno-tautological-constant-out-of-range-compare +CFLAGS += -Wno-parentheses-equality -Wno-incompatible-pointer-types +endif vpath %.c $(ROOTDIR) vpath %.h $(ROOTDIR) diff --git a/configure b/configure index cdcd469dc..0fbe95d08 100755 --- a/configure +++ b/configure @@ -72,6 +72,16 @@ check_cc_header execinfo check_cc_option mmx check_cc_option sse2 +if check_cc ' +#if !defined(__clang__) +#error this is not clang +#endif +'; then + COMPILER=clang +else + COMPILER=gcc +fi + check_cc_snippet getloadavg '#include void test() { getloadavg(NULL,0); }' @@ -147,6 +157,13 @@ else die "SSL development support not found" fi +# +# OS X +# +if [ ${PLATFORM} = "darwin" ]; then + disable linuxdvb +fi + # # DVB API # @@ -296,7 +313,7 @@ fi # # kqueue # -if [ ${PLATFORM} = "freebsd" ]; then +if [ ${PLATFORM} = "freebsd" ] || [ ${PLATFORM} = "darwin" ]; then enable kqueue fi diff --git a/src/httpc.c b/src/httpc.c index 4efa047de..21cb6771c 100644 --- a/src/httpc.c +++ b/src/httpc.c @@ -766,9 +766,9 @@ http_client_data_received( http_client_t *hc, char *buf, ssize_t len, int hdr ) return 0; } - csize = hc->hc_csize < 0 ? 0 : hc->hc_csize; + csize = hc->hc_csize == (size_t) -1 ? 0 : hc->hc_csize; l = len; - if (hc->hc_csize && hc->hc_csize != -1 && hc->hc_rpos > csize) { + if (hc->hc_csize && hc->hc_csize != (size_t) -1 && hc->hc_rpos > csize) { l2 = hc->hc_rpos - csize; if (l2 < l) l = l2; @@ -801,7 +801,7 @@ int http_client_run( http_client_t *hc ) { char *buf, *saveptr, *argv[3], *d, *p; - http_ver_t ver; + int ver; ssize_t r; size_t len; int res; diff --git a/src/muxer.c b/src/muxer.c index d8d76e6bc..03150d39e 100644 --- a/src/muxer.c +++ b/src/muxer.c @@ -28,6 +28,10 @@ #include "muxer/muxer_libav.h" #endif +#if defined(PLATFORM_DARWIN) +#define fdatasync(fd) fcntl(fd, F_FULLFSYNC) +#endif + /** * Mime type for containers containing only audio */ @@ -458,7 +462,11 @@ muxer_cache_update(muxer_t *m, int fd, off_t pos, size_t size) fdatasync(fd); /* fall through */ case MC_CACHE_DONTKEEP: +#if defined(PLATFORM_DARWIN) + fcntl(fd, F_NOCACHE, 1); +#else posix_fadvise(fd, pos, size, POSIX_FADV_DONTNEED); +#endif break; default: abort(); diff --git a/src/trap.c b/src/trap.c index 5481792d7..2bb99c27e 100644 --- a/src/trap.c +++ b/src/trap.c @@ -20,7 +20,7 @@ char tvh_binshasum[20]; -#if defined(__i386__) || defined(__x86_64__) +#if (defined(__i386__) || defined(__x86_64__)) && !defined(PLATFORM_DARWIN) // Only do this on x86 for now @@ -315,6 +315,26 @@ trap_init(const char *ver) sigprocmask(SIG_UNBLOCK, &m, NULL); } +#elif defined(PLATFORM_DARWIN) + +#include +#include + +void +trap_init(const char *ver) +{ + sigset_t m; + + sigemptyset(&m); + sigaddset(&m, SIGSEGV); + sigaddset(&m, SIGBUS); + sigaddset(&m, SIGILL); + sigaddset(&m, SIGABRT); + sigaddset(&m, SIGFPE); + + sigprocmask(SIG_UNBLOCK, &m, NULL); +} + #else void diff --git a/src/tvheadend.h b/src/tvheadend.h index 91b0d831b..e5910f8dd 100644 --- a/src/tvheadend.h +++ b/src/tvheadend.h @@ -500,6 +500,20 @@ int tvh_str_update(char **strp, const char *src); #define CLOCK_MONOTONIC_COARSE CLOCK_MONOTONIC #endif +#ifdef PLATFORM_DARWIN +#define CLOCK_MONOTONIC 0 +#define CLOCK_REALTIME 0 + +static inline int clock_gettime(int clk_id, struct timespec* t) { + struct timeval now; + int rv = gettimeofday(&now, NULL); + if (rv) return rv; + t->tv_sec = now.tv_sec; + t->tv_nsec = now.tv_usec * 1000; + return 0; +} +#endif + static inline int64_t getmonoclock(void) { @@ -677,8 +691,13 @@ void tvh_qsort_r(void *base, size_t nmemb, size_t size, int (*compar)(const void #endif #define PRIslongword_t "ld" #define PRIulongword_t "lu" +#if defined(PLATFORM_DARWIN) +#define PRIsize_t PRIulongword_t +#define PRIssize_t PRIslongword_t +#else #define PRIsize_t PRIuword_t #define PRIssize_t PRIsword_t +#endif #if __WORDSIZE == 32 && defined(PLATFORM_FREEBSD) #define PRItime_t PRIsword_t #else diff --git a/src/upnp.c b/src/upnp.c index 4c9435c47..0c6f5ee87 100644 --- a/src/upnp.c +++ b/src/upnp.c @@ -147,7 +147,7 @@ upnp_thread( void *aux ) inet_ntop(ip.ss_family, IP_IN_ADDR(ip), tbuf, sizeof(tbuf)); tvhtrace("upnp", "%s - received data from %s:%hu [size=%zi]", conn == multicast ? "multicast" : "unicast", - tbuf, IP_PORT(ip), size); + tbuf, (unsigned short) IP_PORT(ip), size); tvhlog_hexdump("upnp", buf, size); } #endif diff --git a/src/webui/webui.c b/src/webui/webui.c index d56c79cfb..7929ad29a 100644 --- a/src/webui/webui.c +++ b/src/webui/webui.c @@ -930,7 +930,7 @@ page_dvrfile(http_connection_t *hc, const char *remain, void *opaque) off_t content_len, file_start, file_end, chunk; #if defined(PLATFORM_LINUX) ssize_t r; -#elif defined(PLATFORM_FREEBSD) +#elif defined(PLATFORM_FREEBSD) || defined(PLATFORM_DARWIN) off_t r; #endif @@ -1017,6 +1017,9 @@ page_dvrfile(http_connection_t *hc, const char *remain, void *opaque) r = sendfile(hc->hc_fd, fd, NULL, chunk); #elif defined(PLATFORM_FREEBSD) sendfile(fd, hc->hc_fd, 0, chunk, NULL, &r, 0); +#elif defined(PLATFORM_DARWIN) + r = chunk; + sendfile(fd, hc->hc_fd, 0, NULL, &r, 0); #endif if(r == -1) { close(fd); diff --git a/src/wrappers.c b/src/wrappers.c index 82535abf6..db3b5a168 100644 --- a/src/wrappers.c +++ b/src/wrappers.c @@ -109,6 +109,8 @@ thread_wrapper ( void *p ) #elif defined(PLATFORM_FREEBSD) /* Set name of thread */ pthread_set_name_np(pthread_self(), ts->name); +#elif defined(PLATFORM_DARWIN) + pthread_setname_np(ts->name); #endif sigemptyset(&set); diff --git a/support/configure.inc b/support/configure.inc index 8ddae9820..96f1d68dd 100755 --- a/support/configure.inc +++ b/support/configure.inc @@ -470,9 +470,11 @@ function write_config CONFIGURE_ARGS = ${CONFIGURE_ARGS} ROOTDIR ?= ${ROOTDIR} BUILDDIR ?= ${BUILDDIR} +PLATFORM ?= ${PLATFORM} OSENV ?= ${OSENV} ARCH ?= ${ARCH} CPU ?= ${CPU} +COMPILER ?= ${COMPILER} ifeq (\$(origin CC),default) CC = ${CC} endif