From 3d65494a8eda056377febda4642ce992e69a9371 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 7 Apr 2012 00:01:17 +0000 Subject: Sat Apr 7 00:01:16 UTC 2012 --- ...for-proper-return-from-dirent_ensure_type.patch | 28 ++++ ...close-FIFO-before-ending-sessions-cleanly.patch | 156 +++++++++++++++++++++ extra/systemd/PKGBUILD | 41 ++++-- extra/systemd/systemd.install | 5 +- 4 files changed, 218 insertions(+), 12 deletions(-) create mode 100644 extra/systemd/0001-check-for-proper-return-from-dirent_ensure_type.patch create mode 100644 extra/systemd/0001-logind-close-FIFO-before-ending-sessions-cleanly.patch (limited to 'extra/systemd') diff --git a/extra/systemd/0001-check-for-proper-return-from-dirent_ensure_type.patch b/extra/systemd/0001-check-for-proper-return-from-dirent_ensure_type.patch new file mode 100644 index 000000000..f8f6d1fa5 --- /dev/null +++ b/extra/systemd/0001-check-for-proper-return-from-dirent_ensure_type.patch @@ -0,0 +1,28 @@ +From 7e5d190ccce8dc064d5756225e306e65fa534ae9 Mon Sep 17 00:00:00 2001 +From: Dave Reisner +Date: Mon, 2 Apr 2012 08:20:34 -0400 +Subject: [PATCH] check for proper return from dirent_ensure_type + +Fixes 'systemctl list-unit-files', which previously returned only: + + Failed to issue method call: No such file or directory +--- + src/install.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/install.c b/src/install.c +index 174d79b..9256116 100644 +--- a/src/install.c ++++ b/src/install.c +@@ -1853,7 +1853,7 @@ int unit_file_get_list( + + r = dirent_ensure_type(d, de); + if (r < 0) { +- if (errno == ENOENT) ++ if (r == -ENOENT) + continue; + + goto finish; +-- +1.7.9.5 + diff --git a/extra/systemd/0001-logind-close-FIFO-before-ending-sessions-cleanly.patch b/extra/systemd/0001-logind-close-FIFO-before-ending-sessions-cleanly.patch new file mode 100644 index 000000000..fa133ca3c --- /dev/null +++ b/extra/systemd/0001-logind-close-FIFO-before-ending-sessions-cleanly.patch @@ -0,0 +1,156 @@ +From 75c8e3cffd7da8eede614cf61384957af2c82a29 Mon Sep 17 00:00:00 2001 +From: Lennart Poettering +Date: Thu, 22 Mar 2012 02:06:40 +0100 +Subject: [PATCH] logind: close FIFO before ending sessions cleanly + +For clean session endings ask logind explicitly to get rid of the FIFO +before closing it so that the FIFO logic doesn't result in su/sudo to be +terminated immediately. +--- + src/login/logind-dbus.c | 30 ++++++++++++++++++++ + src/login/pam-module.c | 71 +++++++++++++++++++++++++++++++++++++++++++++-- + 2 files changed, 98 insertions(+), 3 deletions(-) + +diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c +index d8f4d89..ea6b89f 100644 +--- a/src/login/logind-dbus.c ++++ b/src/login/logind-dbus.c +@@ -80,6 +80,9 @@ + " \n" \ + " \n" \ + " \n" \ ++ " \n" \ ++ " \n" \ ++ " \n" \ + " \n" \ + " \n" \ + " \n" \ +@@ -1075,6 +1078,33 @@ static DBusHandlerResult manager_message_handler( + if (r < 0) + return bus_send_error_reply(connection, message, &error, r); + ++ } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "ReleaseSession")) { ++ const char *name; ++ Session *session; ++ ++ if (!dbus_message_get_args( ++ message, ++ &error, ++ DBUS_TYPE_STRING, &name, ++ DBUS_TYPE_INVALID)) ++ return bus_send_error_reply(connection, message, &error, -EINVAL); ++ ++ session = hashmap_get(m->sessions, name); ++ if (!session) ++ return bus_send_error_reply(connection, message, &error, -ENOENT); ++ ++ /* We use the FIFO to detect stray sessions where the ++ process invoking PAM dies abnormally. We need to make ++ sure that that process is not killed if at the clean ++ end of the session it closes the FIFO. Hence, with ++ this call explicitly turn off the FIFO logic, so that ++ the PAM code can finish clean up on its own */ ++ session_remove_fifo(session); ++ ++ reply = dbus_message_new_method_return(message); ++ if (!reply) ++ goto oom; ++ + } else if (dbus_message_is_method_call(message, "org.freedesktop.login1.Manager", "ActivateSession")) { + const char *name; + Session *session; +diff --git a/src/login/pam-module.c b/src/login/pam-module.c +index 8544413..4106d2b 100644 +--- a/src/login/pam-module.c ++++ b/src/login/pam-module.c +@@ -414,7 +414,6 @@ _public_ PAM_EXTERN int pam_sm_open_session( + "/org/freedesktop/login1", + "org.freedesktop.login1.Manager", + "CreateSession"); +- + if (!m) { + pam_syslog(handle, LOG_ERR, "Could not allocate create session message."); + r = PAM_BUF_ERR; +@@ -620,11 +619,77 @@ _public_ PAM_EXTERN int pam_sm_close_session( + int argc, const char **argv) { + + const void *p = NULL; ++ const char *id; ++ DBusConnection *bus = NULL; ++ DBusMessage *m = NULL, *reply = NULL; ++ DBusError error; ++ int r; + +- pam_get_data(handle, "systemd.session-fd", &p); ++ assert(handle); ++ ++ dbus_error_init(&error); ++ ++ id = pam_getenv(handle, "XDG_SESSION_ID"); ++ if (id) { ++ ++ /* Before we go and close the FIFO we need to tell ++ * logind that this is a clean session shutdown, so ++ * that it doesn't just go and slaughter us ++ * immediately after closing the fd */ ++ ++ bus = dbus_bus_get_private(DBUS_BUS_SYSTEM, &error); ++ if (!bus) { ++ pam_syslog(handle, LOG_ERR, "Failed to connect to system bus: %s", bus_error_message(&error)); ++ r = PAM_SESSION_ERR; ++ goto finish; ++ } ++ ++ m = dbus_message_new_method_call( ++ "org.freedesktop.login1", ++ "/org/freedesktop/login1", ++ "org.freedesktop.login1.Manager", ++ "ReleaseSession"); ++ if (!m) { ++ pam_syslog(handle, LOG_ERR, "Could not allocate release session message."); ++ r = PAM_BUF_ERR; ++ goto finish; ++ } ++ ++ if (!dbus_message_append_args(m, ++ DBUS_TYPE_STRING, &id, ++ DBUS_TYPE_INVALID)) { ++ pam_syslog(handle, LOG_ERR, "Could not attach parameters to message."); ++ r = PAM_BUF_ERR; ++ goto finish; ++ } + ++ reply = dbus_connection_send_with_reply_and_block(bus, m, -1, &error); ++ if (!reply) { ++ pam_syslog(handle, LOG_ERR, "Failed to release session: %s", bus_error_message(&error)); ++ r = PAM_SESSION_ERR; ++ goto finish; ++ } ++ } ++ ++ r = PAM_SUCCESS; ++ ++finish: ++ pam_get_data(handle, "systemd.session-fd", &p); + if (p) + close_nointr(PTR_TO_INT(p) - 1); + +- return PAM_SUCCESS; ++ dbus_error_free(&error); ++ ++ if (bus) { ++ dbus_connection_close(bus); ++ dbus_connection_unref(bus); ++ } ++ ++ if (m) ++ dbus_message_unref(m); ++ ++ if (reply) ++ dbus_message_unref(reply); ++ ++ return r; + } +-- +1.7.9.5 + diff --git a/extra/systemd/PKGBUILD b/extra/systemd/PKGBUILD index d1f60b49c..c09599940 100644 --- a/extra/systemd/PKGBUILD +++ b/extra/systemd/PKGBUILD @@ -1,10 +1,10 @@ -# $Id: PKGBUILD 153641 2012-03-17 02:44:42Z dreisner $ +# $Id: PKGBUILD 155750 2012-04-06 00:06:04Z tomegun $ # Maintainer: Dave Reisner pkgbase=systemd pkgname=('systemd' 'libsystemd') pkgver=44 -pkgrel=1 +pkgrel=5 arch=('i686' 'x86_64') url="http://www.freedesktop.org/wiki/Software/systemd" license=('GPL2') @@ -13,10 +13,14 @@ makedepends=('acl' 'cryptsetup' 'dbus-core' 'docbook-xsl' 'gperf' 'intltool' options=('!libtool') source=("http://www.freedesktop.org/software/$pkgname/$pkgname-$pkgver.tar.xz" "os-release" - 0001-util-never-follow-symlinks-in-rm_rf_children.patch) + 0001-util-never-follow-symlinks-in-rm_rf_children.patch + 0001-logind-close-FIFO-before-ending-sessions-cleanly.patch + 0001-check-for-proper-return-from-dirent_ensure_type.patch) md5sums=('11f44ff74c87850064e4351518bcff17' '752636def0db3c03f121f8b4f44a63cd' - 'b5863d6d4b47e2b5bda8eb57bde0d327') + 'b5863d6d4b47e2b5bda8eb57bde0d327' + 'd37833358ef6c23fad622ea4a0941d1f' + '11f930fd0a3966abc794bf9127a7dde0') build() { cd "$pkgname-$pkgver" @@ -24,20 +28,25 @@ build() { # https://bugzilla.redhat.com/show_bug.cgi?id=803358 patch -Np1 <"$srcdir/0001-util-never-follow-symlinks-in-rm_rf_children.patch" + # https://bugs.archlinux.org/task/28386 + patch -Np1 <"$srcdir/0001-logind-close-FIFO-before-ending-sessions-cleanly.patch" + + # Fix broken 'systemctl list-unit-files' (upstream fb5ef067c49) + patch -Np1 <"$srcdir/0001-check-for-proper-return-from-dirent_ensure_type.patch" + ./configure --sysconfdir=/etc \ --libexecdir=/usr/lib \ - --libdir=/usr/lib \ --with-pamlibdir=/lib/security \ --localstatedir=/var \ - --with-rootprefix= \ - --with-distro=arch + --with-distro=arch \ + --enable-split-usr make } package_systemd() { - pkgdesc="systemd and service manager" - depends=('acl' 'dbus' 'dbus-core' 'libsystemd' 'kbd' 'kmod' 'libcap' 'pam' 'util-linux' 'udev' 'xz') + pkgdesc="system and service manager" + depends=('acl' 'dbus-core' 'libsystemd' 'kbd' 'kmod' 'libcap' 'pam' 'util-linux' 'udev' 'xz') optdepends=('cryptsetup: required for encrypted block devices' 'dbus-python: systemd-analyze' 'initscripts: legacy support for hostname and vconsole setup' @@ -66,7 +75,9 @@ package_systemd() { chmod 644 "$pkgdir/usr/lib/tmpfiles.d/console.conf" # symlink to /bin/systemd for compat and sanity - ln -s ../lib/systemd/systemd "$pkgdir/bin/systemd" + install -dm755 "$pkgdir/bin" "$pkgdir/lib/systemd" + ln -s ../usr/lib/systemd/systemd "$pkgdir/bin/systemd" + ln -s ../../usr/lib/systemd/systemd "$pkgdir/lib/systemd/systemd" # use python2 for systemd-analyze sed -i '1s/python$/python2/' "$pkgdir/usr/bin/systemd-analyze" @@ -87,6 +98,16 @@ package_systemd() { mv "$manpage" "$section/systemd.$page" done + # move bash-completion and symlink for loginctl + install -Dm644 "$pkgdir/etc/bash_completion.d/systemd-bash-completion.sh" \ + "$pkgdir/usr/share/bash-completion/completions/systemctl" + ln -s systemctl "$pkgdir/usr/share/bash-completion/completions/loginctl" + rm -rf "$pkgdir/etc/bash_completion.d" + + # fix systemctl where + find "$pkgdir" -type f -name '*.service' -exec \ + sed -i 's@\([=-]\)/bin/systemctl@\1/usr/bin/systemctl@g' {} + + ### split off libsystemd (libs, includes, pkgconfig, man3) install -dm755 "$srcdir"/libsystemd/usr/{include,lib/pkgconfig} diff --git a/extra/systemd/systemd.install b/extra/systemd/systemd.install index f31642e13..822108c0f 100644 --- a/extra/systemd/systemd.install +++ b/extra/systemd/systemd.install @@ -7,7 +7,7 @@ checkgroups() { } sd_booted() { - [ -e sys/fs/cgroups/systemd ] + [ -e sys/fs/cgroup/systemd ] } post_install() { @@ -29,7 +29,8 @@ post_upgrade() { fi if sd_booted; then - systemctl daemon-reexec >/dev/null + systemctl daemon-reload + systemctl daemon-reexec fi newpkgver=${1%-*} -- cgit v1.2.3-54-g00ecf