chiark / gitweb /
build-sys: fix built with --disable-logind
authorLennart Poettering <lennart@poettering.net>
Wed, 30 May 2012 20:25:01 +0000 (22:25 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 30 May 2012 20:25:01 +0000 (22:25 +0200)
Makefile.am
TODO
src/journal/coredump.c
src/journal/journald.c
src/login/sd-login.c
src/shared/cgroup-util.c
src/shared/cgroup-util.h
src/systemctl/systemctl.c

index 2d3378e..015640f 100644 (file)
@@ -2083,9 +2083,13 @@ systemd_journald_LDADD = \
        libsystemd-shared.la \
        libsystemd-audit.la \
        libsystemd-daemon.la \
-       libsystemd-login.la \
        libsystemd-id128.la
 
+if ENABLE_LOGIND
+systemd_journald_LDADD += \
+       libsystemd-login.la
+endif
+
 if HAVE_ACL
 systemd_journald_LDADD += \
        libsystemd-acl.la
@@ -2263,10 +2267,14 @@ systemd_coredump_SOURCES = \
 
 systemd_coredump_LDADD = \
        libsystemd-journal.la \
-       libsystemd-login.la \
        libsystemd-label.la \
        libsystemd-shared.la
 
+if ENABLE_LOGIND
+systemd_coredump_LDADD += \
+       libsystemd-login.la
+endif
+
 rootlibexec_PROGRAMS += \
        systemd-coredump
 
diff --git a/TODO b/TODO
index 434b667..15d596a 100644 (file)
--- a/TODO
+++ b/TODO
@@ -6,8 +6,6 @@ Fedora 18:
 * chrony/ntp target?
 
 Bugfixes:
-* fix building of --disable-logind, hournald and coredunp pull-in parts of sd_login
-
 * remove MS_SHARED from src/core/execute.c and src/test/test-ns.c. They are always combined
   with MS_REMOUNT, which currently does nothing in the kernel, but might which fail in the
   future; https://bugzilla.redhat.com/show_bug.cgi?id=813563
index db805d6..10897f3 100644 (file)
 #include <sys/prctl.h>
 
 #include <systemd/sd-journal.h>
+
+#ifdef HAVE_LOGIND
 #include <systemd/sd-login.h>
+#endif
 
 #include "log.h"
 #include "util.h"
 #include "mkdir.h"
 #include "special.h"
+#include "cgroup-util.h"
 
 #define COREDUMP_MAX (24*1024*1024)
 
@@ -126,7 +130,7 @@ int main(int argc, char* argv[]) {
                 goto finish;
         }
 
-        if (sd_pid_get_unit(pid, &t) >= 0) {
+        if (cg_pid_get_unit(pid, &t) >= 0) {
 
                 if (streq(t, SPECIAL_JOURNALD_SERVICE)) {
                         /* Make sure we don't make use of the journal,
@@ -182,6 +186,7 @@ int main(int argc, char* argv[]) {
         if (core_comm)
                 IOVEC_SET_STRING(iovec[j++], core_comm);
 
+#ifdef HAVE_LOGIND
         if (sd_pid_get_session(pid, &t) >= 0) {
                 core_session = strappend("COREDUMP_SESSION=", t);
                 free(t);
@@ -190,6 +195,8 @@ int main(int argc, char* argv[]) {
                         IOVEC_SET_STRING(iovec[j++], core_session);
         }
 
+#endif
+
         if (get_process_exe(pid, &t) >= 0) {
                 core_exe = strappend("COREDUMP_EXE=", t);
                 free(t);
index 5ecb7f7..8ce9ce8 100644 (file)
 #include <sys/statvfs.h>
 
 #include <systemd/sd-journal.h>
-#include <systemd/sd-login.h>
 #include <systemd/sd-messages.h>
 #include <systemd/sd-daemon.h>
 
+#ifdef HAVE_LOGIND
+#include <systemd/sd-login.h>
+#endif
+
 #include "mkdir.h"
 #include "hashmap.h"
 #include "journal-file.h"
@@ -479,7 +482,9 @@ static void dispatch_message_real(
 
         if (ucred) {
                 uint32_t audit;
+#ifdef HAVE_LOGIND
                 uid_t owner;
+#endif
 
                 realuid = ucred->uid;
 
@@ -538,6 +543,7 @@ static void dispatch_message_real(
                                 IOVEC_SET_STRING(iovec[n++], cgroup);
                 }
 
+#ifdef HAVE_LOGIND
                 if (sd_pid_get_session(ucred->pid, &t) >= 0) {
                         session = strappend("_SYSTEMD_SESSION=", t);
                         free(t);
@@ -546,7 +552,12 @@ static void dispatch_message_real(
                                 IOVEC_SET_STRING(iovec[n++], session);
                 }
 
-                if (sd_pid_get_unit(ucred->pid, &t) >= 0) {
+                if (sd_pid_get_owner_uid(ucred->uid, &owner) >= 0)
+                        if (asprintf(&owner_uid, "_SYSTEMD_OWNER_UID=%lu", (unsigned long) owner) >= 0)
+                                IOVEC_SET_STRING(iovec[n++], owner_uid);
+#endif
+
+                if (cg_pid_get_unit(ucred->pid, &t) >= 0) {
                         unit = strappend("_SYSTEMD_UNIT=", t);
                         free(t);
 
@@ -554,10 +565,6 @@ static void dispatch_message_real(
                                 IOVEC_SET_STRING(iovec[n++], unit);
                 }
 
-                if (sd_pid_get_owner_uid(ucred->uid, &owner) >= 0)
-                        if (asprintf(&owner_uid, "_SYSTEMD_OWNER_UID=%lu", (unsigned long) owner) >= 0)
-                                IOVEC_SET_STRING(iovec[n++], owner_uid);
-
 #ifdef HAVE_SELINUX
                 if (label) {
                         selinux_context = malloc(sizeof("_SELINUX_CONTEXT=") + label_len);
index 8e5667c..912ced3 100644 (file)
 #include "sd-login.h"
 #include "strv.h"
 
-static int pid_get_cgroup(pid_t pid, char **root, char **cgroup) {
-        char *cg_process, *cg_init, *p;
-        int r;
-
-        if (pid == 0)
-                pid = getpid();
-
-        if (pid <= 0)
-                return -EINVAL;
-
-        r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, pid, &cg_process);
-        if (r < 0)
-                return r;
-
-        r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, 1, &cg_init);
-        if (r < 0) {
-                free(cg_process);
-                return r;
-        }
-
-        if (endswith(cg_init, "/system"))
-                cg_init[strlen(cg_init)-7] = 0;
-        else if (streq(cg_init, "/"))
-                cg_init[0] = 0;
-
-        if (startswith(cg_process, cg_init))
-                p = cg_process + strlen(cg_init);
-        else
-                p = cg_process;
-
-        free(cg_init);
-
-        if (cgroup) {
-                char* c;
-
-                c = strdup(p);
-                if (!c) {
-                        free(cg_process);
-                        return -ENOMEM;
-                }
-
-                *cgroup = c;
-        }
-
-        if (root) {
-                cg_process[p-cg_process] = 0;
-                *root = cg_process;
-        } else
-                free(cg_process);
-
-        return 0;
-}
-
 _public_ int sd_pid_get_session(pid_t pid, char **session) {
         int r;
         char *cgroup, *p;
 
+        if (pid < 0)
+                return -EINVAL;
+
         if (!session)
                 return -EINVAL;
 
-        r = pid_get_cgroup(pid, NULL, &cgroup);
+        r = cg_pid_get_cgroup(pid, NULL, &cgroup);
         if (r < 0)
                 return r;
 
@@ -122,55 +72,14 @@ _public_ int sd_pid_get_session(pid_t pid, char **session) {
 }
 
 _public_ int sd_pid_get_unit(pid_t pid, char **unit) {
-        int r;
-        char *cgroup, *p, *at, *b;
-        size_t k;
 
-        if (!unit)
+        if (pid < 0)
                 return -EINVAL;
 
-        r = pid_get_cgroup(pid, NULL, &cgroup);
-        if (r < 0)
-                return r;
-
-        if (!startswith(cgroup, "/system/")) {
-                free(cgroup);
-                return -ENOENT;
-        }
-
-        p = cgroup + 8;
-        k = strcspn(p, "/");
-
-        at = memchr(p, '@', k);
-        if (at && at[1] == '.') {
-                size_t j;
-
-                /* This is a templated service */
-                if (p[k] != '/') {
-                        free(cgroup);
-                        return -EIO;
-                }
-
-                j = strcspn(p+k+1, "/");
-
-                b = malloc(k + j + 1);
-
-                if (b) {
-                        memcpy(b, p, at - p + 1);
-                        memcpy(b + (at - p) + 1, p + k + 1, j);
-                        memcpy(b + (at - p) + 1 + j, at + 1, k - (at - p) - 1);
-                        b[k+j] = 0;
-                }
-        } else
-                  b = strndup(p, k);
-
-        free(cgroup);
-
-        if (!b)
-                return -ENOMEM;
+        if (!unit)
+                return -EINVAL;
 
-        *unit = b;
-        return 0;
+        return cg_pid_get_unit(pid, unit);
 }
 
 _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
@@ -178,10 +87,13 @@ _public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
         char *root, *cgroup, *p, *cc;
         struct stat st;
 
+        if (pid < 0)
+                return -EINVAL;
+
         if (!uid)
                 return -EINVAL;
 
-        r = pid_get_cgroup(pid, &root, &cgroup);
+        r = cg_pid_get_cgroup(pid, &root, &cgroup);
         if (r < 0)
                 return r;
 
index 8d3bdce..6740d3b 100644 (file)
@@ -1149,3 +1149,108 @@ char **cg_shorten_controllers(char **controllers) {
         *t = NULL;
         return controllers;
 }
+
+int cg_pid_get_cgroup(pid_t pid, char **root, char **cgroup) {
+        char *cg_process, *cg_init, *p;
+        int r;
+
+        assert(pid >= 0);
+
+        if (pid == 0)
+                pid = getpid();
+
+        r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, pid, &cg_process);
+        if (r < 0)
+                return r;
+
+        r = cg_get_by_pid(SYSTEMD_CGROUP_CONTROLLER, 1, &cg_init);
+        if (r < 0) {
+                free(cg_process);
+                return r;
+        }
+
+        if (endswith(cg_init, "/system"))
+                cg_init[strlen(cg_init)-7] = 0;
+        else if (streq(cg_init, "/"))
+                cg_init[0] = 0;
+
+        if (startswith(cg_process, cg_init))
+                p = cg_process + strlen(cg_init);
+        else
+                p = cg_process;
+
+        free(cg_init);
+
+        if (cgroup) {
+                char* c;
+
+                c = strdup(p);
+                if (!c) {
+                        free(cg_process);
+                        return -ENOMEM;
+                }
+
+                *cgroup = c;
+        }
+
+        if (root) {
+                cg_process[p-cg_process] = 0;
+                *root = cg_process;
+        } else
+                free(cg_process);
+
+        return 0;
+}
+
+int cg_pid_get_unit(pid_t pid, char **unit) {
+        int r;
+        char *cgroup, *p, *at, *b;
+        size_t k;
+
+        assert(pid >= 0);
+        assert(unit);
+
+        r = cg_pid_get_cgroup(pid, NULL, &cgroup);
+        if (r < 0)
+                return r;
+
+        if (!startswith(cgroup, "/system/")) {
+                free(cgroup);
+                return -ENOENT;
+        }
+
+        p = cgroup + 8;
+        k = strcspn(p, "/");
+
+        at = memchr(p, '@', k);
+        if (at && at[1] == '.') {
+                size_t j;
+
+                /* This is a templated service */
+                if (p[k] != '/') {
+                        free(cgroup);
+                        return -EIO;
+                }
+
+                j = strcspn(p+k+1, "/");
+
+                b = malloc(k + j + 1);
+
+                if (b) {
+                        memcpy(b, p, at - p + 1);
+                        memcpy(b + (at - p) + 1, p + k + 1, j);
+                        memcpy(b + (at - p) + 1 + j, at + 1, k - (at - p) - 1);
+                        b[k+j] = 0;
+                }
+        } else
+                  b = strndup(p, k);
+
+        free(cgroup);
+
+        if (!b)
+                return -ENOMEM;
+
+        *unit = b;
+        return 0;
+
+}
index bb156fc..7f11bc6 100644 (file)
@@ -69,6 +69,8 @@ int cg_is_empty(const char *controller, const char *path, bool ignore_self);
 int cg_is_empty_recursive(const char *controller, const char *path, bool ignore_self);
 
 int cg_get_user_path(char **path);
+int cg_pid_get_cgroup(pid_t pid, char **root, char **cgroup);
+int cg_pid_get_unit(pid_t pid, char **unit);
 
 char **cg_shorten_controllers(char **controllers);
 
index 66f4113..58b6035 100644 (file)
@@ -171,6 +171,7 @@ static void ask_password_agent_open_if_enabled(void) {
         ask_password_agent_open();
 }
 
+#ifdef HAVE_LOGIND
 static void polkit_agent_open_if_enabled(void) {
 
         /* Open the polkit agent as a child process if necessary */
@@ -183,6 +184,7 @@ static void polkit_agent_open_if_enabled(void) {
 
         polkit_agent_open();
 }
+#endif
 
 static const char *ansi_highlight_red(bool b) {