Treat correctly running/not running status 77/17677/1
authorJosé Bollo <jose.bollo@iot.bzh>
Mon, 5 Nov 2018 17:14:15 +0000 (18:14 +0100)
committerJosé Bollo <jose.bollo@iot.bzh>
Mon, 5 Nov 2018 17:14:15 +0000 (18:14 +0100)
Systemd returns 0 for services that don't run.
It wasn't checked well causing weird effect:
trying to terminate an application not running
killed afm-system-daemon because kill(0) kills
all processes of the group of the caller.

Bug-AGL: SPEC-1836

Change-Id: I1bd64faf871ecd42aaaa5449312e8b8cb26ee9dd
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
src/afm-binding.c
src/afm-urun.c

index 5fb1f73..037c108 100644 (file)
@@ -49,6 +49,7 @@ static const char _id_[]        = "id";
 static const char _install_[]   = "install";
 static const char _lang_[]      = "lang";
 static const char _not_found_[] = "not-found";
+static const char _not_running_[] = "not-running";
 static const char _once_[]      = "once";
 static const char _pause_[]     = "pause";
 static const char _resume_[]    = "resume";
@@ -187,6 +188,12 @@ static void not_found(afb_req_t req)
        afb_req_fail(req, _not_found_, NULL);
 }
 
+/* common not running reply */
+static void not_running(afb_req_t req)
+{
+       afb_req_fail(req, _not_running_, NULL);
+}
+
 /* common can't start reply */
 static void cant_start(afb_req_t req)
 {
@@ -283,7 +290,10 @@ static int onrunid(afb_req_t req, const char *method, int *runid)
                /* nothing appropriate */
                INFO("method %s can't get runid for %s: %m", method,
                                                        appid);
-               not_found(req);
+               if (errno == ESRCH)
+                       not_running(req);
+               else
+                       not_found(req);
                return 0;
        }
 
index 8c21b2a..882d44c 100644 (file)
@@ -268,7 +268,7 @@ int afm_urun_once(struct json_object *appli, int uid)
        }
 
        rc = systemd_unit_pid_of_dpath(isuser, udpath);
-       if (rc < 0) {
+       if (rc <= 0) {
                j_read_string_at(appli, "unit-scope", &uscope);
                j_read_string_at(appli, "unit-name", &uname);
                ERROR("can't getpid of %s unit %s for uid %d: %m", uscope, uname, uid);
@@ -403,7 +403,7 @@ struct json_object *afm_urun_state(struct afm_udb *db, int runid, int uid)
                         && j_read_string_at(appli, "id", &id)) {
                                pid = systemd_unit_pid_of_dpath(isuser, udpath);
                                state = systemd_unit_state_of_dpath(isuser, dpath);
-                               if (state == SysD_State_Active)
+                               if (pid > 0 && state == SysD_State_Active)
                                        result = mkstate(id, runid, pid, state);
                                goto end;
                        }
@@ -437,6 +437,10 @@ int afm_urun_search_runid(struct afm_udb *db, const char *id, int uid)
                pid = -1;
        } else {
                pid = systemd_unit_pid_of_dpath(isuser, udpath);
+               if (pid == 0) {
+                       errno = ESRCH;
+                       pid = -1;
+               }
        }
        return pid;
 }