build-sys: fix built with --disable-logind
This commit is contained in:
parent
7c0987d812
commit
ba1261bc02
12
Makefile.am
12
Makefile.am
|
@ -2083,9 +2083,13 @@ systemd_journald_LDADD = \
|
||||||
libsystemd-shared.la \
|
libsystemd-shared.la \
|
||||||
libsystemd-audit.la \
|
libsystemd-audit.la \
|
||||||
libsystemd-daemon.la \
|
libsystemd-daemon.la \
|
||||||
libsystemd-login.la \
|
|
||||||
libsystemd-id128.la
|
libsystemd-id128.la
|
||||||
|
|
||||||
|
if ENABLE_LOGIND
|
||||||
|
systemd_journald_LDADD += \
|
||||||
|
libsystemd-login.la
|
||||||
|
endif
|
||||||
|
|
||||||
if HAVE_ACL
|
if HAVE_ACL
|
||||||
systemd_journald_LDADD += \
|
systemd_journald_LDADD += \
|
||||||
libsystemd-acl.la
|
libsystemd-acl.la
|
||||||
|
@ -2263,10 +2267,14 @@ systemd_coredump_SOURCES = \
|
||||||
|
|
||||||
systemd_coredump_LDADD = \
|
systemd_coredump_LDADD = \
|
||||||
libsystemd-journal.la \
|
libsystemd-journal.la \
|
||||||
libsystemd-login.la \
|
|
||||||
libsystemd-label.la \
|
libsystemd-label.la \
|
||||||
libsystemd-shared.la
|
libsystemd-shared.la
|
||||||
|
|
||||||
|
if ENABLE_LOGIND
|
||||||
|
systemd_coredump_LDADD += \
|
||||||
|
libsystemd-login.la
|
||||||
|
endif
|
||||||
|
|
||||||
rootlibexec_PROGRAMS += \
|
rootlibexec_PROGRAMS += \
|
||||||
systemd-coredump
|
systemd-coredump
|
||||||
|
|
||||||
|
|
2
TODO
2
TODO
|
@ -6,8 +6,6 @@ Fedora 18:
|
||||||
* chrony/ntp target?
|
* chrony/ntp target?
|
||||||
|
|
||||||
Bugfixes:
|
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
|
* 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
|
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
|
future; https://bugzilla.redhat.com/show_bug.cgi?id=813563
|
||||||
|
|
|
@ -25,12 +25,16 @@
|
||||||
#include <sys/prctl.h>
|
#include <sys/prctl.h>
|
||||||
|
|
||||||
#include <systemd/sd-journal.h>
|
#include <systemd/sd-journal.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_LOGIND
|
||||||
#include <systemd/sd-login.h>
|
#include <systemd/sd-login.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "mkdir.h"
|
#include "mkdir.h"
|
||||||
#include "special.h"
|
#include "special.h"
|
||||||
|
#include "cgroup-util.h"
|
||||||
|
|
||||||
#define COREDUMP_MAX (24*1024*1024)
|
#define COREDUMP_MAX (24*1024*1024)
|
||||||
|
|
||||||
|
@ -126,7 +130,7 @@ int main(int argc, char* argv[]) {
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sd_pid_get_unit(pid, &t) >= 0) {
|
if (cg_pid_get_unit(pid, &t) >= 0) {
|
||||||
|
|
||||||
if (streq(t, SPECIAL_JOURNALD_SERVICE)) {
|
if (streq(t, SPECIAL_JOURNALD_SERVICE)) {
|
||||||
/* Make sure we don't make use of the journal,
|
/* Make sure we don't make use of the journal,
|
||||||
|
@ -182,6 +186,7 @@ int main(int argc, char* argv[]) {
|
||||||
if (core_comm)
|
if (core_comm)
|
||||||
IOVEC_SET_STRING(iovec[j++], core_comm);
|
IOVEC_SET_STRING(iovec[j++], core_comm);
|
||||||
|
|
||||||
|
#ifdef HAVE_LOGIND
|
||||||
if (sd_pid_get_session(pid, &t) >= 0) {
|
if (sd_pid_get_session(pid, &t) >= 0) {
|
||||||
core_session = strappend("COREDUMP_SESSION=", t);
|
core_session = strappend("COREDUMP_SESSION=", t);
|
||||||
free(t);
|
free(t);
|
||||||
|
@ -190,6 +195,8 @@ int main(int argc, char* argv[]) {
|
||||||
IOVEC_SET_STRING(iovec[j++], core_session);
|
IOVEC_SET_STRING(iovec[j++], core_session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
if (get_process_exe(pid, &t) >= 0) {
|
if (get_process_exe(pid, &t) >= 0) {
|
||||||
core_exe = strappend("COREDUMP_EXE=", t);
|
core_exe = strappend("COREDUMP_EXE=", t);
|
||||||
free(t);
|
free(t);
|
||||||
|
|
|
@ -31,10 +31,13 @@
|
||||||
#include <sys/statvfs.h>
|
#include <sys/statvfs.h>
|
||||||
|
|
||||||
#include <systemd/sd-journal.h>
|
#include <systemd/sd-journal.h>
|
||||||
#include <systemd/sd-login.h>
|
|
||||||
#include <systemd/sd-messages.h>
|
#include <systemd/sd-messages.h>
|
||||||
#include <systemd/sd-daemon.h>
|
#include <systemd/sd-daemon.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_LOGIND
|
||||||
|
#include <systemd/sd-login.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "mkdir.h"
|
#include "mkdir.h"
|
||||||
#include "hashmap.h"
|
#include "hashmap.h"
|
||||||
#include "journal-file.h"
|
#include "journal-file.h"
|
||||||
|
@ -479,7 +482,9 @@ static void dispatch_message_real(
|
||||||
|
|
||||||
if (ucred) {
|
if (ucred) {
|
||||||
uint32_t audit;
|
uint32_t audit;
|
||||||
|
#ifdef HAVE_LOGIND
|
||||||
uid_t owner;
|
uid_t owner;
|
||||||
|
#endif
|
||||||
|
|
||||||
realuid = ucred->uid;
|
realuid = ucred->uid;
|
||||||
|
|
||||||
|
@ -538,6 +543,7 @@ static void dispatch_message_real(
|
||||||
IOVEC_SET_STRING(iovec[n++], cgroup);
|
IOVEC_SET_STRING(iovec[n++], cgroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LOGIND
|
||||||
if (sd_pid_get_session(ucred->pid, &t) >= 0) {
|
if (sd_pid_get_session(ucred->pid, &t) >= 0) {
|
||||||
session = strappend("_SYSTEMD_SESSION=", t);
|
session = strappend("_SYSTEMD_SESSION=", t);
|
||||||
free(t);
|
free(t);
|
||||||
|
@ -546,7 +552,12 @@ static void dispatch_message_real(
|
||||||
IOVEC_SET_STRING(iovec[n++], session);
|
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);
|
unit = strappend("_SYSTEMD_UNIT=", t);
|
||||||
free(t);
|
free(t);
|
||||||
|
|
||||||
|
@ -554,10 +565,6 @@ static void dispatch_message_real(
|
||||||
IOVEC_SET_STRING(iovec[n++], unit);
|
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
|
#ifdef HAVE_SELINUX
|
||||||
if (label) {
|
if (label) {
|
||||||
selinux_context = malloc(sizeof("_SELINUX_CONTEXT=") + label_len);
|
selinux_context = malloc(sizeof("_SELINUX_CONTEXT=") + label_len);
|
||||||
|
|
|
@ -30,67 +30,17 @@
|
||||||
#include "sd-login.h"
|
#include "sd-login.h"
|
||||||
#include "strv.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) {
|
_public_ int sd_pid_get_session(pid_t pid, char **session) {
|
||||||
int r;
|
int r;
|
||||||
char *cgroup, *p;
|
char *cgroup, *p;
|
||||||
|
|
||||||
|
if (pid < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (!session)
|
if (!session)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
r = pid_get_cgroup(pid, NULL, &cgroup);
|
r = cg_pid_get_cgroup(pid, NULL, &cgroup);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
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) {
|
_public_ int sd_pid_get_unit(pid_t pid, char **unit) {
|
||||||
int r;
|
|
||||||
char *cgroup, *p, *at, *b;
|
if (pid < 0)
|
||||||
size_t k;
|
return -EINVAL;
|
||||||
|
|
||||||
if (!unit)
|
if (!unit)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
r = pid_get_cgroup(pid, NULL, &cgroup);
|
return cg_pid_get_unit(pid, unit);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_public_ int sd_pid_get_owner_uid(pid_t pid, uid_t *uid) {
|
_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;
|
char *root, *cgroup, *p, *cc;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
|
if (pid < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (!uid)
|
if (!uid)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
r = pid_get_cgroup(pid, &root, &cgroup);
|
r = cg_pid_get_cgroup(pid, &root, &cgroup);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
|
||||||
|
|
|
@ -1149,3 +1149,108 @@ char **cg_shorten_controllers(char **controllers) {
|
||||||
*t = NULL;
|
*t = NULL;
|
||||||
return controllers;
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -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_is_empty_recursive(const char *controller, const char *path, bool ignore_self);
|
||||||
|
|
||||||
int cg_get_user_path(char **path);
|
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);
|
char **cg_shorten_controllers(char **controllers);
|
||||||
|
|
||||||
|
|
|
@ -171,6 +171,7 @@ static void ask_password_agent_open_if_enabled(void) {
|
||||||
ask_password_agent_open();
|
ask_password_agent_open();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LOGIND
|
||||||
static void polkit_agent_open_if_enabled(void) {
|
static void polkit_agent_open_if_enabled(void) {
|
||||||
|
|
||||||
/* Open the polkit agent as a child process if necessary */
|
/* 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();
|
polkit_agent_open();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static const char *ansi_highlight_red(bool b) {
|
static const char *ansi_highlight_red(bool b) {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue