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
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
* 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
#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)
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,
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);
IOVEC_SET_STRING(iovec[j++], core_session);
}
+#endif
+
if (get_process_exe(pid, &t) >= 0) {
core_exe = strappend("COREDUMP_EXE=", t);
free(t);
#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"
if (ucred) {
uint32_t audit;
+#ifdef HAVE_LOGIND
uid_t owner;
+#endif
realuid = ucred->uid;
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);
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);
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);
#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;
}
_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) {
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;
*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;
+
+}
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);
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 */
polkit_agent_open();
}
+#endif
static const char *ansi_highlight_red(bool b) {