From 93a49b82538b47d287c6e7024b43e5ebc5754c01 Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Fri, 16 May 2014 23:16:46 +0200 Subject: [PATCH 1/2] rename uuid_t to tvh_uuid_t --- src/config.c | 8 ++++---- src/idnode.c | 4 ++-- src/input/mpegts/linuxdvb/linuxdvb_adapter.c | 2 +- src/input/mpegts/satip/satip.c | 4 ++-- src/uuid.c | 16 ++++++++-------- src/uuid.h | 10 +++++----- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/config.c b/src/config.c index 87dd43f6..f7e97bd3 100644 --- a/src/config.c +++ b/src/config.c @@ -89,7 +89,7 @@ static void config_migrate_v1_dvb_svcs ( const char *name, const char *netu, const char *muxu, htsmsg_t *channels ) { - uuid_t svcu; + tvh_uuid_t svcu; htsmsg_t *c, *e, *svc; htsmsg_field_t *f; const char *str; @@ -139,7 +139,7 @@ config_migrate_v1_dvb_network ( const char *name, htsmsg_t *c, htsmsg_t *channels ) { int i; - uuid_t netu, muxu; + tvh_uuid_t netu, muxu; htsmsg_t *e, *net, *mux, *tun; htsmsg_field_t *f; const char *str, *type; @@ -321,7 +321,7 @@ config_migrate_v1_epggrab ( const char *path, htsmsg_t *channels ) static void config_migrate_v1 ( void ) { - uuid_t netu, muxu, svcu, chnu; + tvh_uuid_t netu, muxu, svcu, chnu; htsmsg_t *c, *m, *e, *l; htsmsg_field_t *f; uint32_t u32; @@ -450,7 +450,7 @@ static void config_migrate_v2 ( void ) { htsmsg_t *m; - uuid_t u; + tvh_uuid_t u; char src[1024], dst[1024]; /* Do we have IPTV config to migrate ? */ diff --git a/src/idnode.c b/src/idnode.c index e3ea6aba..00ff1c5c 100644 --- a/src/idnode.c +++ b/src/idnode.c @@ -102,7 +102,7 @@ idnode_insert(idnode_t *in, const char *uuid, const idclass_t *class) { idnode_t *c; lock_assert(&global_lock); - uuid_t u; + tvh_uuid_t u; if (uuid_init_bin(&u, uuid)) return -1; memcpy(in->in_uuid, u.bin, sizeof(in->in_uuid)); @@ -192,7 +192,7 @@ idnode_get_short_uuid (const idnode_t *in) const char * idnode_uuid_as_str(const idnode_t *in) { - static uuid_t ret[16]; + static tvh_uuid_t ret[16]; static uint8_t p = 0; bin2hex(ret[p].hex, sizeof(ret[p].hex), in->in_uuid, sizeof(in->in_uuid)); const char *s = ret[p].hex; diff --git a/src/input/mpegts/linuxdvb/linuxdvb_adapter.c b/src/input/mpegts/linuxdvb/linuxdvb_adapter.c index 1ee9ba8e..2430b40c 100644 --- a/src/input/mpegts/linuxdvb/linuxdvb_adapter.c +++ b/src/input/mpegts/linuxdvb/linuxdvb_adapter.c @@ -187,7 +187,7 @@ linuxdvb_adapter_add ( const char *path ) extern int linuxdvb_adapter_mask; int a, i, j, r, fd; char fe_path[512], dmx_path[512], dvr_path[512]; - uuid_t uuid; + tvh_uuid_t uuid; linuxdvb_adapter_t *la = NULL; struct dvb_frontend_info dfi; SHA_CTX sha1; diff --git a/src/input/mpegts/satip/satip.c b/src/input/mpegts/satip/satip.c index d1c88b01..f87dca4c 100644 --- a/src/input/mpegts/satip/satip.c +++ b/src/input/mpegts/satip/satip.c @@ -256,7 +256,7 @@ satip_device_calc_bin_uuid( uint8_t *uuid, const char *satip_uuid ) } static void -satip_device_calc_uuid( uuid_t *uuid, const char *satip_uuid ) +satip_device_calc_uuid( tvh_uuid_t *uuid, const char *satip_uuid ) { uint8_t uuidbin[20]; @@ -287,7 +287,7 @@ static satip_device_t * satip_device_create( satip_device_info_t *info ) { satip_device_t *sd = calloc(1, sizeof(satip_device_t)); - uuid_t uuid; + tvh_uuid_t uuid; htsmsg_t *conf = NULL, *feconf = NULL; char *argv[10]; int i, j, n, m, fenum, t2, save = 0; diff --git a/src/uuid.c b/src/uuid.c index 54f343da..1fd6a540 100644 --- a/src/uuid.c +++ b/src/uuid.c @@ -103,9 +103,9 @@ uuid_init ( void ) /* Initialise binary */ int -uuid_init_bin ( uuid_t *u, const char *str ) +uuid_init_bin ( tvh_uuid_t *u, const char *str ) { - memset(u, 0, sizeof(uuid_t)); + memset(u, 0, sizeof(tvh_uuid_t)); if (str) { return hex2bin(u->bin, sizeof(u->bin), str); } else if (read(fd, u->bin, sizeof(u->bin)) != sizeof(u->bin)) { @@ -117,9 +117,9 @@ uuid_init_bin ( uuid_t *u, const char *str ) /* Initialise hex string */ int -uuid_init_hex ( uuid_t *u, const char *str ) +uuid_init_hex ( tvh_uuid_t *u, const char *str ) { - uuid_t tmp; + tvh_uuid_t tmp; if (uuid_init_bin(&tmp, str)) return 1; return uuid_bin2hex(&tmp, u); @@ -127,9 +127,9 @@ uuid_init_hex ( uuid_t *u, const char *str ) /* Convert bin to hex string */ int -uuid_bin2hex ( const uuid_t *a, uuid_t *b ) +uuid_bin2hex ( const tvh_uuid_t *a, tvh_uuid_t *b ) { - uuid_t tmp; + tvh_uuid_t tmp; memset(&tmp, 0, sizeof(tmp)); bin2hex(tmp.hex, sizeof(tmp.hex), a->bin, sizeof(a->bin)); memcpy(b, &tmp, sizeof(tmp)); @@ -138,9 +138,9 @@ uuid_bin2hex ( const uuid_t *a, uuid_t *b ) /* Convert hex string to bin (in place) */ int -uuid_hex2bin ( const uuid_t *a, uuid_t *b ) +uuid_hex2bin ( const tvh_uuid_t *a, tvh_uuid_t *b ) { - uuid_t tmp; + tvh_uuid_t tmp; memset(&tmp, 0, sizeof(tmp)); if (hex2bin(tmp.bin, sizeof(tmp.bin), a->hex)) return 1; diff --git a/src/uuid.h b/src/uuid.h index 81c09757..45269d21 100644 --- a/src/uuid.h +++ b/src/uuid.h @@ -31,30 +31,30 @@ typedef struct uuid { uint8_t bin[UUID_BIN_SIZE]; char hex[UUID_HEX_SIZE]; }; -} uuid_t; +} tvh_uuid_t; /* Initialise subsystem */ void uuid_init ( void ); /* Initialise binary */ -int uuid_init_bin ( uuid_t *u, const char *str ); +int uuid_init_bin ( tvh_uuid_t *u, const char *str ); /* Initialise hex string */ -int uuid_init_hex ( uuid_t *u, const char *str ); +int uuid_init_hex ( tvh_uuid_t *u, const char *str ); /** * Convert bin to hex string * * Note: conversion is done such that a and b can be the same */ -int uuid_bin2hex ( const uuid_t *a, uuid_t *b ); +int uuid_bin2hex ( const tvh_uuid_t *a, tvh_uuid_t *b ); /** * Convert hex string to bin (in place) * * Note: conversion is done such that a and b can be the same */ -int uuid_hex2bin ( const uuid_t *a, uuid_t *b ); +int uuid_hex2bin ( const tvh_uuid_t *a, tvh_uuid_t *b ); /** * Hex string to binary From 5a8b5e7fe2093be94a71fa7d6b9a6fb964a4edcb Mon Sep 17 00:00:00 2001 From: Damjan Marion Date: Fri, 16 May 2014 23:18:53 +0200 Subject: [PATCH 2/2] osx: initial support for OS X --- Makefile | 11 ++++++++++- configure | 19 ++++++++++++++++++- src/httpc.c | 6 +++--- src/muxer.c | 8 ++++++++ src/trap.c | 22 +++++++++++++++++++++- src/tvheadend.h | 19 +++++++++++++++++++ src/upnp.c | 2 +- src/webui/webui.c | 5 ++++- src/wrappers.c | 2 ++ support/configure.inc | 2 ++ 10 files changed, 88 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index dee8c412..1bf97c33 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 cdcd469d..0fbe95d0 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 4efa047d..21cb6771 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 d8d76e6b..03150d39 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 5481792d..2bb99c27 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 91b0d831..e5910f8d 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 4c9435c4..0c6f5ee8 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 d56c79cf..7929ad29 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 82535abf..db3b5a16 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 8ddae982..96f1d68d 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