[systemd-devel] [PATCH] util, fileio: do not use get_status_field() for get_process_capeff()

Shawn Landden shawn at churchofgit.com
Thu Sep 19 10:40:42 PDT 2013


Tt is in the logging hot path and has too many special needs, like
skipping extra '0's.
---
 src/shared/fileio.c | 16 +++-------------
 src/shared/util.c   | 24 +++++++++++++++++++++++-
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/src/shared/fileio.c b/src/shared/fileio.c
index 01b803c..0df5d3f 100644
--- a/src/shared/fileio.c
+++ b/src/shared/fileio.c
@@ -662,6 +662,7 @@ int get_status_field(const char *filename, const char *pattern, char **field) {
 
         assert(filename);
         assert(field);
+        assert(pattern);
 
         r = read_full_file(filename, &status, NULL);
         if (r < 0)
@@ -672,20 +673,9 @@ int get_status_field(const char *filename, const char *pattern, char **field) {
                 return -ENOENT;
 
         t += strlen(pattern);
-        /* Also skip zeros, because when this is used for capabilities,
-         * we don't want the zeros. This way the same capability set
-         * always maps to the same string, irrespective of the total
-         * capability set size. For other numbers it shouldn't matter.
-         */
-        if (*t) {
-                t += strspn(t, WHITESPACE "0");
-                /* Back off one char if there's nothing but whitespace
-                   and zeros */
-                if (!*t)
-                        t --;
-        }
+        t += strspn(t, " \t");
 
-        len = strcspn(t, WHITESPACE);
+        len = strcspn(t, " \n");
 
         *field = strndup(t, len);
         if (!*field)
diff --git a/src/shared/util.c b/src/shared/util.c
index bf31511..a81541e 100644
--- a/src/shared/util.c
+++ b/src/shared/util.c
@@ -695,6 +695,10 @@ int is_kernel_thread(pid_t pid) {
 
 int get_process_capeff(pid_t pid, char **capeff) {
         const char *p;
+        _cleanup_free_ char *status = NULL;
+        char *t = NULL;
+        int r;
+
 
         assert(capeff);
         assert(pid >= 0);
@@ -704,7 +708,25 @@ int get_process_capeff(pid_t pid, char **capeff) {
         else
                 p = procfs_file_alloca(pid, "status");
 
-        return get_status_field(p, "\nCapEff:", capeff);
+        r = read_full_file(p, &status, NULL);
+        if (r < 0)
+                return r;
+
+        t = strstr(status, "\nCapEff:\t");
+        if (!t)
+                return -ENOENT;
+
+        for (t += strlen("\nCapEff:\t"); t[0] == '0'; t++)
+                continue;
+
+        if (t[0] == '\n')
+                t--;
+
+        *capeff = strndup(t, (char *)rawmemchr(t, '\n') - t);
+        if (!*capeff)
+                return -ENOMEM;
+
+        return 0;
 }
 
 int get_process_exe(pid_t pid, char **name) {
-- 
1.8.4.rc3



More information about the systemd-devel mailing list