diff options
-rw-r--r-- | Makefile.am | 12 | ||||
-rw-r--r-- | TODO | 2 | ||||
-rw-r--r-- | src/journal/coredump.c | 9 | ||||
-rw-r--r-- | src/journal/journald.c | 19 | ||||
-rw-r--r-- | src/login/sd-login.c | 112 | ||||
-rw-r--r-- | src/shared/cgroup-util.c | 105 | ||||
-rw-r--r-- | src/shared/cgroup-util.h | 2 | ||||
-rw-r--r-- | src/systemctl/systemctl.c | 2 |
8 files changed, 152 insertions, 111 deletions
diff --git a/Makefile.am b/Makefile.am index 2d3378e309..015640f535 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 @@ -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 diff --git a/src/journal/coredump.c b/src/journal/coredump.c index db805d6cb5..10897f3461 100644 --- a/src/journal/coredump.c +++ b/src/journal/coredump.c @@ -25,12 +25,16 @@ #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); diff --git a/src/journal/journald.c b/src/journal/journald.c index 5ecb7f72d3..8ce9ce858b 100644 --- a/src/journal/journald.c +++ b/src/journal/journald.c @@ -31,10 +31,13 @@ #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); diff --git a/src/login/sd-login.c b/src/login/sd-login.c index 8e5667c705..912ced3179 100644 --- a/src/login/sd-login.c +++ b/src/login/sd-login.c @@ -30,67 +30,17 @@ #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; diff --git a/src/shared/cgroup-util.c b/src/shared/cgroup-util.c index 8d3bdce0f5..6740d3b885 100644 --- a/src/shared/cgroup-util.c +++ b/src/shared/cgroup-util.c @@ -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; + +} diff --git a/src/shared/cgroup-util.h b/src/shared/cgroup-util.h index bb156fc259..7f11bc6f83 100644 --- a/src/shared/cgroup-util.h +++ b/src/shared/cgroup-util.h @@ -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); diff --git a/src/systemctl/systemctl.c b/src/systemctl/systemctl.c index 66f4113eb2..58b6035c69 100644 --- a/src/systemctl/systemctl.c +++ b/src/systemctl/systemctl.c @@ -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) { |