X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafm-system-daemon.c;h=49749bcace8413a3ee3d1a82b0e0dbaf1d815e3f;hb=941eb7ef734e7d6a9de9c7af13345e63f708d169;hp=ab87c97cf3f84320f6bf263788919082bfee082c;hpb=50dd441a11440201e1da9da81a7103677e2282ad;p=src%2Fapp-framework-main.git diff --git a/src/afm-system-daemon.c b/src/afm-system-daemon.c index ab87c97..49749bc 100644 --- a/src/afm-system-daemon.c +++ b/src/afm-system-daemon.c @@ -1,5 +1,5 @@ /* - Copyright 2015 IoT.bzh + Copyright 2015, 2016, 2017 IoT.bzh author: José Bollo @@ -22,11 +22,14 @@ #include #include -#include +#include +#include +#include #include "verbose.h" #include "utils-jbus.h" #include "utils-json.h" +#include "utils-systemd.h" #include "afm.h" #include "afm-db.h" #include "wgt-info.h" @@ -66,11 +69,21 @@ const char error_bad_request[] = "\"bad request\""; const char error_not_found[] = "\"not found\""; const char error_cant_start[] = "\"can't start\""; -static void on_install(struct jreq *jreq, struct json_object *req) +static void do_reloads() +{ +#ifndef LEGACY_MODE_WITHOUT_SYSTEMD + /* enforce daemon reload */ + systemd_daemon_reload(0); + systemd_unit_restart_name(0, "sockets.target"); +#endif +} + +static void on_install(struct sd_bus_message *smsg, struct json_object *req, void *unused) { const char *wgtfile; const char *root; int force; + int reload; struct wgt_info *ifo; struct json_object *resp; @@ -80,43 +93,46 @@ static void on_install(struct jreq *jreq, struct json_object *req) wgtfile = json_object_get_string(req); root = rootdir; force = 0; + reload = 1; break; case json_type_object: - wgtfile = j_get_string(req, "wgt", NULL); + wgtfile = j_string_at(req, "wgt", NULL); if (wgtfile != NULL) { - root = j_get_string(req, "root", rootdir); - force = j_get_boolean(req, "force", 0); + root = j_string_at(req, "root", rootdir); + force = j_boolean_at(req, "force", 0); + reload = j_boolean_at(req, "reload", 1); break; } default: - jbus_reply_error_s(jreq, error_bad_request); + jbus_reply_error_s(smsg, error_bad_request); return; } /* install the widget */ ifo = install_widget(wgtfile, root, force); - if (ifo == NULL) { - jbus_reply_error_s(jreq, "\"installation failed\""); - return; - } + if (ifo == NULL) + jbus_reply_error_s(smsg, "\"installation failed\""); + else { + /* reload if needed */ + if (reload) + do_reloads(); - /* build the response */ - resp = json_object_new_object(); - if(!resp || !j_add_string(resp, "added", wgt_info_desc(ifo)->idaver)) { - json_object_put(resp); + /* build the response */ + resp = json_object_new_object(); + if(!resp || !j_add_string(resp, "added", wgt_info_desc(ifo)->idaver)) + jbus_reply_error_s(smsg, "\"out of memory but installed!\""); + else { + jbus_send_signal_s(jbus, "changed", "true"); + jbus_reply_j(smsg, resp); + } + + /* clean-up */ wgt_info_unref(ifo); - jbus_reply_error_s(jreq, "\"out of memory but installed!\""); - return; + json_object_put(resp); } - wgt_info_unref(ifo); - - /* reply and propagate event */ - jbus_reply_j(jreq, resp); - jbus_send_signal_j(jbus, "changed", resp); - json_object_put(resp); } -static void on_uninstall(struct jreq *jreq, struct json_object *req) +static void on_uninstall(struct sd_bus_message *smsg, struct json_object *req, void *unused) { const char *idaver; const char *root; @@ -129,23 +145,24 @@ static void on_uninstall(struct jreq *jreq, struct json_object *req) root = rootdir; break; case json_type_object: - idaver = j_get_string(req, "id", NULL); + idaver = j_string_at(req, "id", NULL); if (idaver != NULL) { - root = j_get_string(req, "root", rootdir); + root = j_string_at(req, "root", rootdir); break; } default: - jbus_reply_error_s(jreq, error_bad_request); + jbus_reply_error_s(smsg, error_bad_request); return; } /* install the widget */ rc = uninstall_widget(idaver, root); - if (rc) { - jbus_reply_error_s(jreq, "\"uninstallation had error\""); - return; + if (rc) + jbus_reply_error_s(smsg, "\"uninstallation had error\""); + else { + jbus_send_signal_s(jbus, "changed", "true"); + jbus_reply_s(smsg, "true"); } - jbus_reply_s(jreq, "true"); } static int daemonize() @@ -160,7 +177,9 @@ static int daemonize() int main(int ac, char **av) { - int i, daemon = 0; + int i, daemon = 0, rc; + struct sd_event *evloop; + struct sd_bus *sysbus; LOGAUTH(appname); @@ -218,24 +237,41 @@ int main(int ac, char **av) return 1; } + /* get systemd objects */ + rc = sd_event_new(&evloop); + if (rc < 0) { + ERROR("can't create event loop"); + return 1; + } + rc = sd_bus_open_system(&sysbus); + if (rc < 0) { + ERROR("can't create system bus"); + return 1; + } + rc = sd_bus_attach_event(sysbus, evloop, 0); + if (rc < 0) { + ERROR("can't attach system bus to event loop"); + return 1; + } + /* init service */ - jbus = create_jbus(0, AFM_SYSTEM_DBUS_PATH); + jbus = create_jbus(sysbus, AFM_SYSTEM_DBUS_PATH); if (!jbus) { ERROR("create_jbus failed"); return 1; } - if(jbus_add_service_j(jbus, "install", on_install) - || jbus_add_service_j(jbus, "uninstall", on_uninstall)) { + if(jbus_add_service_j(jbus, "install", on_install, NULL) + || jbus_add_service_j(jbus, "uninstall", on_uninstall, NULL)) { ERROR("adding services failed"); return 1; } /* start and run */ - if (jbus_start_serving(jbus)) { + if (jbus_start_serving(jbus) < 0) { ERROR("can't start server"); return 1; } - while (!jbus_read_write_dispatch(jbus, -1)); + for(;;) + sd_event_run(evloop, (uint64_t)-1); return 0; } -