Blame SOURCES/0240-lib-Add-get_env_variable-function.patch

4b6aa8
From 4e4d79150fc71cd89a173bb137570db82df60de8 Mon Sep 17 00:00:00 2001
4b6aa8
From: Martin Kutlak <mkutlak@redhat.com>
4b6aa8
Date: Tue, 21 May 2019 10:38:21 +0200
4b6aa8
Subject: [PATCH] lib: Add get_env_variable function
4b6aa8
4b6aa8
Cherry-picked from https://github.com/abrt/libreport/commit/eb844f53ed3a7943b7e3f88d76daa94e2892f10a
4b6aa8
4b6aa8
Signed-off-by: Martin Kutlak <mkutlak@redhat.com>
4b6aa8
---
4b6aa8
 src/include/internal_libreport.h |  2 ++
4b6aa8
 src/lib/get_cmdline.c            | 53 ++++++++++++++++++++++++++++++++
4b6aa8
 2 files changed, 55 insertions(+)
4b6aa8
4b6aa8
diff --git a/src/include/internal_libreport.h b/src/include/internal_libreport.h
4b6aa8
index 23cdfa0..d7bab4e 100644
4b6aa8
--- a/src/include/internal_libreport.h
4b6aa8
+++ b/src/include/internal_libreport.h
4b6aa8
@@ -638,6 +638,8 @@ struct strbuf *strbuf_prepend_strfv(struct strbuf *strbuf,
4b6aa8
 char* get_cmdline(pid_t pid);
4b6aa8
 #define get_environ libreport_get_environ
4b6aa8
 char* get_environ(pid_t pid);
4b6aa8
+#define get_env_variable libreport_get_env_variable
4b6aa8
+int get_env_variable(pid_t pid, const char *name, char **value);
4b6aa8
 
4b6aa8
 /* Takes ptr to time_t, or NULL if you want to use current time.
4b6aa8
  * Returns "YYYY-MM-DD-hh:mm:ss" string.
4b6aa8
diff --git a/src/lib/get_cmdline.c b/src/lib/get_cmdline.c
4b6aa8
index 55c49ea..0fc0cbf 100644
4b6aa8
--- a/src/lib/get_cmdline.c
4b6aa8
+++ b/src/lib/get_cmdline.c
4b6aa8
@@ -148,3 +148,56 @@ char* get_environ(pid_t pid)
4b6aa8
     snprintf(path, sizeof(path), "/proc/%lu/environ", (long)pid);
4b6aa8
     return get_escaped(path, '\n');
4b6aa8
 }
4b6aa8
+
4b6aa8
+int get_env_variable(pid_t pid, const char *name, char **value)
4b6aa8
+{
4b6aa8
+    char path[sizeof("/proc/%lu/environ") + sizeof(long)*3];
4b6aa8
+    snprintf(path, sizeof(path), "/proc/%lu/environ", (long)pid);
4b6aa8
+
4b6aa8
+    FILE *fenv = fopen(path, "re");
4b6aa8
+    if (fenv == NULL)
4b6aa8
+    {
4b6aa8
+        pwarn_msg("Failed to open environ file");
4b6aa8
+        return -errno;
4b6aa8
+    }
4b6aa8
+
4b6aa8
+    size_t len = strlen(name);
4b6aa8
+    int c = 0;
4b6aa8
+    while (c != EOF)
4b6aa8
+    {
4b6aa8
+        long i = 0;
4b6aa8
+        /* Check variable name */
4b6aa8
+        while ((c = fgetc(fenv)) != EOF && (i < len && c == name[i++]))
4b6aa8
+            ;
4b6aa8
+
4b6aa8
+        if (c == EOF)
4b6aa8
+            break;
4b6aa8
+
4b6aa8
+        const int skip = (c != '=' || name[i] != '\0');
4b6aa8
+        i = 0;
4b6aa8
+
4b6aa8
+        /* Read to the end of variable entry */
4b6aa8
+        while ((c = fgetc(fenv)) != EOF && c !='\0')
4b6aa8
+            ++i;
4b6aa8
+
4b6aa8
+        /* Go to the next entry if the read entry isn't the searched variable */
4b6aa8
+        if (skip)
4b6aa8
+            continue;
4b6aa8
+
4b6aa8
+        *value = xmalloc(i+1);
4b6aa8
+
4b6aa8
+        /* i+1 because we didn't count '\0'  */
4b6aa8
+        if (fseek(fenv, -(i+1), SEEK_CUR) < 0)
4b6aa8
+            error_msg_and_die("Failed to seek");
4b6aa8
+
4b6aa8
+        if (fread(*value, 1, i, fenv) != i)
4b6aa8
+            error_msg_and_die("Failed to read value");
4b6aa8
+
4b6aa8
+        (*value)[i] = '\0';
4b6aa8
+
4b6aa8
+        break;
4b6aa8
+    }
4b6aa8
+
4b6aa8
+    fclose(fenv);
4b6aa8
+    return 0;
4b6aa8
+}
4b6aa8
-- 
4b6aa8
2.21.0
4b6aa8