From e86573b28f9bd38ec4e001d5cf70e094199b13db Mon Sep 17 00:00:00 2001 From: "sanghyeok.oh" Date: Wed, 21 Mar 2018 22:23:49 +0900 Subject: [PATCH 01/16] prevent: fix prevent issue Change-Id: Iadce5347e6dba92599ff42cabb57b082b46ad1d2 Signed-off-by: sanghyeok.oh --- plugins/display/state-tv.c | 2 +- src/display/display-dbus.c | 4 +++- src/display/input.c | 4 +--- src/libdeviced/usbhost.c | 2 +- src/power/power-handler.c | 5 +++++ src/usb/usb-state.c | 7 +++++-- src/usbhost/usb-host.c | 3 +++ 7 files changed, 19 insertions(+), 8 deletions(-) diff --git a/plugins/display/state-tv.c b/plugins/display/state-tv.c index cdcff8a..8c0d7f3 100644 --- a/plugins/display/state-tv.c +++ b/plugins/display/state-tv.c @@ -156,7 +156,7 @@ static int lcdon_action(int timeout) pm_cur_state != S_SLEEP) set_setting_pmstate(pm_cur_state); - if (pm_old_state != S_LCDOFF || + if (pm_old_state != S_LCDOFF && pm_old_state != S_SLEEP) { _I("pm_old_state (%s). Skip lcd on", states[pm_old_state].name); return 0; diff --git a/src/display/display-dbus.c b/src/display/display-dbus.c index 18c26d0..f733931 100644 --- a/src/display/display-dbus.c +++ b/src/display/display-dbus.c @@ -860,7 +860,7 @@ GVariant *dbus_locktimeout_expired(GDBusConnection *conn, pid_t pid; char pid_str[16]; char comm[NAME_MAX]; - struct pmlock_expired_s *ex; + struct pmlock_expired_s *ex = NULL; GVariant *gvar = NULL; CHECK_POWEROFF(); @@ -915,6 +915,8 @@ GVariant *dbus_locktimeout_expired(GDBusConnection *conn, out: gvar = g_variant_new("(si)", req_id, ret); g_free(req_id); + if (ex) + free(ex); return gvar; } diff --git a/src/display/input.c b/src/display/input.c index 6ef5c78..95714ac 100644 --- a/src/display/input.c +++ b/src/display/input.c @@ -90,9 +90,7 @@ static inline void process_event(struct libinput_event *ev) input.type = EV_REL; fd = libinput_get_fd(li); - _D("time %d.%d type %d code %d value %d fd %d", - input.time.tv_sec, input.time.tv_usec, input.type, - input.code, input.value, fd); + _D("type %d fd %d", input.type, fd); if (CHECK_OPS(keyfilter_ops, check) && keyfilter_ops->check(&input, fd) != 0) diff --git a/src/libdeviced/usbhost.c b/src/libdeviced/usbhost.c index f3d107f..2f9ece5 100644 --- a/src/libdeviced/usbhost.c +++ b/src/libdeviced/usbhost.c @@ -133,7 +133,7 @@ static void device_signal_handler(GDBusConnection *conn, &device.product, &device.serial); - strncpy(device.devpath, syspath, PATH_MAX); + strncpy(device.devpath, syspath, PATH_MAX - 1); DD_LIST_FOREACH(handlers, element, handler) { if (strcmp(handler->name, SIGNAL_NAME_USB_DEVICE_CHANGED)) diff --git a/src/power/power-handler.c b/src/power/power-handler.c index e7e0181..2e7d7b9 100755 --- a/src/power/power-handler.c +++ b/src/power/power-handler.c @@ -383,6 +383,11 @@ int check_power_flag(void) if (fd >= 0) { len = read(fd, buf, sizeof(buf) - 1); close(fd); + if (len < 0) { + len = errno; + _E("read() failed (%d)", len); + return 0; + } while (len > 0 && buf[len - 1] == '\n') len--; buf[len] = '\0'; diff --git a/src/usb/usb-state.c b/src/usb/usb-state.c index 043340c..f87da53 100644 --- a/src/usb/usb-state.c +++ b/src/usb/usb-state.c @@ -191,8 +191,11 @@ void usb_state_update_state(usb_connection_state_e state, unsigned int mode) if (mode == USB_FUNCTION_NONE) { if (noti_id >= 0) { - remove_notification("MediaDeviceNotiOff", noti_id); - noti_id = -1; + int ret = remove_notification("MediaDeviceNotiOff", noti_id); + if (ret < 0) + _E("Failed to remove event_noti : %d", ret); + else + noti_id = -1; } } else if (mode & USB_FUNCTION_MTP) { if (noti_id < 0) diff --git a/src/usbhost/usb-host.c b/src/usbhost/usb-host.c index 06d08c2..5c6f08f 100644 --- a/src/usbhost/usb-host.c +++ b/src/usbhost/usb-host.c @@ -650,6 +650,7 @@ static int read_policy(void) entry->creds.sec_label = calloc(ENTRY_LINE_SIZE, 1); if (!entry->creds.sec_label) { _E("No memory: %m"); + free(entry); goto out; } @@ -675,6 +676,8 @@ static int read_policy(void) if (entry->value < 0) { _E("Invalid policy value: %s", value_str); ret = -EINVAL; + free(entry->creds.sec_label); + free(entry); goto out; } -- 2.7.4 From 887a81e0ca389f0c743c513baf66a3abde187f09 Mon Sep 17 00:00:00 2001 From: lokilee73 Date: Thu, 22 Mar 2018 16:32:02 +0900 Subject: [PATCH 02/16] Remove OOMADJ item in auto test OOMADJ function was moved to resourced. So, it should be removed in deviced. Change-Id: I89b05e064c70f58b5e8680b8fea55fc48786f4a2 Signed-off-by: lokilee73 --- src/auto-test/proc.c | 52 ----------------------------------------------- src/core/common.c | 8 ++++++-- src/power/power-handler.c | 1 + 3 files changed, 7 insertions(+), 54 deletions(-) mode change 100644 => 100755 src/auto-test/proc.c mode change 100644 => 100755 src/core/common.c diff --git a/src/auto-test/proc.c b/src/auto-test/proc.c old mode 100644 new mode 100755 index f4b9b5b..532c4a1 --- a/src/auto-test/proc.c +++ b/src/auto-test/proc.c @@ -17,56 +17,9 @@ */ #include "test.h" -#define METHOD_PROC_OOMADJ_SET "oomadj_set" - #define METHOD_SYSNOTI_GETREVISION "GetRevision" -static bool set_proc_method(const char *method, GVariant *param) -{ - GVariant *msg; - int val; - bool ret = FALSE; - - msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, - DEVICED_PATH_PROCESS, - DEVICED_INTERFACE_PROCESS, - method, - param); - if (!msg) { - _E("fail (%s): no reply", method); - return ret; - } - - if (!dh_get_param_from_var(msg, "(i)", &val)) - _E("fail (%s): no message", method); - else { - if ((val == -ENOTSUP) || (val == -ENOSYS)) { - _I("Not supported feature! (%s): %d", method, val); - ret = TRUE; - } else if (val < 0) { - _E("fail (%s): returned fail (%d)", method, val); - } else { - _I("success (%s): %d", method, val); - ret = TRUE; - } - } - - g_variant_unref(msg); - return ret; -} - -static bool set_proc_oomadj(char *type, int argc, int pid, int score_adj) -{ - char str_pid[10]; - char str_score_adj[10]; - - snprintf(str_pid, sizeof(str_pid) - 1, "%d", pid); - snprintf(str_score_adj, sizeof(str_score_adj) - 1, "%d", score_adj); - - return set_proc_method(METHOD_PROC_OOMADJ_SET, g_variant_new("(siss)", type, argc, str_pid, str_score_adj)); -} - static bool get_sysnoti_revision() { GVariant *msg; @@ -105,9 +58,6 @@ void proc_test_all(int *success, int *fail) int s = 0; int f = 0; - (set_proc_oomadj("oomadj_set", 2, getpid(), 300)) ? s++ : f++; - (set_proc_oomadj("oomadj_set", 2, getpid(), 100)) ? s++ : f++; - (get_sysnoti_revision()) ? s++ : f++; if (NULL != success) *success = s; @@ -140,8 +90,6 @@ static int proc_unit(int argc, char **argv) _I("start test"); proc_test_all(&success, &fail); _I("Total: %d, Success: %d, Fail: %d", success+fail, success, fail); - } else if (0 == strcmp(argv[3], METHOD_PROC_OOMADJ_SET)) { - set_proc_oomadj(argv[4], atoi(argv[5]), atoi(argv[6]), atoi(argv[7])); } else if (0 == strcmp(argv[3], METHOD_SYSNOTI_GETREVISION)) { get_sysnoti_revision(); } else { diff --git a/src/core/common.c b/src/core/common.c old mode 100644 new mode 100755 index 1adb267..04ec6ac --- a/src/core/common.c +++ b/src/core/common.c @@ -392,8 +392,12 @@ static int get_num_processes_on_partition(const char *part_path) char *line = NULL; size_t len = 0; int num_processes = 0; + int ret = 0; + + ret = asprintf(&cmd, "fuser -m %s | grep -o '[0-9]*'", part_path); + if (ret < 0) + return -1; - asprintf(&cmd, "fuser -m %s | grep -o '[0-9]*'", part_path); printf("cmd=%s\n", cmd); fp = popen(cmd, "r"); free(cmd); @@ -424,7 +428,7 @@ void umount_partition_by_kill(const char *path, const int max_retry) return; ret = asprintf(&cmd, "mount | grep \" on %s \" | awk '{print $1}'", path); - if (ret == -1) + if (ret < 0) return; fp = popen(cmd, "r"); diff --git a/src/power/power-handler.c b/src/power/power-handler.c index 2e7d7b9..8365070 100755 --- a/src/power/power-handler.c +++ b/src/power/power-handler.c @@ -86,6 +86,7 @@ static struct power_option poweroff_opt; static bool during_poweroff; static dd_list *poweroff_handles; +extern void umount_partition_by_kill(const char *path, const int max_retry); static int get_poweroff_type_enum(char *type, enum poweroff_type *val) { size_t len; -- 2.7.4 From 03399522d3b434f410c701d5ccbe19ce22e5f355 Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Thu, 22 Mar 2018 16:49:50 +0900 Subject: [PATCH 03/16] Removed BuildRequires: pkgconfig(argos_watchdog) Change-Id: I5eb0781aaa8a09039d37f6c8264315a891b050d0 Signed-off-by: Hyotaek Shim --- CMakeLists.txt | 1 - packaging/deviced.spec | 1 - src/core/main.c | 10 +--------- systemd/deviced.service | 1 + 4 files changed, 2 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d5cb32..9d15cb9 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -170,7 +170,6 @@ SET(PKG_MODULES hwcommon mount capi-system-info - argos_watchdog libsystemd ) diff --git a/packaging/deviced.spec b/packaging/deviced.spec index b5a3b0b..3d66f2f 100755 --- a/packaging/deviced.spec +++ b/packaging/deviced.spec @@ -28,7 +28,6 @@ BuildRequires: pkgconfig(eventsystem) BuildRequires: pkgconfig(libtzplatform-config) BuildRequires: pkgconfig(hwcommon) BuildRequires: pkgconfig(capi-system-info) -BuildRequires: pkgconfig(argos_watchdog) BuildRequires: pkgconfig(libsystemd) BuildRequires: pkgconfig(libinput) BuildRequires: pkgconfig(capi-system-sensor) diff --git a/src/core/main.c b/src/core/main.c index 55b7011..a664c32 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include @@ -63,9 +62,7 @@ static void sig_usr1(int signo) void watchdog_notify(void) { - int ret = aw_notify(); - if (ret < 0) - _E("aw_notify failed(%d)", ret); + sd_notify(0, "WATCHDOG=1"); } static void deviced_dbus_name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data) @@ -107,11 +104,6 @@ static int deviced_main(int argc, char **argv) signal(SIGUSR1, sig_usr1); timer = g_timeout_add_seconds_full(G_PRIORITY_HIGH, WATCHDOG_TIMEOUT, watchdog_cb, NULL, NULL); - if (timer) { - ret = aw_register(WATCHDOG_TIMEOUT * 2); - if (ret < 0) - _E("aw_register failed"); - } /* g_main_loop */ g_main_loop_run(mainloop); diff --git a/systemd/deviced.service b/systemd/deviced.service index f3b48b9..9396821 100644 --- a/systemd/deviced.service +++ b/systemd/deviced.service @@ -9,6 +9,7 @@ Restart=always RestartSec=0 KillSignal=SIGUSR1 NotifyAccess=main +WatchdogSec=30s [Install] WantedBy=multi-user.target -- 2.7.4 From 19f28633e69ec61b9bd32d904b89f0b5a6f48aee Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Thu, 22 Mar 2018 16:56:33 +0900 Subject: [PATCH 04/16] To prevent Watchdog Kill during the dbus sync call Change-Id: I91b9b66ff089b638fa649ba695bd4806639cb84d Signed-off-by: Hyotaek Shim --- src/display/dpms-wayland-none.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/display/dpms-wayland-none.c b/src/display/dpms-wayland-none.c index eecf7a6..8af4ac8 100644 --- a/src/display/dpms-wayland-none.c +++ b/src/display/dpms-wayland-none.c @@ -87,6 +87,8 @@ int dpms_get_power(enum dpms_state *state) if (!state) return -EINVAL; + watchdog_notify(); + ret = dbus_handle_method_sync(ENLIGHTENMENT_BUS_NAME, ENLIGHTENMENT_OBJECT_PATH, ENLIGHTENMENT_INTERFACE_NAME, -- 2.7.4 From ec0c448eb40bdd81953a6541e7c6c0106b81699d Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Wed, 21 Mar 2018 18:51:58 +0900 Subject: [PATCH 05/16] libgdbus: Move common gdbus interfaces to libsystem package Change-Id: I3afd64a2f7603e5e63c0db1b0c46bc661f6f8b0a Signed-off-by: pr.jung --- CMakeLists.txt | 1 + packaging/deviced.spec | 1 + src/apps/apps.c | 1 - src/apps/apps.h | 4 +- src/auto-test/CMakeLists.txt | 1 - src/auto-test/test.h | 2 +- src/battery/battery-time.c | 2 +- src/battery/lowbat-handler.c | 2 +- src/control/control.c | 2 +- src/core/devices.c | 2 +- src/core/edbus-handler.c | 1 - src/core/edbus-handler.h | 1 - src/core/event-handler.c | 2 +- src/core/main.c | 2 +- src/core/udev.c | 2 +- src/cpu/pmqos-plugin.c | 2 +- src/cpu/pmqos.c | 2 +- src/devicectl/devicectl.c | 2 +- src/display/ambient-mode.c | 2 +- src/display/core.c | 2 +- src/display/display-dbus.c | 6 +- src/display/dpms-wayland-none.c | 2 +- src/display/key-filter.c | 2 +- src/display/poll.h | 2 +- src/extcon/cradle.c | 2 +- src/extcon/extcon.c | 2 +- src/extcon/hdmi.c | 2 +- src/ir/ir.c | 2 +- src/led/noti.c | 2 +- src/led/rgb.c | 2 +- src/led/torch.c | 2 +- src/led/touch-key.c | 2 +- src/libdeviced/CMakeLists.txt | 2 +- src/libdeviced/dbus.c | 1046 --------------- src/libdeviced/deviced-noti.c | 2 +- src/libdeviced/display.c | 2 +- src/libdeviced/haptic.c | 4 +- src/libdeviced/led.c | 2 +- src/libdeviced/mmc.c | 26 +- src/libdeviced/usbhost.c | 2 +- src/power/boot.c | 2 +- src/power/low-power.c | 3 +- src/power/power-handler.c | 2 +- src/proc/cpu-info.c | 2 +- src/shared/CMakeLists.txt | 1 - src/shared/dbus.c | 2684 ------------------------------------- src/shared/dbus.h | 462 ------- src/shared/deviced-systemd.c | 2 +- src/time/time-handler.c | 2 +- src/tzip/tzip.c | 2 +- src/usb-host-test/usb-host-test.c | 2 +- src/usb/usb-dbus.c | 3 +- src/usbhost/usb-host.c | 3 +- 53 files changed, 61 insertions(+), 4259 deletions(-) delete mode 100644 src/libdeviced/dbus.c delete mode 100644 src/shared/dbus.c delete mode 100644 src/shared/dbus.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d15cb9..f1a67f3 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -171,6 +171,7 @@ SET(PKG_MODULES mount capi-system-info libsystemd + libgdbus ) IF(DISPLAY_MODULE STREQUAL on) diff --git a/packaging/deviced.spec b/packaging/deviced.spec index 3d66f2f..8c68f05 100755 --- a/packaging/deviced.spec +++ b/packaging/deviced.spec @@ -35,6 +35,7 @@ BuildRequires: pkgconfig(fuse) BuildRequires: pkgconfig(minizip) BuildRequires: pkgconfig(libkmod) BuildRequires: pkgconfig(libusbgx) +BuildRequires: pkgconfig(libgdbus) Requires: %{name}-tools = %{version}-%{release} %{?systemd_requires} diff --git a/src/apps/apps.c b/src/apps/apps.c index 14342f9..b49b291 100644 --- a/src/apps/apps.c +++ b/src/apps/apps.c @@ -20,7 +20,6 @@ #include "core/log.h" #include "core/common.h" #include "apps.h" -#include "shared/dbus.h" #define POPUP_METHOD "PopupLaunch" #define BUFF_MAX 255 diff --git a/src/apps/apps.h b/src/apps/apps.h index edbc3b8..24d9214 100644 --- a/src/apps/apps.h +++ b/src/apps/apps.h @@ -19,8 +19,8 @@ #ifndef __APPS_H__ #define __APPS_H__ - -#include "shared/dbus.h" +#include +#include #include "core/common.h" #include "display/poll.h" diff --git a/src/auto-test/CMakeLists.txt b/src/auto-test/CMakeLists.txt index f7db8ea..185958c 100644 --- a/src/auto-test/CMakeLists.txt +++ b/src/auto-test/CMakeLists.txt @@ -13,7 +13,6 @@ SET(SRCS result.c ../core/config-parser.c config.c - ../shared/dbus.c battery.c display.c led.c diff --git a/src/auto-test/test.h b/src/auto-test/test.h index a5bb1d6..d755d3a 100644 --- a/src/auto-test/test.h +++ b/src/auto-test/test.h @@ -23,11 +23,11 @@ #include #include #include +#include #include "core/list.h" #include "core/common.h" #include "core/udev.h" -#include "shared/dbus.h" #ifdef ENABLE_TEST_DLOG #define ENABLE_DLOG diff --git a/src/battery/battery-time.c b/src/battery/battery-time.c index 092c99d..989ad37 100644 --- a/src/battery/battery-time.c +++ b/src/battery/battery-time.c @@ -23,12 +23,12 @@ #include #include #include +#include #include "core/common.h" #include "core/devices.h" #include "core/log.h" #include "core/udev.h" -#include "shared/dbus.h" #include "display/setting.h" #include "power-supply.h" diff --git a/src/battery/lowbat-handler.c b/src/battery/lowbat-handler.c index 6163e9d..be1ab4c 100755 --- a/src/battery/lowbat-handler.c +++ b/src/battery/lowbat-handler.c @@ -25,6 +25,7 @@ #include #include #include +#include #include "lowbat-handler.h" #include "battery.h" @@ -39,7 +40,6 @@ #include "device-node.h" #include "display/setting.h" #include "display/poll.h" -#include "shared/dbus.h" #include "power/power-handler.h" #include "apps/apps.h" #include "power-supply.h" diff --git a/src/control/control.c b/src/control/control.c index cb60336..7ce5662 100644 --- a/src/control/control.c +++ b/src/control/control.c @@ -22,11 +22,11 @@ #include #include #include +#include #include "core/log.h" #include "core/common.h" #include "core/devices.h" -#include "shared/dbus.h" #include "extcon/extcon.h" #define CONTROL_HANDLER_NAME "control" diff --git a/src/core/devices.c b/src/core/devices.c index e91c7ff..9578c2f 100644 --- a/src/core/devices.c +++ b/src/core/devices.c @@ -18,12 +18,12 @@ #include +#include #include "log.h" #include "list.h" #include "common.h" #include "devices.h" -#include "shared/dbus.h" static const struct device_ops default_ops = { .name = "default-ops", diff --git a/src/core/edbus-handler.c b/src/core/edbus-handler.c index bc0241a..ddc5944 100644 --- a/src/core/edbus-handler.c +++ b/src/core/edbus-handler.c @@ -20,7 +20,6 @@ #include #include "core/log.h" -#include "core/edbus-handler.h" #include "core/common.h" #include "core/device-idler.h" #include "core/device-notifier.h" diff --git a/src/core/edbus-handler.h b/src/core/edbus-handler.h index e6ccd0c..9dfa21b 100644 --- a/src/core/edbus-handler.h +++ b/src/core/edbus-handler.h @@ -23,7 +23,6 @@ #include #include #include -#include "shared/dbus.h" struct edbus_method { const char *member; diff --git a/src/core/event-handler.c b/src/core/event-handler.c index 6608710..f8bb1ec 100644 --- a/src/core/event-handler.c +++ b/src/core/event-handler.c @@ -19,11 +19,11 @@ #include #include +#include #include "common.h" #include "devices.h" #include "device-notifier.h" -#include "shared/dbus.h" #include "log.h" static device_notifier_state_e state = DEVICE_NOTIFIER_STATE_STOP; diff --git a/src/core/main.c b/src/core/main.c index a664c32..5b5acf2 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -22,12 +22,12 @@ #include #include #include +#include #include "display/core.h" #include "log.h" #include "common.h" #include "devices.h" -#include "shared/dbus.h" #include "power/boot.h" #include "power/power-handler.h" #include "device-notifier.h" diff --git a/src/core/udev.c b/src/core/udev.c index fae5fdb..07ac8e1 100644 --- a/src/core/udev.c +++ b/src/core/udev.c @@ -20,13 +20,13 @@ #include #include #include +#include #include "log.h" #include "device-notifier.h" #include "devices.h" #include "udev.h" #include "list.h" -#include "shared/dbus.h" #define KERNEL "kernel" #define UDEV "udev" diff --git a/src/cpu/pmqos-plugin.c b/src/cpu/pmqos-plugin.c index dda17b3..775fa79 100644 --- a/src/cpu/pmqos-plugin.c +++ b/src/cpu/pmqos-plugin.c @@ -22,9 +22,9 @@ #include #include #include +#include #include "core/log.h" -#include "shared/dbus.h" #include "core/config-parser.h" #include "pmqos.h" diff --git a/src/cpu/pmqos.c b/src/cpu/pmqos.c index b63ece6..66f12df 100644 --- a/src/cpu/pmqos.c +++ b/src/cpu/pmqos.c @@ -24,9 +24,9 @@ #include #include #include +#include #include "core/log.h" -#include "shared/dbus.h" #include "core/devices.h" #include "core/common.h" #include "core/list.h" diff --git a/src/devicectl/devicectl.c b/src/devicectl/devicectl.c index 637645a..50b251a 100644 --- a/src/devicectl/devicectl.c +++ b/src/devicectl/devicectl.c @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include "usb.h" diff --git a/src/display/ambient-mode.c b/src/display/ambient-mode.c index 776130d..a275500 100644 --- a/src/display/ambient-mode.c +++ b/src/display/ambient-mode.c @@ -19,11 +19,11 @@ #include #include +#include #include "util.h" #include "core.h" #include "display-ops.h" -#include "shared/dbus.h" #include "core/device-notifier.h" #include "core/devices.h" diff --git a/src/display/core.c b/src/display/core.c index adf8aa4..44f550e 100755 --- a/src/display/core.c +++ b/src/display/core.c @@ -38,6 +38,7 @@ #include #include #include +#include #include "ambient-mode.h" #include "util.h" @@ -50,7 +51,6 @@ #include "core/udev.h" #include "core/list.h" #include "core/common.h" -#include "shared/dbus.h" #include "shared/plugin.h" #include "core/config-parser.h" #include "core/launch.h" diff --git a/src/display/display-dbus.c b/src/display/display-dbus.c index f733931..3e374cf 100644 --- a/src/display/display-dbus.c +++ b/src/display/display-dbus.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "ambient-mode.h" #include "core/log.h" @@ -40,7 +41,6 @@ #include "dd-display.h" #include "display-actor.h" #include "display-ops.h" -#include "shared/dbus.h" #define SIGNAL_HOMESCREEN "HomeScreen" @@ -596,7 +596,7 @@ GVariant *dbus_setautobrightnessmin(GDBusConnection *conn, goto error; } if (display_info.reset_autobrightness_min) { - id = dbus_handle_watch_name(sender, display_info.reset_autobrightness_min, NULL, NULL); + id = dbus_handle_watch_name(sender, display_info.reset_autobrightness_min, NULL, NULL, NULL); if (id <= 0) { _E("failed to watch name %s, id %d", sender, id); //todo: set return value @@ -624,7 +624,7 @@ GVariant *dbus_setlcdtimeout(GDBusConnection *conn, if (ret) { _W("fail to set lcd timeout %d by %d", ret, pid); } else { - id = dbus_handle_watch_name(sender, reset_lcd_timeout, NULL, NULL); + id = dbus_handle_watch_name(sender, reset_lcd_timeout, NULL, NULL, NULL); if (id <= 0) { _E("failed to watch name %s, id %d", sender, id); //todo: set return value diff --git a/src/display/dpms-wayland-none.c b/src/display/dpms-wayland-none.c index 8af4ac8..3766df5 100644 --- a/src/display/dpms-wayland-none.c +++ b/src/display/dpms-wayland-none.c @@ -17,8 +17,8 @@ */ #include +#include -#include "shared/dbus.h" #include "device-interface.h" #include "util.h" #include "core.h" diff --git a/src/display/key-filter.c b/src/display/key-filter.c index 4128a3f..98904b6 100644 --- a/src/display/key-filter.c +++ b/src/display/key-filter.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "ambient-mode.h" #include "util.h" @@ -34,7 +35,6 @@ #include "core/common.h" #include "core/devices.h" #include "core/device-notifier.h" -#include "shared/dbus.h" #include "power/power-handler.h" #include "led/touch-key.h" diff --git a/src/display/poll.h b/src/display/poll.h index 8a830a9..a3e12a8 100644 --- a/src/display/poll.h +++ b/src/display/poll.h @@ -27,7 +27,7 @@ #define __PM_POLL_H__ -#include "shared/dbus.h" +#include /** * @addtogroup POWER_MANAGER * @{ diff --git a/src/extcon/cradle.c b/src/extcon/cradle.c index e1007ae..26780e1 100644 --- a/src/extcon/cradle.c +++ b/src/extcon/cradle.c @@ -19,10 +19,10 @@ #include #include +#include #include "core/log.h" #include "core/device-notifier.h" -#include "shared/dbus.h" #include "core/udev.h" #include "display/core.h" #include "extcon/extcon.h" diff --git a/src/extcon/extcon.c b/src/extcon/extcon.c index d89de01..a54f1d2 100644 --- a/src/extcon/extcon.c +++ b/src/extcon/extcon.c @@ -19,6 +19,7 @@ #include #include +#include #include "core/log.h" #include "core/list.h" @@ -26,7 +27,6 @@ #include "core/devices.h" #include "core/config-parser.h" #include "core/device-notifier.h" -#include "shared/dbus.h" #include "core/udev.h" #include "extcon.h" diff --git a/src/extcon/hdmi.c b/src/extcon/hdmi.c index 9b42fa2..6f80bfc 100644 --- a/src/extcon/hdmi.c +++ b/src/extcon/hdmi.c @@ -18,9 +18,9 @@ #include +#include #include "core/log.h" #include "core/device-notifier.h" -#include "shared/dbus.h" #include "display/core.h" #include "extcon.h" diff --git a/src/ir/ir.c b/src/ir/ir.c index 3b43fd3..4b60777 100644 --- a/src/ir/ir.c +++ b/src/ir/ir.c @@ -19,7 +19,7 @@ #include #include #include -#include "shared/dbus.h" +#include #include "core/devices.h" #include "core/common.h" #include "core/log.h" diff --git a/src/led/noti.c b/src/led/noti.c index ae4ed87..ffc4002 100644 --- a/src/led/noti.c +++ b/src/led/noti.c @@ -19,9 +19,9 @@ #include #include +#include #include "core/log.h" -#include "shared/dbus.h" #define METHOD_TORCH_NOTI_ON "LedTorchNotiOn" #define METHOD_TORCH_NOTI_OFF "LedTorchNotiOff" diff --git a/src/led/rgb.c b/src/led/rgb.c index 4732265..921aab2 100644 --- a/src/led/rgb.c +++ b/src/led/rgb.c @@ -25,11 +25,11 @@ #include #include +#include #include "core/log.h" #include "core/list.h" #include "core/common.h" -#include "shared/dbus.h" #include "core/devices.h" #include "core/device-notifier.h" diff --git a/src/led/torch.c b/src/led/torch.c index 1982cdc..719d673 100644 --- a/src/led/torch.c +++ b/src/led/torch.c @@ -23,9 +23,9 @@ #include #include #include +#include #include "core/log.h" -#include "shared/dbus.h" #include "core/devices.h" #include "torch.h" diff --git a/src/led/touch-key.c b/src/led/touch-key.c index d27d791..c38eb9b 100644 --- a/src/led/touch-key.c +++ b/src/led/touch-key.c @@ -20,9 +20,9 @@ #include #include #include +#include #include "core/log.h" -#include "shared/dbus.h" #include "core/devices.h" #include "core/device-notifier.h" #include "display/core.h" diff --git a/src/libdeviced/CMakeLists.txt b/src/libdeviced/CMakeLists.txt index aaa73e3..5d8ee53 100755 --- a/src/libdeviced/CMakeLists.txt +++ b/src/libdeviced/CMakeLists.txt @@ -3,7 +3,6 @@ PROJECT(libdeviced C) SET(LIBDEVICED_SRCS display.c - dbus.c haptic.c led.c mmc.c @@ -20,6 +19,7 @@ pkg_check_modules(libpkgs REQUIRED dlog glib-2.0 gio-2.0 + libgdbus gio-unix-2.0) FOREACH(flag ${libpkgs_CFLAGS}) diff --git a/src/libdeviced/dbus.c b/src/libdeviced/dbus.c deleted file mode 100644 index 8d68141..0000000 --- a/src/libdeviced/dbus.c +++ /dev/null @@ -1,1046 +0,0 @@ -/* - * deviced - * - * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include -#include -#include -#include -#include - -#include "common.h" -#include "log.h" -#include "dbus.h" - -/* -1 is a default timeout value, it's converted to 25*1000 internally. */ -#define DBUS_REPLY_TIMEOUT (-1) - -/* basic information */ -typedef struct { - GDBusConnection *conn; - GBusType bus_type; - gboolean priv; - GList *list_names; /* dbus_name */ - GList *list_object; /* dbus_object_handle_s */ - pthread_mutex_t mutex; -} dbus_handle_s; - -/* path + interfaces */ -typedef struct { - dbus_handle_s *dh; /* dbus handle */ - const char *path; /* object path */ - GList *list_ifaces; /* dbus_interface_s */ -} dbus_object_handle_s; -#define get_dh_from_oh(oh) ((dbus_object_handle_s*)oh)->dh - -/* global shared bus : system, session */ -static dbus_handle_s g_dh[2]; - -static dbus_handle_s *_dbus_handle_get_connection(GBusType bus_type); - -static GBusType g_default_bus_type = G_BUS_TYPE_SYSTEM; -pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER; - -GBusType dbus_handle_get_default_bus_type(void) -{ - GBusType type; - - pthread_mutex_lock(&g_mutex); - type = g_default_bus_type; - pthread_mutex_unlock(&g_mutex); - - return type; -} - -dbus_handle_s * _dbus_handle_get_default_connection(void) -{ - return _dbus_handle_get_connection(dbus_handle_get_default_bus_type()); -} - -#define dbus_handle_lock(handle) do {\ - assert(handle);\ - pthread_mutex_lock(&((handle)->mutex));\ -} while (0); - -#define dbus_handle_unlock(handle) do {\ - assert(handle);\ - pthread_mutex_unlock(&(handle)->mutex);\ -} while (0); - -#define dcl_dbus_handle() dbus_handle_s *dh = (dbus_handle_s *)handle; -#define dcl_dbus_handle_null_check() dbus_handle_s *dh = (dbus_handle_s *)handle;\ - if (!dh) {\ - _E("dbus handle is null\n");\ - return 0;\ - } - -static GDBusConnection * _get_bus(GBusType bus_type) -{ - GDBusConnection *conn = NULL; - GError *err = NULL; - - if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) { - _E("Wrong bus_type %d", bus_type); - return NULL; - } - - conn = g_bus_get_sync(bus_type, NULL, &err); - if (!conn || err) { - _E("failed to get bus:type:%d, %s\n", bus_type, err->message); - g_error_free(err); - return NULL; - } - - return conn; -} - -static GDBusConnection * _get_bus_private(GBusType bus_type) -{ - GError *err = NULL; - GDBusConnection *conn = NULL; - const char * address; - - if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) { - _E("Wrong bus_type %d", bus_type); - return NULL; - } - - address = g_dbus_address_get_for_bus_sync(bus_type, NULL, &err); - if (!address || err) { - _E("failed to get bus address\n"); - g_error_free(err); - return NULL; - } - - conn = g_dbus_connection_new_for_address_sync(address, - (GDBusConnectionFlags) (G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | - G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION), - NULL, /* GDBusAuthObserver */ - NULL, - &err); - if (!conn || err) { - _E("failed to get private bus\n"); - g_error_free(err); - return NULL; - } - - return conn; -} - -/* ref cout is 1 */ -static dbus_handle_s *_dbus_handle_get_connection(GBusType bus_type) -{ - int ibus = bus_type - 1; - dbus_handle_s *dh = NULL; - - if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) { - _E("Unknown bus type %d", bus_type); - return NULL; - } - dh = &g_dh[ibus]; - - dbus_handle_lock(dh); - - if (!dh->conn) { - dh->conn = _get_bus(bus_type); - dh->priv = FALSE; - dh->bus_type = bus_type; - if (!dh->conn) - dh = NULL; - } - - dbus_handle_unlock(dh); - - return dh; -} - -/* ref cout is 1 */ -static dbus_handle_s *_dbus_handle_get_connection_private(GBusType bus_type) -{ - dbus_handle_s * dh; - - if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) { - _E("Unknown bus type %d", bus_type); - return NULL; - } - - dh = (dbus_handle_s *)calloc(1, sizeof(dbus_handle_s)); - if (!dh) { - _E("failed to allocate memory for dbus handle"); - return NULL; - } - - dbus_handle_lock(dh); - - if (!dh->conn) { - dh->conn = _get_bus_private(bus_type); - dh->bus_type = bus_type; - if (!dh->conn) - goto err; - } - - dbus_handle_unlock(dh); - - return dh; -err: - if (dh) { - dbus_handle_unlock(dh); - free(dh); - } - return NULL; -} - - -static void _free_func_signal(gpointer data) -{ - _D("free signal subscribe"); -} - -guint subscribe_dbus_signal(dbus_handle_h handle, const char *path, - const char *iface, const char *name, - GDBusSignalCallback cb, void *data, - destroy_notified free_func) -{ - dcl_dbus_handle(); - - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return 0; - } - } - - if (!dh->conn) { - _E("connection is null. check bus status"); - return 0; - } - return g_dbus_connection_signal_subscribe(dh->conn, NULL, iface, name, path, NULL, G_DBUS_SIGNAL_FLAGS_NONE, cb, data, _free_func_signal); -} - -void unsubscribe_dbus_signal(dbus_handle_h handle, guint id) -{ - dcl_dbus_handle(); - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return ; - } - } - - if (!dh->conn) { - _E("connection is null. check bus status"); - return ; - } - - g_dbus_connection_signal_unsubscribe(dh->conn, id); -} - -int _check_type_string_is_container(const char *signature) -{ - if (!signature) - return FALSE; - - switch (signature[0]) { - case 'a': - case 'm': - case 'r': - case '(': - case '{': - case 'v': - return TRUE; - default: - return FALSE; - } - - return TRUE; -} - -GVariant *dbus_handle_make_simple_array(const char *sig, int *param) -{ - GVariantBuilder *builder = NULL; - GVariant *var = NULL; - char format[256]; - int i = 0; - - builder = g_variant_builder_new(G_VARIANT_TYPE(sig)); - if (!builder) { - _E("failed to g_variant_builder_new"); - return NULL; - } - - while (param[i]) - g_variant_builder_add(builder, "i", param[i++]); - - snprintf(format, sizeof(format) - 1, "(%s)", sig); - var = g_variant_new(format, builder); - g_variant_builder_unref(builder); - return var; -} - -/* todo: looks like garbage... */ -static GVariant* _append_variant(const char *signature, const char *param[]) -{ - char *ch; - int i; - int pi; - int int_type; - gboolean bool_type; - unsigned long long int64_type; - GVariant *ret; - int len; - char container[255];// The maximum length of a signature is 255. - const char *sig = signature; - GVariantBuilder *builder = NULL; - - if (!signature || !param) - return 0; - - /* workaround for user fault "(i) != i" but we treat this as same signature */ - /* G_VARIANT_TYPE("si") return NULL */ - /* todo: actually user have to use correct signature */ - if (!_check_type_string_is_container(signature)) { - snprintf(container, sizeof(container) - 1, "(%s)", signature); - sig = container; - } - if (!g_variant_type_is_container(G_VARIANT_TYPE(sig))) { - _E("signature (%s) is not container type", signature); - } - - builder = g_variant_builder_new(G_VARIANT_TYPE(sig)); - len = strlen(sig); - pi = 0; - for (ch = (char *)sig, i = 0; i < len; ++i, ++ch) { - switch (*ch) { - case '(': - case ')': - continue; - case 'b': - bool_type = (atoi(param[pi++]) == 0 ? FALSE : TRUE); - g_variant_builder_add(builder, "b", bool_type); - break; - case 'i': - int_type = atoi(param[pi++]); - g_variant_builder_add(builder, "i", int_type); - break; - case 'u': - int_type = strtoul(param[pi++], NULL, 10); - g_variant_builder_add(builder, "u", int_type); - break; - case 't': - int64_type = atoll(param[pi++]); - g_variant_builder_add(builder, "t", int64_type); - break; - case 's': - g_variant_builder_add(builder, "s", param[pi++]); - break; - case 'a': - ++ch; - switch (*ch) { - case 'y': - g_variant_builder_add(builder, "^ay", param[pi++]); - ++i; - break; - default: - break; - } - break; - default: - break; - } - } - ret = g_variant_builder_end(builder); - g_variant_builder_clear(builder); - g_variant_builder_unref(builder); - - return ret; -} - -GVariant *dbus_handle_method_sync_with_reply(const char *dest, const char *path, - const char *iface, const char *method, - const char *signature, const char *param[]) -{ - GError *err = NULL; - GVariant * var = NULL; - GVariant * ret = NULL; - dbus_handle_s *dh = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return NULL; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return NULL; - } - - if (signature && param) - var = _append_variant(signature, param); - - ret = g_dbus_connection_call_sync(dh->conn, - dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, &err); - if (!ret || err) { - if (err) { - _E("failed to g_dbus_connection_call_sync:%s", err->message); - g_error_free(err); - } else { - _E("failed to g_dbus_connection_call_sync"); - g_variant_unref(var); - } - return NULL; - } - - return ret; -} - -GVariant *dbus_handle_method_sync_with_reply_var(const char *dest, - const char *path, - const char *iface, - const char *method, - GVariant *var) -{ - GError *err = NULL; - GVariant * ret = NULL; - dbus_handle_s *dh = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - if (var) - g_variant_unref(var); - return NULL; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - if (var) - g_variant_unref(var); - return NULL; - } - - ret = g_dbus_connection_call_sync(dh->conn, - dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, &err); - if (!ret || err) { - if (err) { - _E("failed to g_dbus_connection_call_sync:%s", err->message); - g_error_free(err); - } else { - _E("failed to g_dbus_connection_call_sync"); - } - return NULL; - } - - return ret; -} - -GVariant *dbus_handle_method_with_unix_fd_list_sync_with_reply(const char *dest, - const char *path, - const char *iface, - const char *method, - const char *signature, - const char *param[], - int *in_fdlist, - int in_size, - int **out_fdlist, - int *out_size) -{ - GError *err = NULL; - GVariant * var = NULL; - GVariant * ret = NULL; - dbus_handle_s *dh = NULL; - GDBusProxy *proxy = NULL; - GUnixFDList *g_infdlist = NULL; - GUnixFDList *g_outfdlist = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return NULL; - } - if (in_fdlist && in_size == 0) { - _E("wrong in_fdlist is not null but in_size is 0"); - return NULL; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return NULL; - } - - if (signature && param) - var = _append_variant(signature, param); - - proxy = g_dbus_proxy_new_sync(dh->conn, G_DBUS_PROXY_FLAGS_NONE, NULL, dest, path, iface, NULL, &err); - if (!proxy) { - if (err) { - _E("failed to proxy_new_sync(%s)\n", err->message); - g_error_free(err); - } else { - _E("failed to proxy_new_sync\n"); - if (var) - g_variant_unref(var); - } - } - - /* append fd */ - if (in_fdlist) { - g_infdlist = g_unix_fd_list_new_from_array(in_fdlist, in_size); - if (!g_infdlist) { - _E("failed to g_unix_fd_list_new_from_array\n"); - goto out; - } - //g_infdlist = g_unix_fd_list_new(); - //if (g_unix_fd_list_append(g_infdlist, in_fdlist[0], &err) < 0) { - } - - ret = g_dbus_proxy_call_with_unix_fd_list_sync(proxy, method, var, G_DBUS_CALL_FLAGS_NONE, -1, - g_infdlist, &g_outfdlist, NULL, &err); - if (!ret || err) { - if (err) { - _E("failed to g_dbus_proxy_call_with_unix_fd_list_sync:%s", err->message); - g_error_free(err); - } else { - _E("failed to g_dbus_proxy_call_with_unix_fd_list_sync:"); - if (var) - g_variant_unref(var); - if (g_infdlist) - g_object_unref(g_infdlist); - } - goto out; - } - - /* fds to out array */ - if (g_outfdlist) { - *out_size = g_unix_fd_list_get_length(g_outfdlist); - if (*out_size == 0) - goto out; - - *out_fdlist = g_unix_fd_list_steal_fds(g_outfdlist, NULL); - } - -out: - if (g_outfdlist) - g_object_unref(g_outfdlist); - if (proxy) - g_object_unref(proxy); - - return ret; -} - -GVariant *dbus_handle_method_with_unix_fd_list_sync_with_reply_var(const char *dest, - const char *path, - const char *iface, - const char *method, - GVariant *param, - int *in_fdlist, - int in_size, - int **out_fdlist, - int *out_size) -{ - GError *err = NULL; - GVariant * ret = NULL; - dbus_handle_s *dh = NULL; - GDBusProxy *proxy = NULL; - GUnixFDList *g_infdlist = NULL; - GUnixFDList *g_outfdlist = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return NULL; - } - if (in_fdlist && in_size == 0) { - _E("wrong in_fdlist is not null but in_size is 0"); - return NULL; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return NULL; - } - - proxy = g_dbus_proxy_new_sync(dh->conn, G_DBUS_PROXY_FLAGS_NONE, NULL, dest, path, iface, NULL, &err); - if (!proxy) { - if (err) { - _E("failed to proxy_new_sync(%s)\n", err->message); - g_error_free(err); - } else { - _E("failed to proxy_new_sync\n"); - if (param) - g_variant_unref(param); - } - goto out; - } - - /* append fd */ - if (in_fdlist) { - g_infdlist = g_unix_fd_list_new_from_array(in_fdlist, in_size); - if (!g_infdlist) { - _E("failed to g_unix_fd_list_new_from_array\n"); - goto out; - } - //g_infdlist = g_unix_fd_list_new(); - //if (g_unix_fd_list_append(g_infdlist, in_fdlist[0], &err) < 0) { - } - - /* send message */ - ret = g_dbus_proxy_call_with_unix_fd_list_sync(proxy, method, param, G_DBUS_CALL_FLAGS_NONE, -1, - g_infdlist, &g_outfdlist, NULL, &err); - if (!ret || err) { - if (err) { - _E("failed to g_dbus_proxy_call_with_unix_fd_list_sync:%s", err->message); - g_error_free(err); - } else { - _E("failed to g_dbus_proxy_call_with_unix_fd_list_sync:"); - if (param) - g_variant_unref(param); - if (g_infdlist) - g_object_unref(g_infdlist); - } - goto out; - } - - /* copy fds to out array */ - if (g_outfdlist) { - *out_size = g_unix_fd_list_get_length(g_outfdlist); - if (*out_size == 0) - goto out; - *out_fdlist = g_unix_fd_list_steal_fds(g_outfdlist, NULL); - } -out: - if (g_outfdlist) - g_object_unref(g_outfdlist); - if (proxy) - g_object_unref(proxy); - return ret; -} - -int dbus_handle_method_sync(const char *dest, - const char *path, - const char *iface, - const char *method, - const char *signature, - const char *param[]) -{ - int result; - gboolean result_bool; - GVariant *reply = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - reply = dbus_handle_method_sync_with_reply(dest, path, iface, method, signature, param); - if (!reply) - return -ECOMM; - - if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0) { - g_variant_get(reply, "(i)", &result); - } else if (g_strcmp0("(b)", g_variant_get_type_string(reply)) == 0) { - g_variant_get(reply, "(b)", &result_bool); - result = (int)result_bool; - } else { - result = -ENOMSG; - } - - g_variant_unref(reply); - - return result; -} - -int dbus_handle_method_sync_var(const char *dest, - const char *path, - const char *iface, - const char *method, - GVariant *param) -{ - int result; - gboolean result_bool; - GVariant *reply = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - reply = dbus_handle_method_sync_with_reply_var(dest, path, iface, method, param); - if (!reply) - return -ECOMM; - - if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0) { - g_variant_get(reply, "(i)", &result); - } else if (g_strcmp0("(b)", g_variant_get_type_string(reply)) == 0) { - g_variant_get(reply, "(b)", &result_bool); - result = (int)result_bool; - } else { - result = -ENOMSG; - } - - g_variant_unref(reply); - - return result; -} - -int dbus_handle_method_sync_timeout(const char *dest, - const char *path, - const char *iface, - const char *method, - const char *signature, - const char *param[], - int timeout) -{ - dbus_handle_s *dh = NULL; - GError *err = NULL; - GVariant * var = NULL; - GVariant * reply = NULL; - int result = 0; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -EPERM; - } - - if (signature && param) - var = _append_variant(signature, param); - - reply = g_dbus_connection_call_sync(dh->conn, - dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, timeout, NULL, &err); - if (!reply || err) { - _E("failed to g_dbus_connection_call_sync:%s", err->message); - g_error_free(err); - return -1; - } - - if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0) - g_variant_get(reply, "(i)", &result); - else - result = -ENOMSG; - - g_variant_unref(reply); - - return result; -} - -int dbus_handle_method_sync_pairs(const char *dest, - const char *path, - const char *iface, - const char *method, - int num, - va_list args) -{ - GError *err = NULL; - GVariant * reply = NULL; - char *key, *value; - int ret = 0; - GVariant *var; - GVariantBuilder *builder; - dbus_handle_s *dh = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - - builder = g_variant_builder_new(G_VARIANT_TYPE("a{ss}")); - - for (int i = 0 ; i < num ; i = i + 2) { - key = va_arg(args, char *); - value = va_arg(args, char *); - _I("key(%s), value(%s)", key, value); - g_variant_builder_add(builder, "{ss}", key, value); - } - - var = g_variant_new("(a{ss})", builder); - g_variant_builder_unref(builder); - - reply = g_dbus_connection_call_sync(dh->conn, - dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, &err); - if (!reply || err) { - _E("failed to g_dbus_connection_call_sync"); - return -1; - } - - if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0) - g_variant_get(reply, "(i)", &ret); - else - ret = -ENOMSG; - - g_variant_unref(reply); - - return ret; -} - -int dbus_handle_method_async_pairs(const char *dest, - const char *path, - const char *iface, - const char *method, - int num, - va_list args) -{ - char *key, *value; - GVariant *var; - GVariantBuilder *builder; - dbus_handle_s *dh = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - - // dict - builder = g_variant_builder_new(G_VARIANT_TYPE("a{ss}")); - - for (int i = 0 ; i < num ; i = i + 2) { - key = va_arg(args, char *); - value = va_arg(args, char *); - _I("key(%s), value(%s)", key, value); - g_variant_builder_add(builder, "{ss}", key, value); - } - - var = g_variant_new("(a{ss})", builder); - g_variant_builder_unref(builder); - - g_dbus_connection_call(dh->conn, dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, - NULL, - NULL); - - return 0; -} - -int dbus_handle_method_async(const char *dest, - const char *path, - const char *iface, - const char *method, - const char *signature, - const char *param[]) -{ - GVariant * var = NULL; - dbus_handle_s *dh = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - - if (signature && param) - var = _append_variant(signature, param); - - g_dbus_connection_call(dh->conn, dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, - NULL, - NULL); - - return 0; -} - -int dbus_handle_method_async_var(const char *dest, - const char *path, - const char *iface, - const char *method, - GVariant *param) -{ - dbus_handle_s *dh = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - - g_dbus_connection_call(dh->conn, dest, path, iface, method, - param, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, - NULL, - NULL); - - return 0; -} - -/* callback should free gvariant */ -static void _cb_pending(GDBusConnection *conn, - GAsyncResult *res, - gpointer user_data) -{ - GVariant *reply = NULL; - GError *err = NULL; - pending_call_data *data = (pending_call_data *)user_data; - - reply = g_dbus_connection_call_finish(conn, res, &err); - if (!reply || err) { - if (err) { - _E("no message : [%s]", err->message); - g_error_free(err); - } else { - _E("no message"); - } - - if (data && data->func) - data->func(NULL, data->data, err); - goto out; - } - - if (data && data->func) - data->func(reply, data->data, err); -out: - if (data) - free(data); -} - -int dbus_handle_method_async_with_reply(const char *dest, - const char *path, - const char *iface, - const char *method, - const char *signature, - const char *param[], - dbus_pending_cb cb, - int timeout_msec, - void *data) -{ - dbus_handle_s *dh = NULL; - pending_call_data *pdata = NULL; - GVariant * var = NULL; - int ret = 0; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - if (timeout_msec < -1) { - _E("wrong timeout %d", timeout_msec); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -EPERM; - } - - if (signature && param) - var = _append_variant(signature, param); - - if (cb) { - pdata = (pending_call_data*)malloc(sizeof(pending_call_data)); - if (!pdata) { - ret = -ENOMEM; - goto err; - } - - pdata->func = cb; - pdata->data = data; - } - g_dbus_connection_call(dh->conn, dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, timeout_msec, NULL, - (GAsyncReadyCallback)_cb_pending, - pdata); - - return ret; -err: - if (var) - g_variant_unref(var); - return ret; -} - -int dbus_handle_method_async_with_reply_var(const char *dest, - const char *path, - const char *iface, - const char *method, - GVariant *param, - dbus_pending_cb cb, - int timeout_msec, - void *data) -{ - dbus_handle_s *dh = NULL; - pending_call_data *pdata = NULL; - int ret = 0; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - if (timeout_msec < -1) { - _E("wrong timeout %d", timeout_msec); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -EPERM; - } - - if (cb) { - pdata = (pending_call_data*)malloc(sizeof(pending_call_data)); - if (!pdata) { - ret = -ENOMEM; - goto err; - } - - pdata->func = cb; - pdata->data = data; - } - g_dbus_connection_call(dh->conn, dest, path, iface, method, - param, NULL, G_DBUS_CALL_FLAGS_NONE, timeout_msec, NULL, - (GAsyncReadyCallback)_cb_pending, - pdata); - - return ret; -err: - if (param) - g_variant_unref(param); - return ret; -} diff --git a/src/libdeviced/deviced-noti.c b/src/libdeviced/deviced-noti.c index c4957cb..c217cab 100755 --- a/src/libdeviced/deviced-noti.c +++ b/src/libdeviced/deviced-noti.c @@ -27,11 +27,11 @@ #include #include #include +#include #include "dd-deviced.h" #include "deviced-priv.h" #include "log.h" -#include "dbus.h" #define PREDEF_PWROFF_POPUP "pwroff-popup" #define PREDEF_ENTERSLEEP "entersleep" diff --git a/src/libdeviced/display.c b/src/libdeviced/display.c index 8cecfa4..5df5e3f 100644 --- a/src/libdeviced/display.c +++ b/src/libdeviced/display.c @@ -19,9 +19,9 @@ #include #include +#include #include "log.h" -#include "dbus.h" #include "common.h" #include "dd-display.h" diff --git a/src/libdeviced/haptic.c b/src/libdeviced/haptic.c index dcd8569..c788c4a 100644 --- a/src/libdeviced/haptic.c +++ b/src/libdeviced/haptic.c @@ -26,9 +26,9 @@ #include #include #include +#include #include "log.h" -#include "dbus.h" #include "dd-haptic.h" #include "common.h" @@ -60,4 +60,4 @@ API int haptic_stop_all_effects(haptic_device_h device_handle) { _E("Not Supported, Please use capi-system-device apis"); return HAPTIC_ERROR_OPERATION_FAILED; -} \ No newline at end of file +} diff --git a/src/libdeviced/led.c b/src/libdeviced/led.c index 2d0d0dd..e7da673 100644 --- a/src/libdeviced/led.c +++ b/src/libdeviced/led.c @@ -20,9 +20,9 @@ #include #include #include +#include #include "log.h" -#include "dbus.h" #include "common.h" #define METHOD_GET_BRIGHTNESS "GetBrightness" diff --git a/src/libdeviced/mmc.c b/src/libdeviced/mmc.c index 52cecbb..f1c6484 100644 --- a/src/libdeviced/mmc.c +++ b/src/libdeviced/mmc.c @@ -22,9 +22,9 @@ #include #include #include +#include #include "log.h" -#include "dbus.h" #include "common.h" #include "dd-mmc.h" @@ -71,9 +71,9 @@ static int get_mmc_primary_id() int ret; int id; - reply = dbus_handle_method_sync_with_reply_var(STORAGE_BUS_NAME, - DEVICED_PATH_BLOCK_MANAGER, - DEVICED_INTERFACE_BLOCK_MANAGER, + reply = dbus_handle_method_sync_with_reply_var(STORAGED_BUS_NAME, + STORAGED_PATH_BLOCK_MANAGER, + STORAGED_INTERFACE_BLOCK_MANAGER, "GetDeviceList", g_variant_new("(s)", "mmc")); if (!reply) { @@ -175,9 +175,9 @@ API int deviced_request_mount_mmc(struct mmc_contents *mmc_data) if (id < 0) return id; - ret = dbus_handle_method_async_with_reply_var(STORAGE_BUS_NAME, - DEVICED_PATH_BLOCK_MANAGER, - DEVICED_INTERFACE_BLOCK_MANAGER, + ret = dbus_handle_method_async_with_reply_var(STORAGED_BUS_NAME, + STORAGED_PATH_BLOCK_MANAGER, + STORAGED_INTERFACE_BLOCK_MANAGER, "Mount", g_variant_new("(is)", id, ""), mount_cb, @@ -236,9 +236,9 @@ API int deviced_request_unmount_mmc(struct mmc_contents *mmc_data, int option) if (id < 0) return id; - ret = dbus_handle_method_async_with_reply_var(STORAGE_BUS_NAME, - DEVICED_PATH_BLOCK_MANAGER, - DEVICED_INTERFACE_BLOCK_MANAGER, + ret = dbus_handle_method_async_with_reply_var(STORAGED_BUS_NAME, + STORAGED_PATH_BLOCK_MANAGER, + STORAGED_INTERFACE_BLOCK_MANAGER, "Unmount", g_variant_new("(ii)", id, option), unmount_cb, @@ -302,9 +302,9 @@ API int deviced_format_mmc(struct mmc_contents *mmc_data, int option) if (id < 0) return id; - ret = dbus_handle_method_async_with_reply_var(STORAGE_BUS_NAME, - DEVICED_PATH_BLOCK_MANAGER, - DEVICED_INTERFACE_BLOCK_MANAGER, + ret = dbus_handle_method_async_with_reply_var(STORAGED_BUS_NAME, + STORAGED_PATH_BLOCK_MANAGER, + STORAGED_INTERFACE_BLOCK_MANAGER, "Format", g_variant_new("(ii)", id, option), format_cb, diff --git a/src/libdeviced/usbhost.c b/src/libdeviced/usbhost.c index 2f9ece5..c36aa46 100644 --- a/src/libdeviced/usbhost.c +++ b/src/libdeviced/usbhost.c @@ -19,10 +19,10 @@ #include #include +#include #include "log.h" #include "common.h" -#include "dbus.h" #include "dd-usbhost.h" #include "core/list.h" diff --git a/src/power/boot.c b/src/power/boot.c index 1b6be5d..e6e95b5 100644 --- a/src/power/boot.c +++ b/src/power/boot.c @@ -20,12 +20,12 @@ #include #include #include +#include #include "core/log.h" #include "core/device-notifier.h" #include "core/common.h" #include "display/poll.h" -#include "shared/dbus.h" #include "shared/deviced-systemd.h" #define SIGNAL_BOOTING_DONE "BootingDone" diff --git a/src/power/low-power.c b/src/power/low-power.c index efe8344..ab1719a 100644 --- a/src/power/low-power.c +++ b/src/power/low-power.c @@ -22,14 +22,13 @@ #include #include #include +#include #include "core/log.h" #include "core/device-notifier.h" #include "core/device-idler.h" #include "core/common.h" #include "core/devices.h" -#include "shared/dbus.h" -#include "shared/dbus.h" #ifndef VCONFKEY_SYSMAN_LOW_POWER_MODE #define VCONFKEY_SYSMAN_LOW_POWER_MODE "db/sysman/low_power_mode" diff --git a/src/power/power-handler.c b/src/power/power-handler.c index 8365070..5fd733f 100755 --- a/src/power/power-handler.c +++ b/src/power/power-handler.c @@ -36,6 +36,7 @@ #include #include #include +#include #include "dd-deviced.h" #include "core/log.h" @@ -48,7 +49,6 @@ #include "core/launch.h" #include "display/poll.h" #include "display/setting.h" -#include "shared/dbus.h" #include "display/core.h" #include "power-handler.h" #include "apps/apps.h" diff --git a/src/proc/cpu-info.c b/src/proc/cpu-info.c index 216dee6..352b191 100644 --- a/src/proc/cpu-info.c +++ b/src/proc/cpu-info.c @@ -18,10 +18,10 @@ #include +#include #include "core/log.h" #include "core/devices.h" -#include "shared/dbus.h" #include "core/common.h" #define METHOD_GET_REVISION "GetRevision" diff --git a/src/shared/CMakeLists.txt b/src/shared/CMakeLists.txt index c274d9c..2ad9dc1 100644 --- a/src/shared/CMakeLists.txt +++ b/src/shared/CMakeLists.txt @@ -1,7 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.6) SET(SHARED_SRCS - dbus.c deviced-systemd.c plugin.c ) diff --git a/src/shared/dbus.c b/src/shared/dbus.c deleted file mode 100644 index 276b074..0000000 --- a/src/shared/dbus.c +++ /dev/null @@ -1,2684 +0,0 @@ -/* - * deviced - * - * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include -#include -#include -#include -#include - -#include "common.h" -#include "log.h" -#include "dbus.h" - -/* 10 seconds */ -#define DBUS_REPLY_TIMEOUT (10000) - -int check_systemd_active(void) -{ - int ret = FALSE; - GVariant *msg = NULL; - GVariant *var = NULL; - char *state; - - _I("%s %s", "org.freedesktop.systemd1.Unit", "ActiveState"); - - msg = dbus_handle_method_sync_with_reply_var("org.freedesktop.systemd1", - "/org/freedesktop/systemd1/unit/default_2etarget", - "org.freedesktop.DBus.Properties", - "Get", - g_variant_new("(ss)", "org.freedesktop.systemd1.Unit", "ActiveState")); - if (!msg) - return -EBADMSG; - - if (!dh_get_param_from_var(msg, "(v)", &var)) { - _E("reply is not variant type"); - ret = -EBADMSG; - goto out; - } - if (!dh_get_param_from_var(var, "(s)", &state)) { - _E("variant doesn't have string (%s)", g_variant_get_type_string(var)); - ret = -EBADMSG; - goto out; - } - - if (strncmp(state, "active", 6) == 0) - ret = TRUE; - - g_free(state); -out: - if (var) - g_variant_unref(var); - if (msg) - g_variant_unref(msg); - - return ret; -} - -static GBusType g_default_bus_type = G_BUS_TYPE_SYSTEM; -pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER; - -void dbus_handle_set_default_bus_type(GBusType bus_type) -{ - if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) - return ; - - pthread_mutex_lock(&g_mutex); - g_default_bus_type = bus_type; - pthread_mutex_unlock(&g_mutex); -} - -GBusType dbus_handle_get_default_bus_type(void) -{ - GBusType type; - - pthread_mutex_lock(&g_mutex); - type = g_default_bus_type; - pthread_mutex_unlock(&g_mutex); - - return type; -} - -typedef struct { - const char *bus_name; - guint id; -} dbus_name; - -/* basic information */ -typedef struct { - GDBusConnection *conn; - GBusType bus_type; - gboolean priv; - GList *list_names; /* dbus_name */ - GList *list_object; /* dbus_object_handle_s */ - pthread_mutex_t mutex; -} dbus_handle_s; - -/* path + interfaces */ -typedef struct { - dbus_handle_s *dh; /* dbus handle */ - const char *path; /* object path */ - GList *list_ifaces; /* dbus_interface_s */ -} dbus_object_handle_s; - -typedef struct { - dbus_object_handle_s *oh; /* object handle */ - const char *name; /* interface name */ - GList *list_methods; /* const dbus_method_s */ - guint reg_id; - int modified; -} dbus_interface_s; - -#define get_dh_from_oh(oh) ((dbus_object_handle_s*)oh)->dh - -/* global shared bus : system, session */ -static dbus_handle_s g_dh[2]; - -static dbus_handle_s *_dbus_handle_get_connection(GBusType bus_type); - -dbus_handle_s * _dbus_handle_get_default_connection(void) -{ - return _dbus_handle_get_connection(dbus_handle_get_default_bus_type()); -} - -#define dbus_handle_lock(handle) do {\ - assert(handle);\ - pthread_mutex_lock(&((handle)->mutex));\ -} while (0); - -#define dbus_handle_unlock(handle) do {\ - assert(handle);\ - pthread_mutex_unlock(&(handle)->mutex);\ -} while (0); - -#define dcl_dbus_handle() dbus_handle_s *dh = (dbus_handle_s *)handle; -#define dcl_dbus_handle_null_check() dbus_handle_s *dh = (dbus_handle_s *)handle;\ - if (!dh) {\ - _E("dbus handle is null\n");\ - return 0;\ - } - -dbus_object_handle_s * _dbus_handle_lookup_object(GList *list_obj, const char *obj_path); -dbus_interface_s * _dbus_handle_lookup_interface(GList *list_iface, const char *iface_name); -dbus_method_s * _dbus_handle_lookup_method(GList *list_methods, const char *method_name); -static GVariant* _append_variant(const char *signature, const char *param[]); - -dbus_interface_s *_iface_u_to_s(const dbus_interface_u *iface_u) -{ - dbus_interface_s *iface = NULL; - - if (!iface_u || !iface_u->methods) { - _E("param is null"); - return NULL; - } - - iface = (dbus_interface_s *)calloc(1, sizeof(dbus_interface_s)); - if (!iface) { - _E("failed to calloc"); - return NULL; - } - - iface->name = iface_u->name; - iface->modified = TRUE; - - for (int i = 0 ; i < iface_u->nr_methods; ++i) { - //_D("attached %s:%p", iface_u->methods[i].member, iface_u->methods[i].func); - iface->list_methods = g_list_prepend(iface->list_methods, (void*)(iface_u->methods + i)); - } - - return iface; -} - -static GDBusConnection * _get_bus(GBusType bus_type) -{ - GDBusConnection *conn = NULL; - GError *err = NULL; - - if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) { - _E("Wrong bus_type %d", bus_type); - return NULL; - } - - conn = g_bus_get_sync(bus_type, NULL, &err); - if (!conn || err) { - _E("failed to get bus:type:%d, %s\n", bus_type, err->message); - g_error_free(err); - return NULL; - } - - return conn; -} - -static GDBusConnection * _get_bus_private(GBusType bus_type) -{ - GError *err = NULL; - GDBusConnection *conn = NULL; - const char * address; - - if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) { - _E("Wrong bus_type %d", bus_type); - return NULL; - } - - address = g_dbus_address_get_for_bus_sync(bus_type, NULL, &err); - if (!address || err) { - _E("failed to get bus address\n"); - g_error_free(err); - return NULL; - } - - conn = g_dbus_connection_new_for_address_sync(address, - (GDBusConnectionFlags) (G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT | - G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION), - NULL, /* GDBusAuthObserver */ - NULL, - &err); - if (!conn || err) { - _E("failed to get private bus\n"); - g_error_free(err); - return NULL; - } - - return conn; -} - -/* ref cout is 1 */ -static dbus_handle_s *_dbus_handle_get_connection(GBusType bus_type) -{ - int ibus = bus_type - 1; - dbus_handle_s *dh = NULL; - - if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) { - _E("Unknown bus type %d", bus_type); - return NULL; - } - dh = &g_dh[ibus]; - - dbus_handle_lock(dh); - - if (!dh->conn) { - dh->conn = _get_bus(bus_type); - dh->priv = FALSE; - dh->bus_type = bus_type; - if (!dh->conn) - dh = NULL; - } - - dbus_handle_unlock(dh); - - return dh; -} - -/* ref cout is 1 */ -static dbus_handle_s *_dbus_handle_get_connection_private(GBusType bus_type) -{ - dbus_handle_s * dh; - - if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) { - _E("Unknown bus type %d", bus_type); - return NULL; - } - - dh = (dbus_handle_s *)calloc(1, sizeof(dbus_handle_s)); - if (!dh) { - _E("failed to allocate memory for dbus handle"); - return NULL; - } - - dbus_handle_lock(dh); - - if (!dh->conn) { - dh->conn = _get_bus_private(bus_type); - dh->bus_type = bus_type; - if (!dh->conn) - goto err; - } - - dbus_handle_unlock(dh); - - return dh; -err: - if (dh) { - dbus_handle_unlock(dh); - free(dh); - } - return NULL; -} - -dbus_handle_h dbus_handle_get_connection(GBusType bus_type, gboolean priv) -{ - dbus_handle_s *dh = NULL; - - if (bus_type != G_BUS_TYPE_SYSTEM && bus_type != G_BUS_TYPE_SESSION) { - _E("Wrong bus_type %d\n", bus_type); - return dh; - } - - /* private */ - if (priv) - dh = _dbus_handle_get_connection_private(bus_type); - /* shared */ - else - dh = _dbus_handle_get_connection(bus_type); - - return dh; -} - -static void _dbus_handle_add_bus_name(dbus_handle_s *handle, const char *name, guint id) -{ - dbus_name *dn = NULL; - int locked = 0; - - if (!handle || !name || !id) - return ; - - dn = (dbus_name*)calloc(1, sizeof(dbus_name)); - if (!dn) { - _E("failed to calloc"); - assert(0); - } - dn->bus_name = name; - dn->id = id; - - // todo : delete lock ? - locked = pthread_mutex_trylock(&handle->mutex); - if (locked != 0 && locked != EBUSY) { - _E("failed to lock %d\n", locked); - assert(0); - } - - handle->list_names = g_list_prepend(handle->list_names, dn); - - // todo : delete lock ? - if (locked != EBUSY) - dbus_handle_unlock(handle); -} - -static gint _compare_dbus_name(gconstpointer a, gconstpointer b) -{ - const char *bus_name = ((dbus_name *)a)->bus_name; - if (!bus_name || !b) - return -1; - return strcmp(bus_name, (const char *)b); -} - -dbus_name * _dbus_handle_lookup_dbus_name(GList *list_name, const char *bus_name) -{ - if (!list_name || !bus_name) - return NULL; - - GList *item = g_list_find_custom(list_name, bus_name, _compare_dbus_name); - if (!item) - return NULL; - - return (dbus_name *)item->data; -} - -#define dh_to_ds(x) ((dbus_handle_s*)x) - -/* remove dbus_name from dbus handle */ -static void _dbus_handle_remove_bus_name(dbus_handle_s *handle, const char *bus_name) -{ - dcl_dbus_handle(); - dbus_name *dn = NULL; - - if (!bus_name) { - _E("wrong bus_name %s", bus_name); - return ; - } - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return ; - } - } - - dbus_handle_lock(dh); - dn = _dbus_handle_lookup_dbus_name(dh->list_names, bus_name); - if (!dn) { - _E("failed to find dbus name %s", bus_name); - goto out; - } - dh->list_names = g_list_remove(dh->list_names, dn); - free(dn); -out: - dbus_handle_unlock(dh); -} - -extern void booting_done(void); - -/* default handler */ -static void _name_acquired(GDBusConnection *connection, const gchar *name, gpointer user_data) -{ - dbus_handle_s *dh = (dbus_handle_s *)user_data; - - _D("name %s", name); - - if (!dh) { - _E("%s:%d:dbus handle is null\n", __func__, __LINE__); - return ; - } - - // todo: add bus name? - //dh->bus_name = name; -} - -/* default handler */ -static void _name_lost(GDBusConnection *connection, const gchar *name, gpointer user_data) -{ - _E("%s:%d:%s\n", __func__, __LINE__, name); - dbus_handle_s *dh = (dbus_handle_s *)user_data; - if (!dh) { - _E("%s:%d:dbus handle is null\n", __func__, __LINE__); - return ; - } - _dbus_handle_remove_bus_name(dh, name); -} - -int dbus_handle_request_bus_name(dbus_handle_h handle, - const char *bus_name, - GBusNameAcquiredCallback acquired_handler, - GBusNameLostCallback lost_handler) -{ - dcl_dbus_handle(); - int id = -1; - GList *item = NULL; - - if (!bus_name) { - _E("bus_name is NULL"); - return -1; - } - - /* get shared connection */ - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - } - - dbus_handle_lock(dh); - if (!dh->conn) { - _E("failed to register name: connection is null\n"); - goto out; - } - - /* todo : search name on connection */ - item = g_list_find_custom(dh->list_names, bus_name, _compare_dbus_name); - if (item) { - id = ((dbus_name*)(item->data))->id; - _E("name already exist:%u", id); - goto out; - } - - id = g_bus_own_name_on_connection(dh->conn, - bus_name, - G_BUS_NAME_OWNER_FLAGS_NONE, - acquired_handler ? acquired_handler : _name_acquired, - lost_handler ? lost_handler : _name_lost, - dh, - NULL); - if (!id) { - _E("failed to own name:%s\n", bus_name); - goto out; - } - - _dbus_handle_add_bus_name(dh, bus_name, id); - -out: - dbus_handle_unlock(dh); - return id; -} - -/* !! _name_lost handler callback is disabled by g_bus_unown_name : ubuntu */ -int dbus_handle_release_bus_name(dbus_handle_h handle, const char *bus_name) -{ - dcl_dbus_handle(); - dbus_name *dn = NULL; - - if (!bus_name) { - _E("Wrong bus name"); - return -1; - } - - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - } - - dn = _dbus_handle_lookup_dbus_name(dh->list_names, bus_name); - if (!dn) { - _E("failed to find bus_name %s on dbus handle", bus_name); - return -1; - } - - _E("unown name %d", dn->id); - /* _name_lost handler is disabled by g_bus_unown_name : ubuntu */ - g_bus_unown_name(dn->id); - - dbus_handle_lock(dh); - dh->list_names = g_list_remove(dh->list_names, dn); - free(dn); - dbus_handle_unlock(dh); - - return 0; -} - -int dbus_handle_free_connection(dbus_handle_h handle) -{ - dcl_dbus_handle(); - dbus_handle_s *pdh = NULL; - GError *err = NULL; - GList *item = NULL; - - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - } - - if (!dh->conn) { - _E("connection is NULL"); - return 0; - } - - pdh = dh; - - /* disable dbus handler */ - dbus_handle_lock(dh); - if (!pdh->conn) { - _E("conn is null"); - free(pdh); - return 0; - } - - /* flush everything */ - if (!g_dbus_connection_flush_sync(pdh->conn, NULL, &err)) { - _E("failed to flush %s\n", err->message); - g_error_free(err); - err = NULL; - } - - _D("list_names %u", g_list_length(pdh->list_names)); - - /* unown every well-knwon name */ - if (pdh->list_names) { - dbus_name *dn = NULL; - for (item = g_list_first(pdh->list_names); item != NULL; item = g_list_next(item)) { - dn = (dbus_name *)item->data; - if (!dn) - continue; - - /* _name_lost handler is disabled by g_bus_unown_name : ubuntu */ - _D("unown name id : %u", dn->id); - g_bus_unown_name(dn->id); - free(dn); - } - g_list_free(pdh->list_names); - pdh->list_names = NULL; - } - - _D("list_object %u", g_list_length(pdh->list_object)); - - /* unregister every object */ - if (pdh->list_object) { - dbus_object_handle_s * oh = NULL; - //g_list_foreach(pdh->list_object, [] (gpointer data, gpointer user_data) {}, NULL); - for (item = g_list_first(pdh->list_object); item != NULL; item = g_list_next(item)) { - oh = (dbus_object_handle_s *)item->data; - if (!oh || !oh->list_ifaces) - continue; - - _D("delete object path %s", oh->path); - - /* unregister every interface, method handles */ - for (GList *iface = g_list_first(oh->list_ifaces); iface != NULL; iface = g_list_next(iface)) { - dbus_interface_s *ih = (dbus_interface_s *)iface->data; - if (!ih) - continue; - - _D("delete object iface %s", ih->name); - - if (ih->reg_id) - g_dbus_connection_unregister_object(pdh->conn, ih->reg_id); - } - } - } - - /* close connection */ - if (pdh->priv) { - _E("close private connection\n"); - - if (!g_dbus_connection_close_sync(pdh->conn, NULL, &err)) { - _E("Error closing connection %s\n", err->message); - g_error_free(err); - err = NULL; - } - } - - /* _free_func_object callback free the data */ - //assert(g_list_length(pdh->list_names) == 0); - //assert(g_list_length(pdh->list_object) == 0); - - g_object_unref(pdh->conn); - - dbus_handle_unlock(dh); - - if (dh->priv) - free(dh); - - return 0; - - // todo: signal ? -} - -#define buf_cal_free_space(size, nwrite) ((size - nwrite - 1) > 0 ? (size - nwrite - 1) : 0) -#define buf_block_size 8192 - -#define buf_check_space_realloc(buf, nwrite, buf_len) do {\ - if ((nwrite >= buf_len - 1024)) {\ - if (buf_len >= buf_block_size * 10) {\ - _E("buf is too big to allocate. %d", buf_len);\ - } else {\ - _E("buf_check_space_realloc");\ - char *tmp = NULL;\ - buf_len += buf_block_size;\ - tmp = (char *)realloc(buf, buf_len);\ - if (!tmp) {\ - _E("failed to realloc");\ - } else\ - buf = tmp;\ - } \ - } \ -} while (0); - -/* cal index of end of brace */ -static int _check_brace(const char * expr) -{ - int len = 0; - char qu[128]; - int qucnt = 0; - - if (!expr) - return -1; - - len = strlen(expr); - - if (expr[0] != '(' && expr[0] != '{') - return -1; - - for (int i = 0 ; i < len; ++i) { - - if (expr[i] == '(' || expr[i] == '{') { - qu[qucnt++] = expr[i]; - if (qucnt >= sizeof(qu)) { - _E("queue is too large. %s", expr); - return -1; - } - continue; - } - - if (expr[i] == ')' || expr[i] == '}') { - char ch; - - if (qucnt > 0) - ch = qu[qucnt-1]; - else - return -1; - - if (expr[i] == ')') { - if (ch == '(') { - --qucnt; - } else - return -1; - } else if (expr[i] == '}') { - if (ch == '{') { - --qucnt; - } else - return -1; - } else - return -1; - - if (qucnt == 0) { - return i + 1; - } - } - } - - return -1; -} - -/* -in : interface_s -out : xml format -*/ -static int _get_xml_from_interfaces(char **xml, const dbus_interface_s *interfaces) -{ - int nwrite = 0; - int len_args; - char *buf = NULL; - const dbus_method_s *pmethod; - int buf_len = buf_block_size; - - if (!interfaces) { - _E("interfaces is null"); - return -1; - } - - // todo : check dbus naming rule for interface name. ? - if (!interfaces->name) { - _E("wrong interface name"); - return -1; - } - if (!interfaces->list_methods) { - _E("no methods"); - return -1; - } - - buf = (char *)malloc(buf_len); - if (!buf) { - _E("buf is null. not enough memory\n"); - return -1; - } - - nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), """\n""\t""""\n", interfaces->name); - - /* members */ - for (GList *item = g_list_first(interfaces->list_methods); item != NULL; item = g_list_next(item)) { - pmethod = (const dbus_method_s *)item->data; - if (!pmethod) - continue; - - /* check free space of buf */ - buf_check_space_realloc(buf, nwrite, buf_len); - - if (pmethod->signature_in == NULL && pmethod->signature_out == NULL) { - nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t""""\n", pmethod->member); - continue; - } - - /* */ - nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t""""\n", pmethod->member); - - /* in args */ - len_args = pmethod->signature_in ? strlen(pmethod->signature_in) : 0; - for (int m = 0; m < len_args; ++m) { - // todo - // array a(), as, ay ? - if (pmethod->signature_in[m] == 'a') { - int ei; //end index - ei = _check_brace(pmethod->signature_in + m + 1); - if (ei > 0) { - char tmp[128] = {0,}; - strncpy(tmp, pmethod->signature_in + m, ei + 1); - nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t\t""""\n", tmp, m); - m += ei; - continue; - } else { - nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t\t""""\n", pmethod->signature_in[m], pmethod->signature_in[m+1], m); - m += 1; - continue; - } - } - nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t\t""""\n", pmethod->signature_in[m], m); - } - - /* out args */ - len_args = pmethod->signature_out ? strlen(pmethod->signature_out) : 0; - for (int m = 0; m < len_args; ++m) { - // array - // todo: container type - if (pmethod->signature_out[m] == 'a') { - int ei; //end index - ei = _check_brace(pmethod->signature_out + m + 1); - if (ei > 0) { - char tmp[128] = {0,}; - strncpy(tmp, pmethod->signature_out + m, ei + 1); - nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t\t""""\n", tmp, m); - m += ei; - continue; - } else { - nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t\t""""\n", pmethod->signature_out[m], pmethod->signature_out[m+1], m); - m += 1; - continue; - } - } - nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t\t""""\n", pmethod->signature_out[m], m); - } - - /* */ - nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t\t""""\n"); - } - - nwrite += snprintf(buf + nwrite, buf_cal_free_space(buf_len, nwrite), "\t""""\n"""""); - - *xml = buf; - - /* todo: delete log */ -#if 0 - if (nwrite <= 512) - _E("%s", buf); - else - _E("%s", buf + nwrite - 512); -#endif - return 0; -} - -static gint _compare_dbus_object(gconstpointer a, gconstpointer b) -{ - dbus_object_handle_s * pa = (dbus_object_handle_s *)a; - if (!pa->path || !((const char*)b)) - return -1; - return strcmp(pa->path, (const char*)b); -} - -static gint _compare_dbus_interface(gconstpointer a, gconstpointer b) -{ - dbus_interface_s * pa = (dbus_interface_s *)a; - if (!pa->name || !((const char*)b)) - return -1; - return strcmp(pa->name, (const char*)b); -} - -static gint _compare_dbus_interface_by_id(gconstpointer a, gconstpointer b) -{ - dbus_interface_s * pa = (dbus_interface_s *)a; - if (!pa->reg_id || !((guint*)b)) - return -1; - return !(pa->reg_id == *((guint*)b)); -} - -static gint _compare_dbus_method(gconstpointer a, gconstpointer b) -{ - dbus_method_s *pa = (dbus_method_s*)a; - if (!pa->member || !((const char*)b)) - return -1; - return strcmp(pa->member, (const char*)b); -} - -dbus_object_handle_s * _dbus_handle_lookup_object(GList *list_obj, const char *obj_path) -{ - if (!list_obj || !obj_path) - return NULL; - - GList *item = g_list_find_custom(list_obj, obj_path, _compare_dbus_object); - if (!item) - return NULL; - - return (dbus_object_handle_s *)item->data; -} - -dbus_interface_s * _dbus_handle_lookup_interface(GList *list_iface, const char *iface_name) -{ - if (!list_iface || !iface_name) - return NULL; - - GList *item = g_list_find_custom(list_iface, iface_name, _compare_dbus_interface); - if (!item) - return NULL; - - return (dbus_interface_s *)item->data; -} - -dbus_interface_s * _dbus_handle_lookup_interface_by_id(GList *list_iface, guint id) -{ - if (!list_iface || !id) - return NULL; - - GList *item = g_list_find_custom(list_iface, &id, _compare_dbus_interface_by_id); - if (!item) - return NULL; - - return (dbus_interface_s *)item->data; -} - -dbus_method_s * _dbus_handle_lookup_method(GList *list_methods, const char *method_name) -{ - if (!list_methods || !method_name) - return NULL; - - GList *item = g_list_find_custom(list_methods, method_name, _compare_dbus_method); - if (!item) - return NULL; - - return (dbus_method_s *)item->data; -} - -static void _free_func_object(gpointer data) -{ - dbus_interface_s *ih = (dbus_interface_s *)data; - dbus_object_handle_s *oh = NULL; - - if (!ih) { - _E("interface handle is null"); - assert(0); // something wrong - return ; - } - - _E("unregister interface %s", ih->name); - - /* just free list, not data(static dbus_method_s) */ - g_list_free(ih->list_methods); - - oh = ih->oh; - if (!oh) { - _E("object handle is null"); - assert(0); // something wrong - return ; - } - - /* remove ih from list_ifaces */ - oh->list_ifaces = g_list_remove(oh->list_ifaces, ih); - - /* interface_s is copy of interface_u */ - free(ih); - - /* remove oh from list_object */ - if (!oh->list_ifaces) { - oh->dh->list_object = g_list_remove(oh->dh->list_object, oh); - free(oh); - } -} - -static int _dbus_handle_attach_object(dbus_handle_s *dh, const char *obj_path, dbus_interface_s *iface) -{ - dbus_object_handle_s *oh = NULL; - - if (!dh || !obj_path || !iface) { - _E("failed to attache object. wrong parameter"); - return -1; - } - - /* find object handle */ - if (dh->list_object) - oh = _dbus_handle_lookup_object(dh->list_object, obj_path); - - if (!oh) { - oh = (dbus_object_handle_s*)calloc(1, sizeof(dbus_object_handle_s)); - if (!oh) { - _E("failed to calloc"); - return -1; - } - oh->dh = dh; - oh->path = obj_path; - - /* attach object */ - dh->list_object = g_list_prepend(dh->list_object, oh); - } - - iface->oh = oh; - /* attach interface */ - oh->list_ifaces = g_list_prepend(oh->list_ifaces, iface); - - return 0; -} - -/* -_method_call_handler - -libgio verify path and interface of incoming message. ---> just check method name. - -# parameters - member of invocation struct -every parameters of this function are member of GDBusMethodInvocation *invocation. -There are no reason to using g_dbus_method_invocation_get_* apis to get inforamtion from message. -just use params - sender, path, iface, name and param. - - -# user defined handler # - -1. synchronous handling - 1) with return value - handler() { - return g_variant_new("(i)", ret); - } - - 2) without return value - handler() { - return dbus_handle_new_g_variant_tuple(); // g_variant_new_tuple(NULL, 0) - } - -2. asynchronous handling - handler MUST call 'g_dbus_method_invocation_return_value' itself. otherwise, LEAK !! - - handler() { - return NULL; - } - - # if handler return NULL, assume asynchronous handling. do nothing. - - thread() { - do something; - - 1) with return value - g_dbus_method_invocation_return_value(invocation, g_variant_new("(i)", ret)); - - 2) without return value - g_dbus_method_invocation_return_value(invocation, NULL); - } - - -*/ -static void _method_call_handler(GDBusConnection *conn, - const gchar *sender, - const gchar *path, - const gchar *iface, - const gchar *name, - GVariant *param, - GDBusMethodInvocation *invocation, - gpointer user_data) -{ - dbus_interface_s *iface_s = (dbus_interface_s *)user_data; - const dbus_method_s *methods; - GVariant *result = NULL; - - /* todo: ghash ? */ - methods = _dbus_handle_lookup_method(iface_s->list_methods, name); - if (methods) { - result = methods->func(conn, sender, path, iface, name, param, invocation, get_dh_from_oh(iface_s->oh)); - - /* async, maybe they will reply...maybe.. */ - if (!result) { - return ; - } - } else { - _E("no methods"); - } - - g_dbus_method_invocation_return_value(invocation, result); -} - -static GDBusInterfaceVTable path_vtable = {_method_call_handler}; - - -/* -before register object, attach object into dbus handle -_dbus_handle_attach_object() -*/ -static int _dbus_handle_register_dbus_object(dbus_handle_h handle, const char *obj_path, dbus_interface_s *iface) -{ - dcl_dbus_handle(); - int ret = 0; - char *buf = NULL; - GError *err = NULL; - GDBusNodeInfo * nodeinfo = NULL; - GDBusInterfaceInfo *ifaceinfo = NULL; - - if (!obj_path || !iface) { - _E("wrong parameter\n"); - return -1; - } - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - } - if (!dh->conn) { - _E("connection is null\n"); - return -1; - } - - ret = _get_xml_from_interfaces(&buf, iface); - if (ret < 0) { - _E("failed to make xml format"); - goto err; - } - - /* todo: delete this */ -#if 0 - if (strlen(buf) <= 512) { - _E("%s", buf); - } else { - _E("%s", buf + strlen(buf) - 512); - } -#endif - - nodeinfo = g_dbus_node_info_new_for_xml(buf, &err); - if (!nodeinfo || err) { - _E("failed to make introspection data:err:%s:xml:%s\n", err->message, buf); - ret = -1; - goto err; - } - - ifaceinfo = g_dbus_node_info_lookup_interface(nodeinfo, iface->name); - if (!ifaceinfo) { - _E("failed to g_dbus_node_info_lookup_interface"); - ret = -1; - goto err; - } - - /* - path own single interface - if interface is already registered, then failed. - g_dbus_connection_register_object ref(ifaceinfo) now, unref if object is unregistered - */ - ret = g_dbus_connection_register_object(dh->conn, - obj_path, - ifaceinfo/*ref 2*/, - &path_vtable, - (void*)iface, - _free_func_object, - &err); - if (err) { - _E("failed to register object:err:%s:\n", err->message); - ret = -1; - goto err; - } - - iface->reg_id = ret; - iface->modified = FALSE; - -err: - /* todo: detach object */ - //_dbus_handle_detach_object(dh, obj_path, iface); - /* attach interface before register object */ - /*ret = _dbus_handle_detach_object(dh, obj_path, iface); - if (ret < 0) { - _E("failed to attach object"); - goto err; - }*/ - - if (nodeinfo) - g_dbus_node_info_unref(nodeinfo); - if (buf) - free(buf); - if (err) - g_error_free(err); - - return ret; -} - -/* -register same interface at once - -if interface is constructed by multiple methods, -also it is not possible to make methods struct at once, - -use dbus_handle_add_dbus_object(), dbus_handle_register_dbus_object_all(). - -return reg_id -*/ -int dbus_handle_register_dbus_object(dbus_handle_h handle, const char *obj_path, const dbus_interface_u *iface_u) -{ - dcl_dbus_handle(); - int ret = 0; - dbus_interface_s *iface = NULL; - - if (!obj_path || !iface_u) { - _E("wrong parameter\n"); - return -1; - } - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - } - if (!dh->conn) { - _E("connection is null\n"); - return -1; - } - - /* check registered interface */ - if (dh->list_object) { - dbus_object_handle_s *oh = _dbus_handle_lookup_object(dh->list_object, obj_path); - if (oh) { - dbus_interface_s *ih = _dbus_handle_lookup_interface(oh->list_ifaces, iface_u->name); - if (ih) { - _E("path %s, interface %s already registered", obj_path, iface_u->name); - return -1; - } - } - } - - iface = _iface_u_to_s(iface_u); - if (!iface) { - _E("failed to _iface_u_to_s"); - return -1; - } - - /* attach interface before register object */ - ret = _dbus_handle_attach_object(dh, obj_path, iface); - if (ret < 0) { - _E("failed to attach object"); - goto err; - } - - ret = _dbus_handle_register_dbus_object(dh, obj_path, iface); - if (ret <= 0) { - _E("failed to register dbus object%d", ret); - goto err; - } -err: - return ret; -} - -int dbus_handle_unregister_dbus_object(dbus_handle_h handle, const char *obj_path) -{ - dcl_dbus_handle(); - dbus_object_handle_s *oh = NULL; - int ret = 0; - - if (!obj_path) { - return -1; - } - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - } - if (!dh->list_object) { - _E("list_object is empty"); - return 0; - } - - oh = _dbus_handle_lookup_object(dh->list_object, obj_path); - if (!oh) { - _E("no object with name %s", obj_path); - return -1; - } - - /* unregister every interface of object*/ - for (GList *item = g_list_first(oh->list_ifaces); item != NULL; item = g_list_next(item)) { - dbus_interface_s *ih = item->data; - if (!ih) { - _E("this is error"); - assert(0); - } - - /* remove ih from list_ifaces */ - if (!ih->reg_id) { - item = g_list_previous(item); - - /* remove and free link */ - oh->list_ifaces = g_list_remove(oh->list_ifaces, ih); - - /* free list_methods */ - g_list_free(ih->list_methods); - - /* free data */ - free(ih); - continue; - } - - /* unregister object by id */ - ret = g_dbus_connection_unregister_object(dh->conn, ih->reg_id); - if (!ret) - _E("failed to unregister object %s, interface %s, regid %d", oh->path, ih->name, ih->reg_id); - } - - return 0; -} - -/* -add object temporarily. -dbus_handle_register_dbus_object_all register every objects on connection. - -return registered method count -*/ -int dbus_handle_add_dbus_object(dbus_handle_h handle, const char *obj_path, const dbus_interface_u *iface_u) -{ - dcl_dbus_handle(); - dbus_object_handle_s *oh = NULL; - dbus_interface_s *ih = NULL; - int cnt; - - if (!obj_path || !iface_u) { - _E("wrong parameter path %s, iface_u %p\n", obj_path, iface_u); - return -1; - } - if (iface_u && (!iface_u->name || !iface_u->methods)) { - _E("wrong parameter path %s, iface_u %p\n", obj_path, iface_u); - return -1; - } - - cnt = iface_u->nr_methods; - - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - } - - if (!dh->conn) { - _E("failed to register method. connection is null\n"); - return -1; - } - - /* if there are no object list, just add */ - if (!dh->list_object) { - if (_dbus_handle_attach_object(dh, obj_path, _iface_u_to_s(iface_u))) { - _E("failed to attach object"); - return -1; - } - goto out; - } - - oh = _dbus_handle_lookup_object(dh->list_object, obj_path); - /* if there are no matched object, just add */ - if (!oh) { - if (_dbus_handle_attach_object(dh, obj_path, _iface_u_to_s(iface_u))) { - _E("failed to attach object"); - return -1; - } - goto out; - } - - /* this is an error, interface must have one or more item ? */ - if (!oh->list_ifaces) { - _E("error. list_ifaces is null\n"); - assert(0); - goto out; - } - - ih = _dbus_handle_lookup_interface(oh->list_ifaces, iface_u->name); - /* if there are no matched interface, just add */ - if (!ih) { - if (_dbus_handle_attach_object(dh, obj_path, _iface_u_to_s(iface_u))) { - _E("failed to attach object"); - return -1; - } - goto out; - } - - /* todo: - 1. unregister interface - 2. update interface and methods - 3. register interface - */ - if (ih->reg_id) { - _E("interface already registered, ignore new interface"); - return -1; - } - - /* attach new methods */ - cnt = 0; - for (int i = 0; i < iface_u->nr_methods; ++i) { - GList *item = g_list_find_custom(g_list_first(ih->list_methods), iface_u->methods[i].member, _compare_dbus_method); - if (!item) { - //_D("attached %s", iface_u->methods[i].member); - ih->list_methods = g_list_prepend(ih->list_methods, (void*)(iface_u->methods + i)); - ++cnt; - } - } - - if (cnt) - ih->modified = TRUE; - -out: - /*todo: delete debugging log */ - //if (dh && dh->list_object) - // _D("obj list len %d", g_list_length(dh->list_object)); - //if (oh && oh->list_ifaces) - // _D("iface list len %d", g_list_length(oh->list_ifaces)); - //if (ih && ih->list_methods) - // _D("method list len %d", g_list_length(ih->list_methods)); - - return cnt; -} - -int dbus_handle_register_dbus_object_all(dbus_handle_h handle) -{ - dcl_dbus_handle(); - dbus_object_handle_s *oh = NULL; - dbus_interface_s *ih = NULL; - int ret = 0; - - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - } - if (!dh->conn) { - _E("connection is null\n"); - return -1; - } - - if (!dh->list_object) { - _E("obj list is empty"); - return -1; - } - - /*if (dh && dh->list_object) - _D("obj list len %d", g_list_length(dh->list_object));*/ - - for (GList *item = g_list_first(dh->list_object); item != NULL; item = g_list_next(item)) { - oh = (dbus_object_handle_s *)item->data; - - if (!oh) { - _E("something wrong"); - assert(0); - } - if (!oh->list_ifaces) { - _E("path %s: list_ifaces are null", oh->path); - goto err; - } - - //_D("iface list len %d", g_list_length(oh->list_ifaces)); - - for (GList *li = g_list_first(oh->list_ifaces); li != NULL; li = g_list_next(li)) { - ih = (dbus_interface_s *)li->data; - - /* if there are no modification, goto next */ - if (!ih->modified) - continue; - - /* todo: if already registered interface, unregister first */ - - /*_E("interface %s:", ih->name); - if (ih && ih->list_methods) - _D("method list len %d", g_list_length(ih->list_methods));*/ - - ret = _dbus_handle_register_dbus_object(dh, oh->path, ih); - if (ret <= 0) - _E("failed to register dbus object%d", ret); - - } - } - return 0; -err: - - // todo: delete all updates - - return -1; -} - -static void _free_func_signal(gpointer data) -{ - //_D("free signal subscribe"); -} - -guint subscribe_dbus_signal(dbus_handle_h handle, const char *path, - const char *iface, const char *name, - GDBusSignalCallback cb, void *data, - destroy_notified free_func) -{ - dcl_dbus_handle(); - - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return 0; - } - } - - if (!dh->conn) { - _E("connection is null. check bus status"); - return 0; - } - return g_dbus_connection_signal_subscribe(dh->conn, NULL, iface, name, path, NULL, G_DBUS_SIGNAL_FLAGS_NONE, cb, data, _free_func_signal); -} - -void unsubscribe_dbus_signal(dbus_handle_h handle, guint id) -{ - dcl_dbus_handle(); - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return ; - } - } - - if (!dh->conn) { - _E("connection is null. check bus status"); - return ; - } - - g_dbus_connection_signal_unsubscribe(dh->conn, id); -} - -int _check_type_string_is_container(const char *signature) -{ - if (!signature) - return FALSE; - - switch (signature[0]) { - case 'a': - case 'm': - case 'r': - case '(': - case '{': - case 'v': - return TRUE; - default: - return FALSE; - } - - return TRUE; -} - -GVariant *dbus_handle_make_simple_array(const char *sig, int *param) -{ - GVariantBuilder *builder = NULL; - GVariant *var = NULL; - char format[256]; - int i = 0; - - builder = g_variant_builder_new(G_VARIANT_TYPE(sig)); - if (!builder) { - _E("failed to g_variant_builder_new"); - return NULL; - } - - while (param[i]) - g_variant_builder_add(builder, "i", param[i++]); - - snprintf(format, sizeof(format) - 1, "(%s)", sig); - var = g_variant_new(format, builder); - g_variant_builder_unref(builder); - return var; -} - -/* todo: looks like garbage... */ -static GVariant* _append_variant(const char *signature, const char *param[]) -{ - char *ch; - int i; - int pi; - int int_type; - gboolean bool_type; - unsigned long long int64_type; - GVariant *ret; - int len; - char container[255];// The maximum length of a signature is 255. - const char *sig = signature; - GVariantBuilder *builder = NULL; - - if (!signature || !param) - return 0; - - /* workaround for user fault "(i) != i" but we treat this as same signature */ - /* G_VARIANT_TYPE("si") return NULL */ - /* todo: actually user have to use correct signature */ - if (!_check_type_string_is_container(signature)) { - snprintf(container, sizeof(container) - 1, "(%s)", signature); - sig = container; - } - if (!g_variant_type_is_container(G_VARIANT_TYPE(sig))) { - _E("signature (%s) is not container type", signature); - } - - builder = g_variant_builder_new(G_VARIANT_TYPE(sig)); - len = strlen(sig); - pi = 0; - for (ch = (char *)sig, i = 0; i < len; ++i, ++ch) { - switch (*ch) { - case '(': - case ')': - continue; - case 'b': - bool_type = (atoi(param[pi++]) == 0 ? FALSE : TRUE); - g_variant_builder_add(builder, "b", bool_type); - break; - case 'i': - int_type = atoi(param[pi++]); - g_variant_builder_add(builder, "i", int_type); - break; - case 'u': - int_type = strtoul(param[pi++], NULL, 10); - g_variant_builder_add(builder, "u", int_type); - break; - case 't': - int64_type = atoll(param[pi++]); - g_variant_builder_add(builder, "t", int64_type); - break; - case 's': - g_variant_builder_add(builder, "s", param[pi++]); - break; - case 'a': - ++ch; - switch (*ch) { - case 'y': - g_variant_builder_add(builder, "^ay", param[pi++]); - ++i; - break; - default: - break; - } - break; - default: - break; - } - } - ret = g_variant_builder_end(builder); - g_variant_builder_clear(builder); - g_variant_builder_unref(builder); - - return ret; -} - -int dbus_handle_broadcast_dbus_signal(const char *path, - const char *iface, - const char *name, - const char *signature, - const char *param[]) -{ - dbus_handle_s *dh = NULL; - GError *err = NULL; - gboolean ret = 0; - GVariant *var = NULL; - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - - if (signature && param) - var = _append_variant(signature, param); - ret = g_dbus_connection_emit_signal(dh->conn, NULL, path, iface, name, var, &err); - if (err) { - _E("%d %s\n", ret, err ? err->message : NULL); - g_error_free(err); - } - - return ret; -} - -int dbus_handle_broadcast_dbus_signal_var(const char *path, - const char *iface, - const char *name, - GVariant *param) -{ - dbus_handle_s *dh = NULL; - GError *err = NULL; - gboolean ret = 0; - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - - ret = g_dbus_connection_emit_signal(dh->conn, NULL, path, iface, name, param, &err); - if (err) { - _E("%d %s\n", ret, err ? err->message : NULL); - g_error_free(err); - } - - return ret; -} - -GVariant *dbus_handle_method_sync_with_reply(const char *dest, - const char *path, - const char *iface, - const char *method, - const char *signature, - const char *param[]) -{ - GError *err = NULL; - GVariant * var = NULL; - GVariant * ret = NULL; - dbus_handle_s *dh = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return NULL; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return NULL; - } - - if (signature && param) - var = _append_variant(signature, param); - - ret = g_dbus_connection_call_sync(dh->conn, - dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, &err); - if (!ret || err) { - if (err) { - _E("failed to g_dbus_connection_call_sync:%s", err->message); - g_error_free(err); - } else { - _E("failed to g_dbus_connection_call_sync"); - g_variant_unref(var); - } - return NULL; - } - - return ret; -} - -GVariant *dbus_handle_method_sync_with_reply_var(const char *dest, - const char *path, - const char *iface, - const char *method, - GVariant *var) -{ - GError *err = NULL; - GVariant * ret = NULL; - dbus_handle_s *dh = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - if (var) - g_variant_unref(var); - return NULL; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - if (var) - g_variant_unref(var); - return NULL; - } - - ret = g_dbus_connection_call_sync(dh->conn, - dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, &err); - if (!ret || err) { - if (err) { - _E("failed to g_dbus_connection_call_sync:%s", err->message); - g_error_free(err); - } else { - _E("failed to g_dbus_connection_call_sync"); - } - return NULL; - } - - return ret; -} - -gint* dbus_handle_get_unix_fd_list(GDBusMethodInvocation *invocation, int *size) -{ - GUnixFDList *fd_list = NULL; - int length = 0; - - fd_list = g_dbus_message_get_unix_fd_list(g_dbus_method_invocation_get_message(invocation)); - - if (!fd_list) { - _E("failed to g_unix_fd_list_get_length: fd_list is null"); - return NULL; - } - - length = g_unix_fd_list_get_length(fd_list); - if (length == 0) { - _E("failed to g_unix_fd_list_get_length: list size is 0"); - return NULL; - } - if (size) - *size = length; - - return g_unix_fd_list_steal_fds(fd_list, NULL); -} - -GVariant *dbus_handle_method_with_unix_fd_list_sync_with_reply(const char *dest, - const char *path, - const char *iface, - const char *method, - const char *signature, - const char *param[], - int *in_fdlist, - int in_size, - int **out_fdlist, - int *out_size) -{ - GError *err = NULL; - GVariant * var = NULL; - GVariant * ret = NULL; - dbus_handle_s *dh = NULL; - GDBusProxy *proxy = NULL; - GUnixFDList *g_infdlist = NULL; - GUnixFDList *g_outfdlist = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return NULL; - } - if (in_fdlist && in_size == 0) { - _E("wrong in_fdlist is not null but in_size is 0"); - return NULL; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return NULL; - } - - if (signature && param) - var = _append_variant(signature, param); - - proxy = g_dbus_proxy_new_sync(dh->conn, G_DBUS_PROXY_FLAGS_NONE, NULL, dest, path, iface, NULL, &err); - if (!proxy) { - if (err) { - _E("failed to proxy_new_sync(%s)\n", err->message); - g_error_free(err); - } else { - _E("failed to proxy_new_sync\n"); - if (var) - g_variant_unref(var); - } - } - - /* append fd */ - if (in_fdlist) { - g_infdlist = g_unix_fd_list_new_from_array(in_fdlist, in_size); - if (!g_infdlist) { - _E("failed to g_unix_fd_list_new_from_array\n"); - goto out; - } - //g_infdlist = g_unix_fd_list_new(); - //if (g_unix_fd_list_append(g_infdlist, in_fdlist[0], &err) < 0) { - } - - ret = g_dbus_proxy_call_with_unix_fd_list_sync(proxy, method, var, G_DBUS_CALL_FLAGS_NONE, -1, - g_infdlist, &g_outfdlist, NULL, &err); - if (!ret || err) { - if (err) { - _E("failed to g_dbus_proxy_call_with_unix_fd_list_sync:%s", err->message); - g_error_free(err); - } else { - _E("failed to g_dbus_proxy_call_with_unix_fd_list_sync:"); - if (var) - g_variant_unref(var); - if (g_infdlist) - g_object_unref(g_infdlist); - } - goto out; - } - - /* fds to out array */ - if (g_outfdlist) { - *out_size = g_unix_fd_list_get_length(g_outfdlist); - if (*out_size == 0) - goto out; - - *out_fdlist = g_unix_fd_list_steal_fds(g_outfdlist, NULL); - } - -out: - if (g_outfdlist) - g_object_unref(g_outfdlist); - if (proxy) - g_object_unref(proxy); - - return ret; -} - -GVariant *dbus_handle_method_with_unix_fd_list_sync_with_reply_var(const char *dest, - const char *path, - const char *iface, - const char *method, - GVariant *param, - int *in_fdlist, - int in_size, - int **out_fdlist, - int *out_size) -{ - GError *err = NULL; - GVariant * ret = NULL; - dbus_handle_s *dh = NULL; - GDBusProxy *proxy = NULL; - GUnixFDList *g_infdlist = NULL; - GUnixFDList *g_outfdlist = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return NULL; - } - if (in_fdlist && in_size == 0) { - _E("wrong in_fdlist is not null but in_size is 0"); - return NULL; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return NULL; - } - - proxy = g_dbus_proxy_new_sync(dh->conn, G_DBUS_PROXY_FLAGS_NONE, NULL, dest, path, iface, NULL, &err); - if (!proxy) { - if (err) { - _E("failed to proxy_new_sync(%s)\n", err->message); - g_error_free(err); - } else { - _E("failed to proxy_new_sync\n"); - if (param) - g_variant_unref(param); - } - goto out; - } - - /* append fd */ - if (in_fdlist) { - g_infdlist = g_unix_fd_list_new_from_array(in_fdlist, in_size); - if (!g_infdlist) { - _E("failed to g_unix_fd_list_new_from_array\n"); - goto out; - } - //g_infdlist = g_unix_fd_list_new(); - //if (g_unix_fd_list_append(g_infdlist, in_fdlist[0], &err) < 0) { - } - - /* send message */ - ret = g_dbus_proxy_call_with_unix_fd_list_sync(proxy, method, param, G_DBUS_CALL_FLAGS_NONE, -1, - g_infdlist, &g_outfdlist, NULL, &err); - if (!ret || err) { - if (err) { - _E("failed to g_dbus_proxy_call_with_unix_fd_list_sync:%s", err->message); - g_error_free(err); - } else { - _E("failed to g_dbus_proxy_call_with_unix_fd_list_sync:"); - if (param) - g_variant_unref(param); - if (g_infdlist) - g_object_unref(g_infdlist); - } - goto out; - } - - /* copy fds to out array */ - if (g_outfdlist) { - *out_size = g_unix_fd_list_get_length(g_outfdlist); - if (*out_size == 0) - goto out; - *out_fdlist = g_unix_fd_list_steal_fds(g_outfdlist, NULL); - } -out: - if (g_outfdlist) - g_object_unref(g_outfdlist); - if (proxy) - g_object_unref(proxy); - return ret; -} - -int dbus_handle_method_sync(const char *dest, - const char *path, - const char *iface, - const char *method, - const char *signature, - const char *param[]) -{ - int result; - gboolean result_bool; - GVariant *reply = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - reply = dbus_handle_method_sync_with_reply(dest, path, iface, method, signature, param); - if (!reply) - return -ECOMM; - - if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0) { - g_variant_get(reply, "(i)", &result); - } else if (g_strcmp0("(b)", g_variant_get_type_string(reply)) == 0) { - g_variant_get(reply, "(b)", &result_bool); - result = (int)result_bool; - } else { - result = -ENOMSG; - } - - g_variant_unref(reply); - - return result; -} - -int dbus_handle_method_sync_var(const char *dest, - const char *path, - const char *iface, - const char *method, - GVariant *param) -{ - int result; - gboolean result_bool; - GVariant *reply = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - reply = dbus_handle_method_sync_with_reply_var(dest, path, iface, method, param); - if (!reply) - return -ECOMM; - - if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0) { - g_variant_get(reply, "(i)", &result); - } else if (g_strcmp0("(b)", g_variant_get_type_string(reply)) == 0) { - g_variant_get(reply, "(b)", &result_bool); - result = (int)result_bool; - } else { - result = -ENOMSG; - } - - g_variant_unref(reply); - - return result; -} - -int dbus_handle_method_sync_timeout(const char *dest, - const char *path, - const char *iface, - const char *method, - const char *signature, - const char *param[], - int timeout) -{ - dbus_handle_s *dh = NULL; - GError *err = NULL; - GVariant * var = NULL; - GVariant * reply = NULL; - int result = 0; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -EPERM; - } - - if (signature && param) - var = _append_variant(signature, param); - - reply = g_dbus_connection_call_sync(dh->conn, - dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, timeout, NULL, &err); - if (!reply || err) { - _E("failed to g_dbus_connection_call_sync:%s", err->message); - g_error_free(err); - return -1; - } - - if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0) - g_variant_get(reply, "(i)", &result); - else - result = -ENOMSG; - - g_variant_unref(reply); - - return result; -} - -int dbus_handle_method_sync_pairs(const char *dest, - const char *path, - const char *iface, - const char *method, - int num, - va_list args) -{ - GError *err = NULL; - GVariant * reply = NULL; - char *key, *value; - int ret = 0; - GVariant *var; - GVariantBuilder *builder; - dbus_handle_s *dh = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - - builder = g_variant_builder_new(G_VARIANT_TYPE("a{ss}")); - - for (int i = 0 ; i < num ; i = i + 2) { - key = va_arg(args, char *); - value = va_arg(args, char *); - _I("key(%s), value(%s)", key, value); - g_variant_builder_add(builder, "{ss}", key, value); - } - - var = g_variant_new("(a{ss})", builder); - g_variant_builder_unref(builder); - - reply = g_dbus_connection_call_sync(dh->conn, - dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, DBUS_REPLY_TIMEOUT, NULL, &err); - if (!reply || err) { - _E("failed to g_dbus_connection_call_sync"); - return -1; - } - - if (g_strcmp0("(i)", g_variant_get_type_string(reply)) == 0) - g_variant_get(reply, "(i)", &ret); - else - ret = -ENOMSG; - - g_variant_unref(reply); - - return ret; -} - -int dbus_handle_method_async_pairs(const char *dest, - const char *path, - const char *iface, - const char *method, - int num, - va_list args) -{ - char *key, *value; - GVariant *var; - GVariantBuilder *builder; - dbus_handle_s *dh = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - - // dict - builder = g_variant_builder_new(G_VARIANT_TYPE("a{ss}")); - - for (int i = 0 ; i < num ; i = i + 2) { - key = va_arg(args, char *); - value = va_arg(args, char *); - _I("key(%s), value(%s)", key, value); - g_variant_builder_add(builder, "{ss}", key, value); - } - - var = g_variant_new("(a{ss})", builder); - g_variant_builder_unref(builder); - - g_dbus_connection_call(dh->conn, dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, - NULL, - NULL); - - return 0; -} - -int dbus_handle_method_async(const char *dest, - const char *path, - const char *iface, - const char *method, - const char *signature, - const char *param[]) -{ - GVariant * var = NULL; - dbus_handle_s *dh = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - - if (signature && param) - var = _append_variant(signature, param); - - g_dbus_connection_call(dh->conn, dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, - NULL, - NULL); - - return 0; -} - -int dbus_handle_method_async_var(const char *dest, - const char *path, - const char *iface, - const char *method, - GVariant *param) -{ - dbus_handle_s *dh = NULL; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - - g_dbus_connection_call(dh->conn, dest, path, iface, method, - param, NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, - NULL, - NULL); - - return 0; -} - -/* callback should free gvariant */ -static void _cb_pending(GDBusConnection *conn, - GAsyncResult *res, - gpointer user_data) -{ - GVariant *reply = NULL; - GError *err = NULL; - pending_call_data *data = (pending_call_data *)user_data; - - reply = g_dbus_connection_call_finish(conn, res, &err); - if (!reply || err) { - if (err) { - _E("no message : [%s]", err->message); - g_error_free(err); - } else { - _E("no message"); - } - - if (data && data->func) - data->func(NULL, data->data, err); - goto out; - } - - if (data && data->func) - data->func(reply, data->data, err); -out: - if (data) - free(data); -} - -int dbus_handle_method_async_with_reply(const char *dest, - const char *path, - const char *iface, - const char *method, - const char *signature, - const char *param[], - dbus_pending_cb cb, - int timeout_msec, - void *data) -{ - dbus_handle_s *dh = NULL; - pending_call_data *pdata = NULL; - GVariant * var = NULL; - int ret = 0; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - if (timeout_msec < -1) { - _E("wrong timeout %d", timeout_msec); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -EPERM; - } - - if (signature && param) - var = _append_variant(signature, param); - - if (cb) { - pdata = (pending_call_data*)malloc(sizeof(pending_call_data)); - if (!pdata) { - ret = -ENOMEM; - goto err; - } - - pdata->func = cb; - pdata->data = data; - } - g_dbus_connection_call(dh->conn, dest, path, iface, method, - var, NULL, G_DBUS_CALL_FLAGS_NONE, timeout_msec, NULL, - (GAsyncReadyCallback)_cb_pending, - pdata); - - return ret; -err: - if (var) - g_variant_unref(var); - return ret; -} - -int dbus_handle_method_async_with_reply_var(const char *dest, - const char *path, - const char *iface, - const char *method, - GVariant *param, - dbus_pending_cb cb, - int timeout_msec, - void *data) -{ - dbus_handle_s *dh = NULL; - pending_call_data *pdata = NULL; - int ret = 0; - - if (!dest || !path || !iface || !method) { - _E("wrong parameters dest(%s) path(%s) iface(%s) method(%s)", dest, path, iface, method); - return -1; - } - - if (timeout_msec < -1) { - _E("wrong timeout %d", timeout_msec); - return -1; - } - - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -EPERM; - } - - if (cb) { - pdata = (pending_call_data*)malloc(sizeof(pending_call_data)); - if (!pdata) { - ret = -ENOMEM; - goto err; - } - - pdata->func = cb; - pdata->data = data; - } - g_dbus_connection_call(dh->conn, dest, path, iface, method, - param, NULL, G_DBUS_CALL_FLAGS_NONE, timeout_msec, NULL, - (GAsyncReadyCallback)_cb_pending, - pdata); - - return ret; -err: - if (param) - g_variant_unref(param); - return ret; -} - -int dbus_connection_get_sender_pid(GDBusConnection *conn, const char * sender) -{ - GError *err = NULL; - GVariant *vret = NULL; - pid_t pid = 0; - - if (!conn) { - _E("connection is null"); - return -1; - } - if (!sender) { - _E("sender is null"); - return -1; - } - - vret = g_dbus_connection_call_sync(conn, - "org.freedesktop.DBus", "/", "org.freedesktop.DBus", "GetConnectionUnixProcessID", - g_variant_new("(s)", sender), - NULL, - G_DBUS_CALL_FLAGS_NONE, - DBUS_REPLY_TIMEOUT, - NULL, - &err); - if (!vret || err) { - _E("failed to g_dbus_connection_call_sync:%s", err->message); - g_error_free(err); - return -1; - } - - g_variant_get(vret, "(u)", &pid); - g_variant_unref(vret); - - return pid; -} - -int dbus_handle_get_sender_pid(dbus_handle_h handle, const char * sender) -{ - dcl_dbus_handle(); - - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - } - if (!dh->conn) { - _E("wrong dbus handle. connection is null"); - assert(0); - return -1; - } - - return dbus_connection_get_sender_pid(dh->conn, sender); -} - -int dbus_handle_get_sender_credentials(dbus_handle_h handle, const char *name, GDBusCredentials *creds) -{ - dcl_dbus_handle(); - GVariant *vret = NULL; - GError *err = NULL; - GVariantIter *iter = NULL; - char * item; - GVariant *sub; - - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return -1; - } - } - vret = g_dbus_connection_call_sync(dh->conn, - DBUS_BUS_NAME, - DBUS_OBJECT_PATH, - DBUS_INTERFACE_NAME, - "GetConnectionCredentials", - g_variant_new("(s)", name), - NULL, - G_DBUS_CALL_FLAGS_NONE, - DBUS_REPLY_TIMEOUT, - NULL, - &err); - if (!vret || err) { - _E("failed to g_dbus_connection_call_sync:%s", err->message); - return -1; - } - - g_variant_get(vret, "(a{sv})", &iter); - - while (g_variant_iter_loop(iter, "{sv}", &item, &sub)) { - if (!g_strcmp0(item, "UnixUserID")) { - g_variant_get(sub, "u", &creds->uid); - //_D("UnixUserID %u", creds->uid); - } else if (!g_strcmp0(item, "ProcessID")) { - g_variant_get(sub, "u", &creds->pid); - //_D("ProcessID %u", creds->pid); - } else if (!g_strcmp0(item, "LinuxSecurityLabel")) { - g_variant_get(sub, "^ay", &creds->sec_label); - //_D("%s", creds->sec_label); - } - } - - if (iter) - g_variant_iter_free(iter); - if (vret) - g_variant_unref(vret); - - return 0; -} - -void _destroy_notify_watch_name(gpointer data) -{ - if (data) - free(data); -} - -int dbus_handle_watch_name(const char *name, - GBusNameAppearedCallback name_appeared_handler, - GBusNameVanishedCallback name_vanished_handler, - void *user_data) -{ - guint id = 0; - - if (!name) { - _E("wrong name name %s", name); - return -1; - } - if (!name_appeared_handler && !name_vanished_handler) { - _E("both function pointers are null"); - return -1; - } - - id = g_bus_watch_name(dbus_handle_get_default_bus_type(), - name, - G_BUS_NAME_WATCHER_FLAGS_NONE, - name_appeared_handler, - name_vanished_handler, - user_data, - _destroy_notify_watch_name); - if (!id) { - _E("failed to g_bus_watch_name"); - return -1; - } - - return id; -} - -void dbus_handle_unwatch_name(guint id) -{ - if (id == 0) { - _E("wrong id %d", id); - return; - } - g_bus_unwatch_name(id); -} - -int _get_cmdline_name(pid_t pid, char *cmdline, size_t cmdline_size) -{ - int fd, ret; - char buf[PATH_MAX + 1]; - char *filename; - - snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid); - fd = open(buf, O_RDONLY); - if (fd < 0) { - errno = ESRCH; - return -1; - } - - ret = read(fd, buf, PATH_MAX); - close(fd); - if (ret < 0) - return -1; - - buf[PATH_MAX] = '\0'; - - filename = strrchr(buf, '/'); - if (filename == NULL) - filename = buf; - else - filename = filename + 1; - - if (cmdline_size < strlen(filename) + 1) { - errno = EOVERFLOW; - return -1; - } - - strncpy(cmdline, filename, cmdline_size - 1); - cmdline[cmdline_size - 1] = '\0'; - return 0; -} - -// g_strfreev(strv) -char **dbus_handle_get_owner_list(dbus_handle_h handle, const char *bus_name) -{ - dcl_dbus_handle(); - GError *err = NULL; - GVariant *vret = NULL; - GVariantIter *iter = NULL; - gchar **strv = NULL; - gchar *str = NULL; - int i = 0; - - if (!bus_name) { - _E("wrong parameter bus_name(%s)", bus_name); - return NULL; - } - - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return NULL; - } - } - - vret = g_dbus_connection_call_sync(dh->conn, - "org.freedesktop.DBus", - "/", - "org.freedesktop.DBus", - "ListQueuedOwners", - g_variant_new("(s)", bus_name), - NULL, - G_DBUS_CALL_FLAGS_NONE, - DBUS_REPLY_TIMEOUT, - NULL, - &err); - if (!vret || err) { - _E("failed to g_dbus_connection_call_sync:%s", err->message); - g_error_free(err); - return NULL; - } - - g_variant_get(vret, "(as)", &iter); - strv = g_new(gchar *, g_variant_iter_n_children(iter) + 1); - - i = 0; - while (g_variant_iter_loop(iter, "s", &str)) - strv[i++] = g_strdup(str); - strv[i] = NULL; - - g_variant_iter_free(iter); - g_variant_unref(vret); - - return strv; -} - -void dbush_handle_check_owner_name(dbus_handle_h handle, const char *owner_name) -{ - dcl_dbus_handle(); - char exe_name[PATH_MAX]; - int pid; - char **strv = NULL; - int i; - - if (!dh) { - dh = _dbus_handle_get_default_connection(); - if (!dh) { - _E("failed to get default connection, bustype:%d", (int)dbus_handle_get_default_bus_type()); - return ; - } - } - - strv = dbus_handle_get_owner_list(dh, owner_name); - if (!strv) { - _E("failed to get owner list of %s", owner_name); - return ; - } - - for (i = 0; strv[i] != NULL; ++i) { - pid = dbus_handle_get_sender_pid(dh, strv[i]); - if (_get_cmdline_name(pid, exe_name, PATH_MAX) != 0) - break; - _I("%s(%d)", exe_name, pid); - } - - g_strfreev(strv); -} - -dbus_handle_h dbus_handle_init(GBusType type, - const char* bus_name, - GBusNameAcquiredCallback acquired_handler, - GBusNameLostCallback lost_handler) -{ - dbus_handle_h handle = NULL; - int i, ret = 0; - - if (!bus_name) { - _E("Wrong bus name, %s", bus_name); - return NULL; - } - - // todo: do we need retry ? - booting time - for (i = 0 ; i < 3; ++i) { - handle = dbus_handle_get_connection(type, FALSE); - if (handle) - break; - usleep(5000); - } - ret = dbus_handle_request_bus_name(handle, bus_name, acquired_handler, lost_handler); - if (ret <= 0) - goto out; - - dbush_handle_check_owner_name(NULL, bus_name); - - return handle; - -out: - return NULL; -} diff --git a/src/shared/dbus.h b/src/shared/dbus.h deleted file mode 100644 index b887d33..0000000 --- a/src/shared/dbus.h +++ /dev/null @@ -1,462 +0,0 @@ -/* - * deviced - * - * Copyright (c) 2012 - 2013 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef __DBUS_H__ -#define __DBUS_H__ - -#include -#include -#include -#include -#include - -/* - * Template - * -#define XXX_BUS_NAME "org.tizen.system.XXX" -#define XXX_OBJECT_PATH "/Org/Tizen/System/XXX" -#define XXX_INTERFACE_NAME XXX_BUS_NAME -#define XXX_PATH_YYY XXX_OBJECT_PATH"/YYY" -#define XXX_INTERFACE_YYY XXX_INTERFACE_NAME".YYY" -#define XXX_SIGNAL_ZZZ "ZZZ" -#define XXX_METHOD_ZZZ "ZZZ" - */ - -/* - * DBus daemon - */ -#define DBUS_BUS_NAME "org.freedesktop.DBus" -#define DBUS_OBJECT_PATH "/org/freedesktop/DBus" -#define DBUS_INTERFACE_NAME DBUS_BUS_NAME - -/* - * Device daemon - */ -#define DEVICED_BUS_NAME "org.tizen.system.deviced" -#define DEVICED_OBJECT_PATH "/Org/Tizen/System/DeviceD" -#define DEVICED_INTERFACE_NAME DEVICED_BUS_NAME -/* Core service: get/set device status operations about device */ -#define DEVICED_PATH_CORE DEVICED_OBJECT_PATH"/Core" -#define DEVICED_INTERFACE_CORE DEVICED_INTERFACE_NAME".core" -/* Display service: start/stop display(pm), get/set brightness operations about display */ -#define DEVICED_PATH_DISPLAY DEVICED_OBJECT_PATH"/Display" -#define DEVICED_INTERFACE_DISPLAY DEVICED_INTERFACE_NAME".display" -/* Pass service: start/stop pass operations about pass */ -#define DEVICED_PATH_PASS DEVICED_OBJECT_PATH"/Pass" -#define DEVICED_INTERFACE_PASS DEVICED_INTERFACE_NAME".pass" -/* Power service: set resetkey disable operations about power */ -#define DEVICED_PATH_POWER DEVICED_OBJECT_PATH"/Power" -#define DEVICED_INTERFACE_POWER DEVICED_INTERFACE_NAME".power" -/* Low Power service: start/stop low power mode */ -#define DEVICED_PATH_LOWPOWER DEVICED_OBJECT_PATH"/LowPower" -#define DEVICED_INTERFACE_LOWPOWER DEVICED_INTERFACE_NAME".lowpower" -/* Reboot service: request reboot operation */ -#define DEVICED_PATH_REBOOT DEVICED_OBJECT_PATH"/Reboot" -#define DEVICED_INTERFACE_REBOOT DEVICED_INTERFACE_NAME".reboot" -/* Storage service: get storage size operatioins about storage */ -#define DEVICED_PATH_STORAGE DEVICED_OBJECT_PATH"/Storage" -#define DEVICED_INTERFACE_STORAGE DEVICED_INTERFACE_NAME".storage" -/* ODE service: request ode popup result operatioins about storage */ -#define DEVICED_PATH_SDE DEVICED_OBJECT_PATH"/Sde" -#define DEVICED_INTERFACE_SDE DEVICED_INTERFACE_NAME".sde" -#define DEVICED_PATH_ODE DEVICED_OBJECT_PATH"/Ode" -#define DEVICED_INTERFACE_ODE DEVICED_INTERFACE_NAME".ode" -/* Lowmem service: get critical low status operations about Lowmem */ -#define DEVICED_PATH_LOWMEM DEVICED_OBJECT_PATH"/Lowmem" -#define DEVICED_INTERFACE_LOWMEM DEVICED_INTERFACE_NAME".lowmem" -/* Poweroff service: get power off status operations about Poweroff */ -#define DEVICED_PATH_POWEROFF DEVICED_OBJECT_PATH"/PowerOff" -#define DEVICED_INTERFACE_POWEROFF DEVICED_INTERFACE_NAME".PowerOff" -/* Led service: play/stop led operations about led */ -#define DEVICED_PATH_LED DEVICED_OBJECT_PATH"/Led" -#define DEVICED_INTERFACE_LED DEVICED_INTERFACE_NAME".Led" -/* Block service: manage block device */ -#define STORAGE_BUS_NAME "org.tizen.system.storage" -#define STORAGE_OBJECT_PATH "/Org/Tizen/System/Storage" -#define STORAGE_INTERFACE_NAME STORAGE_BUS_NAME -#define DEVICED_PATH_BLOCK STORAGE_OBJECT_PATH"/Block" -#define DEVICED_PATH_BLOCK_MANAGER DEVICED_PATH_BLOCK"/Manager" -#define DEVICED_INTERFACE_BLOCK_MANAGER STORAGE_INTERFACE_NAME".BlockManager" -/* MMC service: mount/unmount/format mmc operations about mmc */ -#define DEVICED_PATH_MMC DEVICED_OBJECT_PATH"/Mmc" -#define DEVICED_INTERFACE_MMC DEVICED_INTERFACE_NAME".Mmc" -/* Process service: operations about process */ -#define DEVICED_PATH_PROCESS DEVICED_OBJECT_PATH"/Process" -#define DEVICED_INTERFACE_PROCESS DEVICED_INTERFACE_NAME".Process" -/* Key service: operations about key */ -#define DEVICED_PATH_KEY DEVICED_OBJECT_PATH"/Key" -#define DEVICED_INTERFACE_KEY DEVICED_INTERFACE_NAME".Key" -/* USB client service: change usb connection mode */ -#define DEVICED_PATH_USB DEVICED_OBJECT_PATH"/Usb" -#define DEVICED_INTERFACE_USB DEVICED_INTERFACE_NAME".Usb" -/* USB start/stop service: operations about usb start/stop */ -#define DEVICED_PATH_USB_CONTROL DEVICED_OBJECT_PATH"/UsbControl" -#define DEVICED_INTERFACE_USB_CONTROL DEVICED_INTERFACE_NAME".UsbControl" -/* USB host service: operations about usb start/stop */ -#define DEVICED_PATH_USBHOST DEVICED_OBJECT_PATH"/Usbhost" -#define DEVICED_INTERFACE_USBHOST DEVICED_INTERFACE_NAME".Usbhost" -/* Sysnoti service */ -#define DEVICED_PATH_SYSNOTI DEVICED_OBJECT_PATH"/SysNoti" -#define DEVICED_INTERFACE_SYSNOTI DEVICED_INTERFACE_NAME".SysNoti" -/* ExtCon service */ -#define DEVICED_PATH_EXTCON DEVICED_OBJECT_PATH"/ExtCon" -#define DEVICED_INTERFACE_EXTCON DEVICED_INTERFACE_NAME".ExtCon" -/* Battery service */ -#define DEVICED_PATH_BATTERY DEVICED_OBJECT_PATH"/Battery" -#define DEVICED_INTERFACE_BATTERY DEVICED_INTERFACE_NAME".Battery" -/* Time service */ -#define DEVICED_PATH_TIME DEVICED_OBJECT_PATH"/Time" -#define DEVICED_INTERFACE_TIME DEVICED_INTERFACE_NAME".Time" -/* IR service */ -#define DEVICED_PATH_IR DEVICED_OBJECT_PATH"/Ir" -#define DEVICED_INTERFACE_IR DEVICED_INTERFACE_NAME".ir" -/* USB_HOST_TEST service */ -#define DEVICED_PATH_USB_HOST_TEST DEVICED_OBJECT_PATH"/UsbHostTest" -#define DEVICED_INTERFACE_USB_HOST_TEST DEVICED_INTERFACE_NAME".UsbHostTest" - -/* HDMICEC service: status check about gpio */ -#define DEVICED_PATH_HDMICEC DEVICED_OBJECT_PATH"/HdmiCec" -#define DEVICED_INTERFACE_HDMICEC DEVICED_INTERFACE_NAME".HdmiCec" - -/* Tzip service: Archive file system */ -#define DEVICED_PATH_TZIP DEVICED_OBJECT_PATH"/Tzip" -#define DEVICED_INTERFACE_TZIP DEVICED_INTERFACE_NAME".Tzip" - -/* - * Vibrator daemon - */ -#define VIBRATOR_BUS_NAME "org.tizen.system.vibrator" -#define VIBRATOR_OBJECT_PATH "/Org/Tizen/System/Vibrator" -#define VIBRATOR_INTERFACE_NAME VIBRATOR_BUS_NAME -/* Core service: get/set device status operations about device */ -#define VIBRATOR_PATH_CORE VIBRATOR_OBJECT_PATH"/Core" -#define VIBRATOR_INTERFACE_CORE VIBRATOR_INTERFACE_NAME".core" - -#define VIBRATOR_PATH_HAPTIC VIBRATOR_OBJECT_PATH"/Haptic" -#define VIBRATOR_INTERFACE_HAPTIC VIBRATOR_INTERFACE_NAME".haptic" - -/* - * Resource daemon - */ -#define RESOURCED_BUS_NAME "org.tizen.resourced" -#define RESOURCED_OBJECT_PATH "/Org/Tizen/ResourceD" -#define RESOURCED_INTERFACE_NAME RESOURCED_BUS_NAME - -#define RESOURCED_PATH_PROCESS RESOURCED_OBJECT_PATH"/Process" -#define RESOURCED_INTERFACE_PROCESS RESOURCED_INTERFACE_NAME".process" -#define RESOURCED_METHOD_ACTIVE "Active" - -#define RESOURCED_PATH_FREEZER RESOURCED_OBJECT_PATH"/Freezer" -#define RESOURCED_INTERFACE_FREEZER RESOURCED_INTERFACE_NAME".freezer" - -#define RESOURCED_PATH_SLUGGISH RESOURCED_OBJECT_PATH"/Sluggish" -#define RESOURCED_INTERFACE_SLUGGISH RESOURCED_INTERFACE_NAME".sluggish" -#define RESOURCED_SIGNAL_SLUGGISH "SluggishDetected" - -#define RESOURCED_PATH_LOGGING RESOURCED_OBJECT_PATH"/Logging" -#define RESOURCED_INTERFACE_LOGGING RESOURCED_INTERFACE_NAME".logging" -/* - * Popup launcher - */ -#define POPUP_BUS_NAME "org.tizen.system.popup" -#define POPUP_OBJECT_PATH "/Org/Tizen/System/Popup" -#define POPUP_INTERFACE_NAME POPUP_BUS_NAME -/* LED */ -#define POPUP_PATH_LED POPUP_OBJECT_PATH"/Led" -#define POPUP_INTERFACE_LED POPUP_INTERFACE_NAME".Led" -/* Notification */ -#define POPUP_PATH_NOTI POPUP_OBJECT_PATH"/Noti" -#define POPUP_INTERFACE_NOTI POPUP_INTERFACE_NAME".Noti" -/* Power key longpress */ -#define POPUP_PATH_POWERKEY POPUP_OBJECT_PATH"/Powerkey" -#define POPUP_INTERFACE_POWERKEY POPUP_INTERFACE_NAME".Powerkey" -/* Low battery */ -#define POPUP_PATH_LOWBAT POPUP_OBJECT_PATH"/Lowbat" -#define POPUP_INTERFACE_LOWBAT POPUP_INTERFACE_NAME".Lowbat" -/* Low memory */ -#define POPUP_PATH_LOWMEM POPUP_OBJECT_PATH"/Lowmem" -#define POPUP_INTERFACE_LOWMEM POPUP_INTERFACE_NAME".Lowmem" -/* MMC */ -#define POPUP_PATH_MMC POPUP_OBJECT_PATH"/Mmc" -#define POPUP_INTERFACE_MMC POPUP_INTERFACE_NAME".Mmc" -/* USB */ -#define POPUP_PATH_USB POPUP_OBJECT_PATH"/Usb" -#define POPUP_INTERFACE_USB POPUP_INTERFACE_NAME".Usb" -/* USB otg */ -#define POPUP_PATH_USBOTG POPUP_OBJECT_PATH"/Usbotg" -#define POPUP_INTERFACE_USBOTG POPUP_INTERFACE_NAME".Usbotg" -/* USB host */ -#define POPUP_PATH_USBHOST POPUP_OBJECT_PATH"/Usbhost" -#define POPUP_INTERFACE_USBHOST POPUP_INTERFACE_NAME".Usbhost" -/* System */ -#define POPUP_PATH_SYSTEM POPUP_OBJECT_PATH"/System" -#define POPUP_INTERFACE_SYSTEM POPUP_INTERFACE_NAME".System" -/* Overheat */ -#define POPUP_PATH_OVERHEAT POPUP_OBJECT_PATH"/Overheat" -#define POPUP_INTERFACE_OVERHEAT POPUP_INTERFACE_NAME".Overheat" -/* Crash */ -#define POPUP_PATH_CRASH POPUP_OBJECT_PATH"/Crash" -#define POPUP_INTERFACE_CRASH POPUP_INTERFACE_NAME".Crash" -/* Servant */ -#define POPUP_PATH_SERVANT POPUP_OBJECT_PATH"/Servant" -#define POPUP_IFACE_SERVANT POPUP_INTERFACE_NAME".Servant" - -#define POPUP_PATH_APP POPUP_OBJECT_PATH"/Apps" -#define POPUP_IFACE_APP POPUP_BUS_NAME".Apps" - -#define POPUP_METHOD_LAUNCH "PopupLaunch" -#define POPUP_METHOD_TERMINATE "AppTerminateByPid" -#define POPUP_KEY_CONTENT "_SYSPOPUP_CONTENT_" - -/* - * Crash daemon - */ -#define CRASHD_BUS_NAME "org.tizen.system.crashd" -#define CRASHD_OBJECT_PATH "/Org/Tizen/System/CrashD" -#define CRASHD_INTERFACE_NAME CRASHD_BUS_NAME - -#define CRASHD_PATH_CRASH CRASHD_OBJECT_PATH"/Crash" -#define CRASHD_INTERFACE_CRASH CRASHD_INTERFACE_NAME".Crash" - -/* - * Device Manager Policy Popup - */ -#define DEVICEMANAGER_BUS_NAME "org.tizen.DevicePolicyManager" -#define DEVICEMANAGER_OBJECT_PATH "/org/tizen/DevicePolicyManager" -#define DEVICEMANAGER_INTERFACE_NAME DEVICEMANAGER_BUS_NAME - -#define DEVICEMANAGER_PATH_POPUP DEVICEMANAGER_OBJECT_PATH"/Syspopup" -#define DEVICEMANAGER_INTERFACE_POPUP DEVICEMANAGER_INTERFACE_NAME".Syspopup" - - -/***************************************************************/ -/* Experimental for Specific device - contact to deviced owner */ -/***************************************************************/ - -/* Hall service: get hall status operations about hall */ -#define DEVICED_PATH_HALL DEVICED_OBJECT_PATH"/Hall" -#define DEVICED_INTERFACE_HALL DEVICED_INTERFACE_NAME".hall" -/* Cpu service: operations about cpu */ -#define DEVICED_PATH_CPU DEVICED_OBJECT_PATH"/Cpu" -#define DEVICED_INTERFACE_CPU DEVICED_INTERFACE_NAME".Cpu" -/* PmQos service: operations about pmqos */ -#define DEVICED_PATH_PMQOS DEVICED_OBJECT_PATH"/PmQos" -#define DEVICED_INTERFACE_PMQOS DEVICED_INTERFACE_NAME".PmQos" -/* Apps service */ -#define DEVICED_PATH_APPS DEVICED_OBJECT_PATH"/Apps" -#define DEVICED_INTERFACE_APPS DEVICED_INTERFACE_NAME".Apps" -/* GPIO service: status check about gpio */ -#define DEVICED_PATH_GPIO DEVICED_OBJECT_PATH"/Gpio" -#define DEVICED_INTERFACE_GPIO DEVICED_INTERFACE_NAME".Gpio" -/* Board service */ -#define DEVICED_PATH_BOARD DEVICED_OBJECT_PATH"/Board" -#define DEVICED_INTERFACE_BOARD DEVICED_INTERFACE_NAME".Board" -/* Csa service */ -#define DEVICED_PATH_CSA DEVICED_OBJECT_PATH"/Csa" -#define DEVICED_INTERFACE_CSA DEVICED_INTERFACE_NAME".Csa" -/* dump service */ -#define DUMP_SERVICE_BUS_NAME "org.tizen.system.dumpservice" -#define DUMP_SERVICE_OBJECT_PATH "/Org/Tizen/System/DumpService" -#define DUMP_SERVICE_INTERFACE_NAME DUMP_SERVICE_BUS_NAME -/* Coord daemon */ -#define COORD_BUS_NAME "org.tizen.system.coord" -#define COORD_OBJECT_PATH "/Org/Tizen/System/Coord" -#define COORD_INTERFACE_NAME COORD_BUS_NAME -#define COORD_PATH_AUTOBRIGHTNESS COORD_OBJECT_PATH"/Autobrightness" -#define COORD_INTERFACE_AUTOBRIGHTNESS COORD_INTERFACE_NAME".autobrightness" - -/* LED */ -#define POPUP_PATH_LED POPUP_OBJECT_PATH"/Led" -#define POPUP_INTERFACE_LED POPUP_INTERFACE_NAME".Led" -/* ODE */ -#define POPUP_PATH_ODE POPUP_OBJECT_PATH"/Ode" -#define POPUP_INTERFACE_ODE POPUP_INTERFACE_NAME".Ode" -/* Battery */ -#define POPUP_PATH_BATTERY POPUP_OBJECT_PATH"/Battery" -#define POPUP_INTERFACE_BATTERY POPUP_INTERFACE_NAME".Battery" -#define POPUP_METHOD_SCREENOFF_TTS "ScreenOffTts" -/* Overheat Timer*/ -#define POPUP_OVERHEAT_PATH POPUP_OBJECT_PATH"/Overheat" -#define POPUP_OVERHEAT_INTERFACE POPUP_INTERFACE_NAME".Overheat" - -/***********************************************/ -/* End of the Experimental for Specific device */ -/***********************************************/ - - - -typedef struct { - const unsigned char *data; - int size; -} dbus_byte; - -GVariant *dbus_handle_method_sync_with_reply(const char *dest, const char *path, - const char *interface, const char *method, - const char *sig, const char *param[]); - -GVariant *dbus_handle_method_sync_with_reply_var(const char *dest, const char *path, const char *iface, const char *method, GVariant *var); - -/* fd */ -gint* dbus_handle_get_unix_fd_list(GDBusMethodInvocation *invocation, int *size); - -GVariant *dbus_handle_method_with_unix_fd_list_sync_with_reply(const char *dest, const char *path, - const char *iface, const char *method, - const char *signature, const char *param[], - int *in_fdlist, int in_size, - int **out_fdlist, int *out_size); -GVariant *dbus_handle_method_with_unix_fd_list_sync_with_reply_var(const char *dest, const char *path, - const char *iface, const char *method, - GVariant *param, - int *in_fdlist, int in_size, - int **out_fdlist, int *out_size); - -int dbus_handle_method_sync(const char *dest, const char *path, - const char *interface, const char *method, - const char *sig, const char *param[]); - -int dbus_handle_method_sync_var(const char *dest, const char *path, const char *iface, const char *method, GVariant *param); - -int dbus_handle_method_sync_timeout(const char *dest, const char *path, - const char *interface, const char *method, - const char *sig, const char *param[], int timeout); - -int dbus_handle_method_sync_pairs(const char *dest, const char *path, - const char *interface, const char *method, - int num, va_list args); -int dbus_handle_method_async_pairs(const char *dest, const char *path, - const char *interface, const char *method, - int num, va_list args); -int dbus_handle_method_async(const char *dest, const char *path, - const char *interface, const char *method, - const char *sig, const char *param[]); - -int dbus_handle_method_async_var(const char *dest, const char *path, const char *iface, const char *method, GVariant *param); - -typedef void (*dbus_pending_cb)(GVariant *var, void *user_data, GError *err); - -int dbus_handle_method_async_with_reply(const char *dest, - const char *path, - const char *iface, - const char *method, - const char *signature, - const char *param[], - dbus_pending_cb cb, - int timeout_msec, - void *data); - - -int dbus_handle_method_async_with_reply_var(const char *dest, - const char *path, - const char *iface, - const char *method, - GVariant *param, - dbus_pending_cb cb, - int timeout_msec, - void *data); - -int check_systemd_active(void); - -/** - * @brief Dbus handler which is used to register and call methods - - * @since_tizen 4.0 - */ -typedef void *dbus_handle_h; - -/** - * @brief Dbus method handler which is used to unregister dbus methods - * @since_tizen 4.0 - */ -typedef void *dbus_object_handle_h; - -/** - * @brief Structure which contains the dbus method name and callback function. - * @since_tizen 4.0 - */ -typedef struct { - const char *member; - const char *signature_in; - const char *signature_out; - GVariant *(*func)(GDBusConnection *conn, - const gchar *sender, const gchar *path, const gchar *iface, const gchar *name, - GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data); -} dbus_method_s; - -/** - * @brief Structure which contains the dbus interface information and its methods.i - * @since_tizen 4.0 - */ -typedef struct { - dbus_object_handle_h oh; - const char *name; - const dbus_method_s *methods; - int nr_methods; -} dbus_interface_u; - -#define dh_get_param_from_var(gvar, signature, ...) ((g_strcmp0(signature, g_variant_get_type_string(gvar)) == 0) ? g_variant_get(gvar, signature, __VA_ARGS__), TRUE : FALSE) - -#define dbus_handle_new_g_variant_tuple() g_variant_new_tuple(NULL, 0) - -/** - * @brief Callback function which is called when the user data needs to be released. - * @since_tizen 4.0 - */ -typedef void (*destroy_notified)(void *data); - -typedef struct { - dbus_pending_cb func; - void *data; -} pending_call_data; - -int dbus_handle_request_bus_name(dbus_handle_h handle, const char *bus_name, GBusNameAcquiredCallback acquired_handler, GBusNameLostCallback lost_handler); - -dbus_handle_h dbus_handle_get_connection(GBusType bus_type, gboolean priv); - -int dbus_handle_register_dbus_object(dbus_handle_h handle, const char *obj_path, const dbus_interface_u *iface); -int dbus_handle_unregister_dbus_object(dbus_handle_h handle, const char *obj_path); - -int dbus_handle_add_dbus_object(dbus_handle_h handle, const char *obj_path, const dbus_interface_u *iface_u); -int dbus_handle_register_dbus_object_all(dbus_handle_h handle); - -guint subscribe_dbus_signal(dbus_handle_h handle, const char *path, const char *iface, const char *name, GDBusSignalCallback cb, void *data, destroy_notified free_func); -void unsubscribe_dbus_signal(dbus_handle_h handle, guint id); - -GVariant *dbus_handle_make_simple_array(const char *sig, int *param); - -int dbus_handle_broadcast_dbus_signal(const char *path, const char *iface, const char *name, const char *signature, const char *param[]); -int dbus_handle_broadcast_dbus_signal_var(const char *path, const char *iface, const char *name, GVariant *param); - -typedef struct -{ - guint pid; - guint uid; - gchar *unique_name; - gchar *sec_label; -} GDBusCredentials; - -int dbus_connection_get_sender_pid(GDBusConnection *conn, const char * sender); -int dbus_handle_get_sender_pid(dbus_handle_h handle, const char * sender); -int dbus_handle_get_sender_credentials(dbus_handle_h handle, const char *name, GDBusCredentials *creds); -int dbus_handle_watch_name(const char *name, GBusNameAppearedCallback name_appeared_handler, GBusNameVanishedCallback name_vanished_handler, void *user_data); -void dbus_handle_unwatch_name(guint id); -dbus_handle_h dbus_handle_init(GBusType type, const char* bus_name, GBusNameAcquiredCallback acquired_handler, GBusNameLostCallback lost_handler); -char** dbus_handle_get_owner_list(dbus_handle_h handle, const char *bus_name); -void dbush_handle_check_owner_name(dbus_handle_h handle, const char *owner_name); - -#endif diff --git a/src/shared/deviced-systemd.c b/src/shared/deviced-systemd.c index 8d317dd..d4a85b1 100644 --- a/src/shared/deviced-systemd.c +++ b/src/shared/deviced-systemd.c @@ -24,9 +24,9 @@ #include #include #include +#include #include "common.h" -#include "dbus.h" #include "deviced-systemd.h" #include "core/log.h" diff --git a/src/time/time-handler.c b/src/time/time-handler.c index 9278118..e078439 100644 --- a/src/time/time-handler.c +++ b/src/time/time-handler.c @@ -30,12 +30,12 @@ #include #include #include +#include #include "core/log.h" #include "core/devices.h" #include "display/poll.h" #include "display/core.h" -#include "shared/dbus.h" #include "core/common.h" #include "core/device-notifier.h" diff --git a/src/tzip/tzip.c b/src/tzip/tzip.c index 9541e03..6af7bd4 100644 --- a/src/tzip/tzip.c +++ b/src/tzip/tzip.c @@ -34,10 +34,10 @@ #include #include #include +#include #include "core/log.h" #include "core/devices.h" -#include "shared/dbus.h" #include "core/list.h" #include "core/device-notifier.h" #include "core/common.h" diff --git a/src/usb-host-test/usb-host-test.c b/src/usb-host-test/usb-host-test.c index 40a6753..d3b201d 100644 --- a/src/usb-host-test/usb-host-test.c +++ b/src/usb-host-test/usb-host-test.c @@ -22,13 +22,13 @@ #include #include #include +#include #include "core/log.h" #include "core/config-parser.h" #include "core/device-idler.h" #include "core/device-notifier.h" #include "core/devices.h" -#include "shared/dbus.h" #include "core/list.h" #include "shared/deviced-systemd.h" diff --git a/src/usb/usb-dbus.c b/src/usb/usb-dbus.c index f3a64fe..2b4f38f 100755 --- a/src/usb/usb-dbus.c +++ b/src/usb/usb-dbus.c @@ -21,12 +21,11 @@ #include #include #include +#include #include "core/log.h" #include "core/common.h" #include "core/devices.h" -#include "shared/dbus.h" -#include "shared/dbus.h" #include "usb.h" /* Legacy signals */ diff --git a/src/usbhost/usb-host.c b/src/usbhost/usb-host.c index 5c6f08f..24876f2 100644 --- a/src/usbhost/usb-host.c +++ b/src/usbhost/usb-host.c @@ -22,17 +22,16 @@ #include #include #include +#include #include "core/log.h" #include "core/devices.h" -#include "shared/dbus.h" #include "core/device-notifier.h" #include "core/udev.h" #include "core/list.h" #include "core/device-idler.h" #include "apps/apps.h" #include "extcon/extcon.h" -#include "shared/dbus.h" #define USB_INTERFACE_CLASS "bInterfaceClass" #define USB_INTERFACE_SUBCLASS "bInterfaceSubClass" -- 2.7.4 From 203eef71e435a58e57289852809521a43753ef4d Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Thu, 22 Mar 2018 18:25:57 +0900 Subject: [PATCH 06/16] common: Remove build warning Change-Id: I9c4bd8067cf3547e6becdff244bb9291fde2144d Signed-off-by: pr.jung --- src/core/main.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/main.c b/src/core/main.c index 5b5acf2..2c06b1b 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -87,7 +87,6 @@ static gboolean watchdog_cb(void *data) static int deviced_main(int argc, char **argv) { int ret; - guint timer; mainloop = g_main_loop_new(NULL, FALSE); @@ -103,7 +102,7 @@ static int deviced_main(int argc, char **argv) signal(SIGTERM, sig_quit); signal(SIGUSR1, sig_usr1); - timer = g_timeout_add_seconds_full(G_PRIORITY_HIGH, WATCHDOG_TIMEOUT, watchdog_cb, NULL, NULL); + g_timeout_add_seconds_full(G_PRIORITY_HIGH, WATCHDOG_TIMEOUT, watchdog_cb, NULL, NULL); /* g_main_loop */ g_main_loop_run(mainloop); -- 2.7.4 From a8dc36abc06f99bd67b0f38bd31cbf3e38353060 Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Fri, 23 Mar 2018 15:39:55 +0900 Subject: [PATCH 07/16] libgdbus: Remove dbus_handle_method_sync_with_reply usage - Change dbus_handle_method_sync_with_reply to dbus_handle_method_sync_with_reply_var Change-Id: Ifab9ea4cff00f643964f09187d77117ecbcbe563 Signed-off-by: pr.jung --- src/auto-test/battery.c | 12 ++++++------ src/auto-test/display.c | 16 ++++++++-------- src/auto-test/extcon.c | 4 ++-- src/auto-test/led.c | 4 ++-- src/auto-test/proc.c | 4 ++-- src/devicectl/devicectl.c | 16 ++++++++-------- src/libdeviced/led.c | 8 ++++---- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/auto-test/battery.c b/src/auto-test/battery.c index 389553f..bb1d7be 100644 --- a/src/auto-test/battery.c +++ b/src/auto-test/battery.c @@ -126,10 +126,10 @@ static bool get_battery_method(const char *method, int *value) int val; bool ret = FALSE; - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, DEVICED_PATH_BATTERY, DEVICED_INTERFACE_BATTERY, - method, NULL, NULL); + method, NULL); if (!msg) { _E("fail (%s): no reply", method); return ret; @@ -154,10 +154,10 @@ static bool get_battery_method_vconf(const char *method) int val; bool ret = FALSE; - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, DEVICED_PATH_BATTERY, DEVICED_INTERFACE_BATTERY, - method, NULL, NULL); + method, NULL); if (!msg) { _E("fail (%s): no reply", method); return ret; @@ -287,10 +287,10 @@ static bool get_battery_info() bool ret = FALSE; char *argv[3]; - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, DEVICED_PATH_BATTERY, DEVICED_INTERFACE_BATTERY, - METHOD_BATTERY_GETINFO, NULL, NULL); + METHOD_BATTERY_GETINFO, NULL); if (!msg) { _E("fail: no reply"); return ret; diff --git a/src/auto-test/display.c b/src/auto-test/display.c index 13e7f05..c7d30eb 100644 --- a/src/auto-test/display.c +++ b/src/auto-test/display.c @@ -58,10 +58,10 @@ static bool get_display_method(const char *method, int *value) int val; bool ret = FALSE; - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY, - method, NULL, NULL); + method, NULL); if (!msg) { _E("fail (%s): no reply", method); return ret; @@ -112,14 +112,14 @@ static bool set_display_method(const char *method, GVariant *param) return ret; } -static bool set_display_method_noreply(const char *method, char *sig, const char *param[]) +static bool set_display_method_noreply(const char *method, GVariant *var) { GVariant *msg; - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY, - method, sig, param); + method, var); if (!msg) { _E("fail (%s): no reply", method); return FALSE; @@ -332,7 +332,7 @@ static bool set_display_savelog() if (!stat(PM_STATE_LOG_FILE, &buf)) remove(PM_STATE_LOG_FILE); - if (!set_display_method_noreply(METHOD_DISPLAY_SAVELOG, NULL, NULL)) + if (!set_display_method_noreply(METHOD_DISPLAY_SAVELOG, NULL)) return ret; sleep(3); @@ -410,12 +410,12 @@ static bool set_display_actorcontrol(char *command, int actor, int caps) static bool set_display_start() { - return set_display_method_noreply(METHOD_DISPLAY_START, NULL, NULL); + return set_display_method_noreply(METHOD_DISPLAY_START, NULL); } static bool set_display_stop() { - return set_display_method_noreply(METHOD_DISPLAY_STOP, NULL, NULL); + return set_display_method_noreply(METHOD_DISPLAY_STOP, NULL); } void display_test_all(int *success, int *fail) diff --git a/src/auto-test/extcon.c b/src/auto-test/extcon.c index a2ef544..ed2c187 100644 --- a/src/auto-test/extcon.c +++ b/src/auto-test/extcon.c @@ -64,10 +64,10 @@ static bool get_sysnoti_method(const char *method) int val; bool ret = FALSE; - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, DEVICED_PATH_SYSNOTI, DEVICED_INTERFACE_SYSNOTI, - method, NULL, NULL); + method, NULL); if (!msg) { _E("fail (%s): no reply", method); return ret; diff --git a/src/auto-test/led.c b/src/auto-test/led.c index e47aa5e..79cfae3 100644 --- a/src/auto-test/led.c +++ b/src/auto-test/led.c @@ -38,10 +38,10 @@ static bool get_led_method(const char *method) int val; bool ret = FALSE; - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, DEVICED_PATH_LED, DEVICED_INTERFACE_LED, - method, NULL, NULL); + method, NULL); if (!msg) { _E("fail (%s): no reply", method); return ret; diff --git a/src/auto-test/proc.c b/src/auto-test/proc.c index 532c4a1..44bb8dc 100755 --- a/src/auto-test/proc.c +++ b/src/auto-test/proc.c @@ -26,10 +26,10 @@ static bool get_sysnoti_revision() int val; bool ret = FALSE; - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, DEVICED_PATH_SYSNOTI, DEVICED_INTERFACE_SYSNOTI, - METHOD_SYSNOTI_GETREVISION, NULL, NULL); + METHOD_SYSNOTI_GETREVISION, NULL); if (!msg) { _E("fail : no reply"); return ret; diff --git a/src/devicectl/devicectl.c b/src/devicectl/devicectl.c index 50b251a..52455f2 100644 --- a/src/devicectl/devicectl.c +++ b/src/devicectl/devicectl.c @@ -70,11 +70,11 @@ static int start_device(char **args) printf("start %s device!\n", args[1]); - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, devices[arg_id].path, devices[arg_id].iface, "start", - NULL, NULL); + NULL); if (!msg) return -EBADMSG; @@ -92,11 +92,11 @@ static int stop_device(char **args) printf("stop %s device!\n", args[1]); - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, devices[arg_id].path, devices[arg_id].iface, "stop", - NULL, NULL); + NULL); if (!msg) return -EBADMSG; @@ -179,11 +179,11 @@ static int save_dbus_name(char **args) printf("save dbus name!\n"); - msg = dbus_handle_method_sync_with_reply(DBUS_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DBUS_BUS_NAME, DBUS_OBJECT_PATH, DBUS_INTERFACE_NAME, "ListNames", - NULL, NULL); + NULL); if (!msg) { printf("failed to get list names"); return -EBADMSG; @@ -218,11 +218,11 @@ static int device_list(char **args) printf("print %s to dlog!\n", args[1]); - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, devices[arg_id].path, devices[arg_id].iface, "DeviceList", - NULL, NULL); + NULL); if (!msg) return -EBADMSG; diff --git a/src/libdeviced/led.c b/src/libdeviced/led.c index e7da673..bf152b4 100644 --- a/src/libdeviced/led.c +++ b/src/libdeviced/led.c @@ -35,11 +35,11 @@ API int led_get_brightness(void) GVariant *msg = NULL; int ret_val = 0; - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, DEVICED_PATH_LED, DEVICED_INTERFACE_LED, METHOD_GET_BRIGHTNESS, - NULL, NULL); + NULL); if (!msg) return -EBADMSG; @@ -58,11 +58,11 @@ API int led_get_max_brightness(void) GVariant *msg = NULL; int ret_val; - msg = dbus_handle_method_sync_with_reply(DEVICED_BUS_NAME, + msg = dbus_handle_method_sync_with_reply_var(DEVICED_BUS_NAME, DEVICED_PATH_LED, DEVICED_INTERFACE_LED, METHOD_GET_MAX_BRIGHTNESS, - NULL, NULL); + NULL); if (!msg) return -EBADMSG; -- 2.7.4 From 2a97e96e8156f83323f0e69703ab17c63f6f4124 Mon Sep 17 00:00:00 2001 From: "sanghyeok.oh" Date: Mon, 26 Mar 2018 18:16:25 +0900 Subject: [PATCH 08/16] dbus-policy: add rule default deny own Change-Id: I1cc4b02d3d20c2e12c4675352f51384c04ec71fa Signed-off-by: sanghyeok.oh --- conf/org.tizen.system.deviced.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/org.tizen.system.deviced.conf b/conf/org.tizen.system.deviced.conf index 656af38..81c31c6 100644 --- a/conf/org.tizen.system.deviced.conf +++ b/conf/org.tizen.system.deviced.conf @@ -2,8 +2,8 @@ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> + - @@ -18,6 +18,7 @@ + -- 2.7.4 From 9daacb9a9e82ecb41f7d3c71d19ee732f927ed36 Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Mon, 19 Mar 2018 17:48:21 +0900 Subject: [PATCH 09/16] Fix build error that occurred with a new version of cmake(3.9.4) Change-Id: Ifc95d7062cf63674032fdf6e2684fc0a4437ef2f Signed-off-by: Hyotaek Shim --- CMakeLists.txt | 1 + src/auto-test/CMakeLists.txt | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f1a67f3..7ef248b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -218,6 +218,7 @@ ENDIF() ADD_DEFINITIONS("-DDEBUG") ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) +SET(deviced_LDFLAGS ${pkgs_LDFLAGS}) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} "-lrt -ldl -lm" shared) INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) diff --git a/src/auto-test/CMakeLists.txt b/src/auto-test/CMakeLists.txt index 185958c..aef9346 100644 --- a/src/auto-test/CMakeLists.txt +++ b/src/auto-test/CMakeLists.txt @@ -23,8 +23,6 @@ SET(SRCS time.c ) -INCLUDE(FindPkgConfig) - FOREACH(flag ${pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) @@ -37,7 +35,7 @@ ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") ADD_DEFINITIONS("-DENABLE_TEST_DLOG") ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} shared) +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${deviced_LDFLAGS} shared) INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/auto-test.conf DESTINATION /etc/deviced) -- 2.7.4 From e5a87899fa229d51c22e9b18d646156e14764064 Mon Sep 17 00:00:00 2001 From: lokilee73 Date: Wed, 28 Mar 2018 22:16:34 +0900 Subject: [PATCH 10/16] Check the existence of mtp responder service for usb configuration Change-Id: I62ccb18060f1ff9f967a996b919ef347319f1685 Signed-off-by: lokilee73 Signed-off-by: Hyotaek Shim --- src/usb/usb-state.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) mode change 100644 => 100755 src/usb/usb-state.c diff --git a/src/usb/usb-state.c b/src/usb/usb-state.c old mode 100644 new mode 100755 index f87da53..e516916 --- a/src/usb/usb-state.c +++ b/src/usb/usb-state.c @@ -34,6 +34,7 @@ #include "usb-tethering.h" #include "usb-debug.h" +#define MTP_RESPONDER_PATH "/usr/lib/systemd/system/mtp-responder.service" static usb_connection_state_e usb_connection = USB_DISCONNECTED; static unsigned int usb_mode = USB_FUNCTION_NONE; static unsigned int usb_selected_mode = USB_FUNCTION_SDB; /* for debugging */ @@ -78,6 +79,8 @@ usb_connection_state_e usb_state_get_connection(void) void usb_state_retrieve_selected_mode(void) { int ret, mode; + char buf[PATH_MAX]; + ret = vconf_get_int(VCONFKEY_USB_SEL_MODE, &mode); if (ret != 0) { _E("Failed to retrieve selected mode"); @@ -93,6 +96,16 @@ void usb_state_retrieve_selected_mode(void) #endif usb_selected_mode = (unsigned int)mode; + + if (snprintf(buf, PATH_MAX, "%s", MTP_RESPONDER_PATH) < 0) { + _E("Fail to copy MTP_RESPONDER_PATH"); + return; + } + + if (access(buf, R_OK) != 0) { + mode &= ~USB_FUNCTION_MTP; + usb_state_set_selected_mode(mode); + } } void usb_state_set_selected_mode(unsigned int mode) -- 2.7.4 From 51f73ffc292a36676f1ba666b9160744a8e5e9cb Mon Sep 17 00:00:00 2001 From: lokilee73 Date: Wed, 4 Apr 2018 21:39:46 +0900 Subject: [PATCH 11/16] Refactor dbus_handle_init into two parts It's to solve timing issue caused by telephony. When it requests AddPoweroffWait, it fails because dbus in deviced is not ready. Change-Id: I03f64928e361301ba87330298a19bd7482317081 Signed-off-by: lokilee73 --- src/core/main.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) mode change 100644 => 100755 src/core/main.c diff --git a/src/core/main.c b/src/core/main.c old mode 100644 new mode 100755 index 2c06b1b..8d4768c --- a/src/core/main.c +++ b/src/core/main.c @@ -87,6 +87,7 @@ static gboolean watchdog_cb(void *data) static int deviced_main(int argc, char **argv) { int ret; + dbus_handle_h handle = NULL; mainloop = g_main_loop_new(NULL, FALSE); @@ -94,11 +95,18 @@ static int deviced_main(int argc, char **argv) if (ret) return 0; - if (!dbus_handle_init(G_BUS_TYPE_SYSTEM, DEVICED_BUS_NAME, deviced_dbus_name_acquired, NULL)) { - _E("failed to init dbus connection"); - } + handle = dbus_handle_get_connection(G_BUS_TYPE_SYSTEM, FALSE); + if (!handle) + _E("Fail to get dbus connection"); + devices_init(NULL); + ret = dbus_handle_request_bus_name(handle, DEVICED_BUS_NAME, deviced_dbus_name_acquired, NULL); + if (ret <= 0) { + _E("Fail to request bus name"); + dbus_handle_check_owner_name(NULL, DEVICED_BUS_NAME); + } + signal(SIGTERM, sig_quit); signal(SIGUSR1, sig_usr1); -- 2.7.4 From 05360d61e610053753df46da1330123aef0edb5c Mon Sep 17 00:00:00 2001 From: lokilee73 Date: Fri, 6 Apr 2018 11:16:24 +0900 Subject: [PATCH 12/16] Change the method for thermal From ChangedCooldownMode to thermal_scenario Change-Id: Ie5dd8ec75a2018b1dc61dee34f37777e9a88a455 Signed-off-by: lokilee73 --- src/thermal/thermal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/thermal/thermal.c b/src/thermal/thermal.c index d1b99e2..17d5857 100755 --- a/src/thermal/thermal.c +++ b/src/thermal/thermal.c @@ -33,7 +33,7 @@ static int noti; /* Dbus Interfaces */ #define THERMAL_PATH "/Org/Tizen/System/Pass/Monitor/Thermal" #define THERMAL_INTERFACE "org.tizen.system.pass.monitor.thermal" -#define THERMAL_METHOD_TEMP_CHANGED "ChangedCooldownMode" +#define THERMAL_METHOD_TEMP_CHANGED "thermal_scenario" /* Action types */ #define RELEASE_ACTION "ReleaseAction" -- 2.7.4 From d61002ca57126a5be4a9b9c7ecddbc58cf683c03 Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Fri, 6 Apr 2018 16:26:37 +0900 Subject: [PATCH 13/16] Fix a build problem that occurred with a new version of cmake(3.9.4) Change-Id: I4531dc40550ea2feb29a90abc0329b0557cc1229 Signed-off-by: Hyotaek Shim --- src/devicectl/CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/devicectl/CMakeLists.txt b/src/devicectl/CMakeLists.txt index 8f96cab..04f543b 100644 --- a/src/devicectl/CMakeLists.txt +++ b/src/devicectl/CMakeLists.txt @@ -12,7 +12,11 @@ SET(SRCS INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src) INCLUDE(FindPkgConfig) -pkg_check_modules(pkgs REQUIRED glib-2.0 gio-2.0 gio-unix-2.0) +pkg_check_modules(pkgs REQUIRED + glib-2.0 + gio-2.0 + gio-unix-2.0 + libgdbus) FOREACH(flag ${pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") -- 2.7.4 From f50deea1efd5062415f43eb0722983daae77413f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Pawe=C5=82=20Szewczyk?= Date: Wed, 4 Apr 2018 12:58:08 +0200 Subject: [PATCH 14/16] Revert "Revert "usb: Remove usb-operation"" MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This revert was only temporary solution and with updated HAL implementation deviced should not start any services itself. This reverts commit 64bec949084f2bff0dce333052eda84d0244ee3f. Change-Id: Ifd5ccb3b2bbdf764ef0f3a2a191755494cdb7b64 Signed-off-by: Paweł Szewczyk --- CMakeLists.txt | 2 - conf/usb-operation.conf | 14 ------ packaging/deviced.spec | 1 - src/usb/usb-operation.c | 114 ------------------------------------------------ src/usb/usb.c | 8 ---- src/usb/usb.h | 3 -- 6 files changed, 142 deletions(-) delete mode 100644 conf/usb-operation.conf delete mode 100644 src/usb/usb-operation.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ef248b..7ee72a5 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -243,8 +243,6 @@ ENDIF() # USB connection IF(USB_MODULE STREQUAL on) - INSTALL_CONF(conf usb-operation) - # USB (Manual setting) INSTALL(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/scripts/direct_set_debug.sh DESTINATION bin) IF(${SDB_PRESTART} STREQUAL on) diff --git a/conf/usb-operation.conf b/conf/usb-operation.conf deleted file mode 100644 index da6c71c..0000000 --- a/conf/usb-operation.conf +++ /dev/null @@ -1,14 +0,0 @@ -[sdb] -StartService=sdbd.service -StopService=sdbd.service - -[mtp] -StartService=mtp-responder.service -StopService=mtp-responder.service - -[rndis] -Start=/sbin/ifconfig usb0 192.168.129.3 up -Start=/sbin/route add -net 192.168.129.0 netmask 255.255.255.0 dev usb0 -StartService=sshd.service -StopService=sshd.service -Stop=/sbin/ifconfig usb0 down diff --git a/packaging/deviced.spec b/packaging/deviced.spec index 8c68f05..7adb606 100755 --- a/packaging/deviced.spec +++ b/packaging/deviced.spec @@ -218,7 +218,6 @@ mv %{_libdir}/display-tv.so %{_libdir}/deviced/display.so %config %{_sysconfdir}/deviced/power.conf %config %{_sysconfdir}/deviced/battery.conf %config %{_sysconfdir}/deviced/display.conf -%config %{_sysconfdir}/deviced/usb-operation.conf # usbhost_test %{_sysconfdir}/deviced/usb-host-test/test_gadget.gs %{_bindir}/usb-host-ffs-test-daemon diff --git a/src/usb/usb-operation.c b/src/usb/usb-operation.c deleted file mode 100644 index 1bc8efc..0000000 --- a/src/usb/usb-operation.c +++ /dev/null @@ -1,114 +0,0 @@ -/* - * deviced - * - * Copyright (c) 2015 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include -#include -#include - -#include "core/log.h" -#include "core/common.h" -#include "core/config-parser.h" -#include "core/launch.h" -#include "shared/deviced-systemd.h" -#include "usb.h" - -#define USB_OPERATION "/etc/deviced/usb-operation.conf" - -#define KEY_START_STR "Start" -#define KEY_STOP_STR "Stop" - -#define BUF_MAX 128 - -typedef enum { - OPERATION_STOP, - OPERATION_START, -} operation_e; - -struct oper_data { - char mode_str[BUF_MAX]; - operation_e type; -}; - -static int load_operation_config(struct parse_result *result, void *user_data) -{ - struct oper_data *data = user_data; - int ret; - operation_e type; - - if (!data || !result) - return -EINVAL; - - if (!strstr(data->mode_str, result->section)) - return 0; - - if (!strncmp(result->name, KEY_START_STR, strlen(KEY_START_STR))) - type = OPERATION_START; - else if (!strncmp(result->name, KEY_STOP_STR, strlen(KEY_STOP_STR))) - type = OPERATION_STOP; - else { - _E("Invalid name (%s)", result->name); - return -EINVAL; - } - - if (type != data->type) - return 0; - - if (strstr(result->name, "Service")) { - if (type == OPERATION_START) - ret = deviced_systemd_start_unit(result->value); - if (type == OPERATION_STOP) - ret = deviced_systemd_stop_unit(result->value); - } else - ret = launch_app_cmd(result->value); - - _I("Execute(%s %s: %d)", result->name, result->value, ret); - - return 0; -} - -static int usb_execute_operation(unsigned int mode, operation_e type) -{ - int ret; - struct oper_data data; - - usb_state_get_mode_str(mode, data.mode_str, sizeof(data.mode_str)); - - data.type = type; - - ret = config_parse(USB_OPERATION, - load_operation_config, &data); - if (ret < 0) - _E("Failed to load usb operation (%d)", ret); - - return ret; -} - -int usb_operation_start(unsigned int mode) -{ - if (is_emulator()) - return 0; - return usb_execute_operation(mode, OPERATION_START); -} - -int usb_operation_stop(unsigned int mode) -{ - if (is_emulator()) - return 0; - return usb_execute_operation(mode, OPERATION_STOP); -} diff --git a/src/usb/usb.c b/src/usb/usb.c index 66ac8b1..db380f5 100644 --- a/src/usb/usb.c +++ b/src/usb/usb.c @@ -315,8 +315,6 @@ int usb_change_mode(unsigned mode) unsigned int curr = usb_state_get_current_mode(); if (curr != USB_FUNCTION_NONE) { - usb_operation_stop(curr); - ret = usb_disable(); if (ret < 0) { _E("Failed to disable current usb mode"); @@ -339,8 +337,6 @@ int usb_change_mode(unsigned mode) _E("Failed to enable usb mode (%d)"); return ret; } - - usb_operation_start(mode); } return 0; @@ -359,15 +355,11 @@ static int usb_connected(void) return ret; } - usb_operation_start(mode); - return 0; } static int usb_disconnected(void) { - usb_operation_stop(usb_state_get_current_mode()); - usb_state_update_state(USB_DISCONNECTED, USB_FUNCTION_NONE); return usb_disable(); diff --git a/src/usb/usb.h b/src/usb/usb.h index ae26162..0e6165b 100644 --- a/src/usb/usb.h +++ b/src/usb/usb.h @@ -67,9 +67,6 @@ void usb_state_set_selected_mode(unsigned int mode); unsigned int usb_state_get_current_mode(void); usb_connection_state_e usb_state_get_connection(void); -int usb_operation_start(unsigned int mode); -int usb_operation_stop(unsigned int mode); - /* dbus methods/signals (usb-dbus.c) */ enum { DISABLED, -- 2.7.4 From 2541da181ba3c2b0b8dfff4c12721b586c1e0816 Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Tue, 17 Apr 2018 18:19:21 +0900 Subject: [PATCH 15/16] Revert "To prevent Watchdog Kill during the dbus sync call" This reverts commit 19f28633e69ec61b9bd32d904b89f0b5a6f48aee. Change-Id: I57727e680fa9351fd1a3254f25d10bd639302ab6 Signed-off-by: Hyotaek Shim --- src/display/dpms-wayland-none.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/display/dpms-wayland-none.c b/src/display/dpms-wayland-none.c index 3766df5..cf1db2e 100644 --- a/src/display/dpms-wayland-none.c +++ b/src/display/dpms-wayland-none.c @@ -87,8 +87,6 @@ int dpms_get_power(enum dpms_state *state) if (!state) return -EINVAL; - watchdog_notify(); - ret = dbus_handle_method_sync(ENLIGHTENMENT_BUS_NAME, ENLIGHTENMENT_OBJECT_PATH, ENLIGHTENMENT_INTERFACE_NAME, -- 2.7.4 From c6f2bce7ac599c578db44caff1c9de5310a58251 Mon Sep 17 00:00:00 2001 From: Hyotaek Shim Date: Wed, 18 Apr 2018 09:13:21 +0900 Subject: [PATCH 16/16] Revert "Revert "Revert "usb: Remove usb-operation""" This reverts commit f50deea1efd5062415f43eb0722983daae77413f. Change-Id: I3dc62a8c786376039dcc2592ecc61d8f348a6885 Signed-off-by: Hyotaek Shim --- CMakeLists.txt | 2 + conf/usb-operation.conf | 14 ++++++ packaging/deviced.spec | 1 + src/usb/usb-operation.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++++ src/usb/usb.c | 8 ++++ src/usb/usb.h | 3 ++ 6 files changed, 142 insertions(+) create mode 100644 conf/usb-operation.conf create mode 100644 src/usb/usb-operation.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ee72a5..7ef248b 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -243,6 +243,8 @@ ENDIF() # USB connection IF(USB_MODULE STREQUAL on) + INSTALL_CONF(conf usb-operation) + # USB (Manual setting) INSTALL(PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR}/scripts/direct_set_debug.sh DESTINATION bin) IF(${SDB_PRESTART} STREQUAL on) diff --git a/conf/usb-operation.conf b/conf/usb-operation.conf new file mode 100644 index 0000000..da6c71c --- /dev/null +++ b/conf/usb-operation.conf @@ -0,0 +1,14 @@ +[sdb] +StartService=sdbd.service +StopService=sdbd.service + +[mtp] +StartService=mtp-responder.service +StopService=mtp-responder.service + +[rndis] +Start=/sbin/ifconfig usb0 192.168.129.3 up +Start=/sbin/route add -net 192.168.129.0 netmask 255.255.255.0 dev usb0 +StartService=sshd.service +StopService=sshd.service +Stop=/sbin/ifconfig usb0 down diff --git a/packaging/deviced.spec b/packaging/deviced.spec index 7adb606..8c68f05 100755 --- a/packaging/deviced.spec +++ b/packaging/deviced.spec @@ -218,6 +218,7 @@ mv %{_libdir}/display-tv.so %{_libdir}/deviced/display.so %config %{_sysconfdir}/deviced/power.conf %config %{_sysconfdir}/deviced/battery.conf %config %{_sysconfdir}/deviced/display.conf +%config %{_sysconfdir}/deviced/usb-operation.conf # usbhost_test %{_sysconfdir}/deviced/usb-host-test/test_gadget.gs %{_bindir}/usb-host-ffs-test-daemon diff --git a/src/usb/usb-operation.c b/src/usb/usb-operation.c new file mode 100644 index 0000000..1bc8efc --- /dev/null +++ b/src/usb/usb-operation.c @@ -0,0 +1,114 @@ +/* + * deviced + * + * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#include +#include +#include + +#include "core/log.h" +#include "core/common.h" +#include "core/config-parser.h" +#include "core/launch.h" +#include "shared/deviced-systemd.h" +#include "usb.h" + +#define USB_OPERATION "/etc/deviced/usb-operation.conf" + +#define KEY_START_STR "Start" +#define KEY_STOP_STR "Stop" + +#define BUF_MAX 128 + +typedef enum { + OPERATION_STOP, + OPERATION_START, +} operation_e; + +struct oper_data { + char mode_str[BUF_MAX]; + operation_e type; +}; + +static int load_operation_config(struct parse_result *result, void *user_data) +{ + struct oper_data *data = user_data; + int ret; + operation_e type; + + if (!data || !result) + return -EINVAL; + + if (!strstr(data->mode_str, result->section)) + return 0; + + if (!strncmp(result->name, KEY_START_STR, strlen(KEY_START_STR))) + type = OPERATION_START; + else if (!strncmp(result->name, KEY_STOP_STR, strlen(KEY_STOP_STR))) + type = OPERATION_STOP; + else { + _E("Invalid name (%s)", result->name); + return -EINVAL; + } + + if (type != data->type) + return 0; + + if (strstr(result->name, "Service")) { + if (type == OPERATION_START) + ret = deviced_systemd_start_unit(result->value); + if (type == OPERATION_STOP) + ret = deviced_systemd_stop_unit(result->value); + } else + ret = launch_app_cmd(result->value); + + _I("Execute(%s %s: %d)", result->name, result->value, ret); + + return 0; +} + +static int usb_execute_operation(unsigned int mode, operation_e type) +{ + int ret; + struct oper_data data; + + usb_state_get_mode_str(mode, data.mode_str, sizeof(data.mode_str)); + + data.type = type; + + ret = config_parse(USB_OPERATION, + load_operation_config, &data); + if (ret < 0) + _E("Failed to load usb operation (%d)", ret); + + return ret; +} + +int usb_operation_start(unsigned int mode) +{ + if (is_emulator()) + return 0; + return usb_execute_operation(mode, OPERATION_START); +} + +int usb_operation_stop(unsigned int mode) +{ + if (is_emulator()) + return 0; + return usb_execute_operation(mode, OPERATION_STOP); +} diff --git a/src/usb/usb.c b/src/usb/usb.c index db380f5..66ac8b1 100644 --- a/src/usb/usb.c +++ b/src/usb/usb.c @@ -315,6 +315,8 @@ int usb_change_mode(unsigned mode) unsigned int curr = usb_state_get_current_mode(); if (curr != USB_FUNCTION_NONE) { + usb_operation_stop(curr); + ret = usb_disable(); if (ret < 0) { _E("Failed to disable current usb mode"); @@ -337,6 +339,8 @@ int usb_change_mode(unsigned mode) _E("Failed to enable usb mode (%d)"); return ret; } + + usb_operation_start(mode); } return 0; @@ -355,11 +359,15 @@ static int usb_connected(void) return ret; } + usb_operation_start(mode); + return 0; } static int usb_disconnected(void) { + usb_operation_stop(usb_state_get_current_mode()); + usb_state_update_state(USB_DISCONNECTED, USB_FUNCTION_NONE); return usb_disable(); diff --git a/src/usb/usb.h b/src/usb/usb.h index 0e6165b..ae26162 100644 --- a/src/usb/usb.h +++ b/src/usb/usb.h @@ -67,6 +67,9 @@ void usb_state_set_selected_mode(unsigned int mode); unsigned int usb_state_get_current_mode(void); usb_connection_state_e usb_state_get_connection(void); +int usb_operation_start(unsigned int mode); +int usb_operation_stop(unsigned int mode); + /* dbus methods/signals (usb-dbus.c) */ enum { DISABLED, -- 2.7.4