From f08423f9530d8ecdecdcc16c8d970b8fca12c9c5 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Sat, 9 Aug 2014 12:10:28 +0200 Subject: [PATCH] dbus: allow to select system or session message bus --- src/dbus.c | 8 ++++++-- src/dbus.h | 4 ++-- src/main.c | 9 +++++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/dbus.c b/src/dbus.c index a827f6e7..c962499c 100644 --- a/src/dbus.c +++ b/src/dbus.c @@ -53,6 +53,7 @@ static struct dbus_rpc_list dbus_rpcs; static th_pipe_t dbus_pipe; static pthread_mutex_t dbus_lock; static int dbus_running; +static int dbus_session; /** * @@ -135,7 +136,7 @@ dbus_create_session(const char *name) dbus_error_init(&err); - conn = dbus_bus_get_private(DBUS_BUS_SESSION, &err); + conn = dbus_bus_get_private(dbus_session ? DBUS_BUS_SESSION : DBUS_BUS_SYSTEM, &err); if (dbus_error_is_set(&err)) { tvherror("dbus", "Connection error: %s", err.message); dbus_error_free(&err); @@ -146,11 +147,13 @@ dbus_create_session(const char *name) if (dbus_error_is_set(&err)) { tvherror("dbus", "Name error: %s", err.message); dbus_error_free(&err); + dbus_connection_close(conn); dbus_connection_unref(conn); return NULL; } if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != ret) { tvherror("dbus", "Not primary owner"); + dbus_connection_close(conn); dbus_connection_unref(conn); return NULL; } @@ -429,8 +432,9 @@ dbus_server_thread(void *aux) pthread_t dbus_tid; void -dbus_server_init(void) +dbus_server_init(int session) { + dbus_session = session; pthread_mutex_init(&dbus_lock, NULL); TAILQ_INIT(&dbus_signals); LIST_INIT(&dbus_rpcs); diff --git a/src/dbus.h b/src/dbus.h index e3eadfeb..15023d7c 100644 --- a/src/dbus.h +++ b/src/dbus.h @@ -39,7 +39,7 @@ void dbus_register_rpc_str(const char *call_name, void *opaque, char *(*fcn)(void *, const char *, char *)); -void dbus_server_init(void); +void dbus_server_init(int session); void dbus_server_start(void); void dbus_server_done(void); @@ -60,7 +60,7 @@ static inline void dbus_register_rpc_str(const char *call_name, void *opaque, char *(*fcn)(void *, const char *, char *)) { } -static inline void dbus_server_init(void) { } +static inline void dbus_server_init(int session) { } static inline void dbus_server_start(void) { } static inline void dbus_server_done(void) { } diff --git a/src/main.c b/src/main.c index 8c6f5dfc..452a0e37 100644 --- a/src/main.c +++ b/src/main.c @@ -471,7 +471,8 @@ main(int argc, char **argv) opt_ipv6 = 0, opt_tsfile_tuner = 0, opt_dump = 0, - opt_xspf = 0; + opt_xspf = 0, + opt_dbus_session = 0; const char *opt_config = NULL, *opt_user = NULL, *opt_group = NULL, @@ -504,6 +505,10 @@ main(int argc, char **argv) "to your Tvheadend installation until you edit\n" "the access-control from within the Tvheadend UI", OPT_BOOL, &opt_firstrun }, +#if ENABLE_DBUS_1 + { 'e', "dbus_session", "DBus - use the session message bus instead system one", + OPT_BOOL, &opt_dbus_session }, +#endif #if ENABLE_LINUXDVB { 'a', "adapters", "Only use specified DVB adapters (comma separated)", OPT_STR, &opt_dvb_adapters }, @@ -768,7 +773,7 @@ main(int argc, char **argv) * Initialize subsystems */ - dbus_server_init(); + dbus_server_init(opt_dbus_session); intlconv_init();