summaryrefslogtreecommitdiff
path: root/extra/systemd
diff options
context:
space:
mode:
authorroot <root@rshg054.dnsready.net>2012-04-07 00:01:17 +0000
committerroot <root@rshg054.dnsready.net>2012-04-07 00:01:17 +0000
commit3d65494a8eda056377febda4642ce992e69a9371 (patch)
treedae57e04ca5f7d7490acbde87206eaa62695109d /extra/systemd
parentd9c1fc1bcca8fd5cd3566fc6b183fe23065778bc (diff)
Sat Apr 7 00:01:16 UTC 2012
Diffstat (limited to 'extra/systemd')
-rw-r--r--extra/systemd/0001-check-for-proper-return-from-dirent_ensure_type.patch28
-rw-r--r--extra/systemd/0001-logind-close-FIFO-before-ending-sessions-cleanly.patch156
-rw-r--r--extra/systemd/PKGBUILD41
-rw-r--r--extra/systemd/systemd.install5
4 files changed, 218 insertions, 12 deletions
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 <dreisner@archlinux.org>
+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 <lennart@poettering.net>
+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 @@
+ " <arg name=\"seat\" type=\"s\" direction=\"out\"/>\n" \
+ " <arg name=\"vtnr\" type=\"u\" direction=\"out\"/>\n" \
+ " </method>\n" \
++ " <method name=\"ReleaseSession\">\n" \
++ " <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \
++ " </method>\n" \
+ " <method name=\"ActivateSession\">\n" \
+ " <arg name=\"id\" type=\"s\" direction=\"in\"/>\n" \
+ " </method>\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 <dreisner@archlinux.org>
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%-*}