ryantimwilson / rpms / systemd

Forked from rpms/systemd a month ago
Clone
Zbigniew Jędrzejewski-Szmek 62fe94
From 28849dbadb7cd127f7f89e8892ec94c6a05070da Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 62fe94
From: Lennart Poettering <lennart@poettering.net>
Zbigniew Jędrzejewski-Szmek 62fe94
Date: Thu, 21 Aug 2014 16:22:34 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] service,strv: introduce strv_find_startswith() and make use
Zbigniew Jędrzejewski-Szmek 62fe94
 of it
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
Unlike strv_find_prefix() the new call will return a pointer to the
Zbigniew Jędrzejewski-Szmek 62fe94
suffix of the item we found, instead of the whole item. This is more
Zbigniew Jędrzejewski-Szmek 62fe94
closer inline with what startswith() does, and allows us to simplify a
Zbigniew Jędrzejewski-Szmek 62fe94
couple of invocations.
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/core/service.c | 44 +++++++++++++++++++++-----------------------
Zbigniew Jędrzejewski-Szmek 62fe94
 src/shared/strv.c  | 17 +++++++++++++++++
Zbigniew Jędrzejewski-Szmek 62fe94
 src/shared/strv.h  |  1 +
Zbigniew Jędrzejewski-Szmek 62fe94
 3 files changed, 39 insertions(+), 23 deletions(-)
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/core/service.c b/src/core/service.c
Zbigniew Jędrzejewski-Szmek 62fe94
index fc952e848f..262a40cc8b 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/core/service.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/core/service.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -2526,12 +2526,13 @@ static void service_notify_message(Unit *u, pid_t pid, char **tags) {
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         /* Interpret MAINPID= */
Zbigniew Jędrzejewski-Szmek 62fe94
-        e = strv_find_prefix(tags, "MAINPID=");
Zbigniew Jędrzejewski-Szmek 62fe94
+        e = strv_find_startswith(tags, "MAINPID=");
Zbigniew Jędrzejewski-Szmek 62fe94
         if (e && IN_SET(s->state, SERVICE_START, SERVICE_START_POST, SERVICE_RUNNING, SERVICE_RELOAD)) {
Zbigniew Jędrzejewski-Szmek 62fe94
-                if (parse_pid(e + 8, &pid) < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (parse_pid(e, &pid) < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
                         log_warning_unit(u->id, "Failed to parse MAINPID= field in notification message: %s", e);
Zbigniew Jędrzejewski-Szmek 62fe94
                 else {
Zbigniew Jędrzejewski-Szmek 62fe94
-                        log_debug_unit(u->id, "%s: got %s", u->id, e);
Zbigniew Jędrzejewski-Szmek 62fe94
+                        log_debug_unit(u->id, "%s: got MAINPID=%s", u->id, e);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
                         service_set_main_pid(s, pid);
Zbigniew Jędrzejewski-Szmek 62fe94
                         unit_watch_pid(UNIT(s), pid);
Zbigniew Jędrzejewski-Szmek 62fe94
                         notify_dbus = true;
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -2546,44 +2547,41 @@ static void service_notify_message(Unit *u, pid_t pid, char **tags) {
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         /* Interpret STATUS= */
Zbigniew Jędrzejewski-Szmek 62fe94
-        e = strv_find_prefix(tags, "STATUS=");
Zbigniew Jędrzejewski-Szmek 62fe94
+        e = strv_find_startswith(tags, "STATUS=");
Zbigniew Jędrzejewski-Szmek 62fe94
         if (e) {
Zbigniew Jędrzejewski-Szmek 62fe94
-                char *t;
Zbigniew Jędrzejewski-Szmek 62fe94
+                _cleanup_free_ char *t = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-                if (e[7]) {
Zbigniew Jędrzejewski-Szmek 62fe94
-                        if (!utf8_is_valid(e+7)) {
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (!isempty(e)) {
Zbigniew Jędrzejewski-Szmek 62fe94
+                        if (!utf8_is_valid(e))
Zbigniew Jędrzejewski-Szmek 62fe94
                                 log_warning_unit(u->id, "Status message in notification is not UTF-8 clean.");
Zbigniew Jędrzejewski-Szmek 62fe94
-                                return;
Zbigniew Jędrzejewski-Szmek 62fe94
-                        }
Zbigniew Jędrzejewski-Szmek 62fe94
+                        else {
Zbigniew Jędrzejewski-Szmek 62fe94
+                                log_debug_unit(u->id, "%s: got STATUS=%s", u->id, e);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-                        log_debug_unit(u->id, "%s: got %s", u->id, e);
Zbigniew Jędrzejewski-Szmek 62fe94
-
Zbigniew Jędrzejewski-Szmek 62fe94
-                        t = strdup(e+7);
Zbigniew Jędrzejewski-Szmek 62fe94
-                        if (!t) {
Zbigniew Jędrzejewski-Szmek 62fe94
-                                log_oom();
Zbigniew Jędrzejewski-Szmek 62fe94
-                                return;
Zbigniew Jędrzejewski-Szmek 62fe94
+                                t = strdup(e);
Zbigniew Jędrzejewski-Szmek 62fe94
+                                if (!t)
Zbigniew Jędrzejewski-Szmek 62fe94
+                                        log_oom();
Zbigniew Jędrzejewski-Szmek 62fe94
                         }
Zbigniew Jędrzejewski-Szmek 62fe94
-
Zbigniew Jędrzejewski-Szmek 62fe94
-                } else
Zbigniew Jędrzejewski-Szmek 62fe94
-                        t = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
+                }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
                 if (!streq_ptr(s->status_text, t)) {
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
                         free(s->status_text);
Zbigniew Jędrzejewski-Szmek 62fe94
                         s->status_text = t;
Zbigniew Jędrzejewski-Szmek 62fe94
+                        t = NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
                         notify_dbus = true;
Zbigniew Jędrzejewski-Szmek 62fe94
-                } else
Zbigniew Jędrzejewski-Szmek 62fe94
-                        free(t);
Zbigniew Jędrzejewski-Szmek 62fe94
+                }
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         /* Interpret ERRNO= */
Zbigniew Jędrzejewski-Szmek 62fe94
-        e = strv_find_prefix(tags, "ERRNO=");
Zbigniew Jędrzejewski-Szmek 62fe94
+        e = strv_find_startswith(tags, "ERRNO=");
Zbigniew Jędrzejewski-Szmek 62fe94
         if (e) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 int status_errno;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-                if (safe_atoi(e + 6, &status_errno) < 0 || status_errno < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (safe_atoi(e, &status_errno) < 0 || status_errno < 0)
Zbigniew Jędrzejewski-Szmek 62fe94
                         log_warning_unit(u->id, "Failed to parse ERRNO= field in notification message: %s", e);
Zbigniew Jędrzejewski-Szmek 62fe94
                 else {
Zbigniew Jędrzejewski-Szmek 62fe94
-                        log_debug_unit(u->id, "%s: got %s", u->id, e);
Zbigniew Jędrzejewski-Szmek 62fe94
+                        log_debug_unit(u->id, "%s: got ERRNO=%s", u->id, e);
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
                         if (s->status_errno != status_errno) {
Zbigniew Jędrzejewski-Szmek 62fe94
                                 s->status_errno = status_errno;
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/shared/strv.c b/src/shared/strv.c
Zbigniew Jędrzejewski-Szmek 62fe94
index 6448f3170f..0df978d23b 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/shared/strv.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/shared/strv.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -52,6 +52,23 @@ char *strv_find_prefix(char **l, const char *name) {
Zbigniew Jędrzejewski-Szmek 62fe94
         return NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+char *strv_find_startswith(char **l, const char *name) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        char **i, *e;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        assert(name);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        /* Like strv_find_prefix, but actually returns only the
Zbigniew Jędrzejewski-Szmek 62fe94
+         * suffix, not the whole item */
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        STRV_FOREACH(i, l) {
Zbigniew Jędrzejewski-Szmek 62fe94
+                e = startswith(*i, name);
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (e)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        return e;
Zbigniew Jędrzejewski-Szmek 62fe94
+        }
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        return NULL;
Zbigniew Jędrzejewski-Szmek 62fe94
+}
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
 void strv_free(char **l) {
Zbigniew Jędrzejewski-Szmek 62fe94
         char **k;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/shared/strv.h b/src/shared/strv.h
Zbigniew Jędrzejewski-Szmek 62fe94
index ee55c148aa..9c9633c515 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/shared/strv.h
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/shared/strv.h
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -28,6 +28,7 @@
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
 char *strv_find(char **l, const char *name) _pure_;
Zbigniew Jędrzejewski-Szmek 62fe94
 char *strv_find_prefix(char **l, const char *name) _pure_;
Zbigniew Jędrzejewski-Szmek 62fe94
+char *strv_find_startswith(char **l, const char *name) _pure_;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
 void strv_free(char **l);
Zbigniew Jędrzejewski-Szmek 62fe94
 DEFINE_TRIVIAL_CLEANUP_FUNC(char**, strv_free);