[systemd/f16] socket tarpits and other fixes from upstream
Michal Schmidt
michich at fedoraproject.org
Tue Mar 6 09:18:17 UTC 2012
commit a661dbaae228b47dade96fb5f7f38dd87ed4e495
Author: Michal Schmidt <mschmidt at redhat.com>
Date: Tue Mar 6 10:16:27 2012 +0100
socket tarpits and other fixes from upstream
- avoid socket tarpits when the service keeps failing
- get rid of awk, sed, grep in bash completion
- and minor fixes
0155-fix-sparse-warnings.patch | 94 ++++++++++++++++
...-the-socket-if-the-service-keeps-dying-on.patch | 101 +++++++++++++++++
...me-broken-failure-result-to-failed-perman.patch | 77 +++++++++++++
0158-nspawn-be-less-cryptic-when-clone-fails.patch | 31 ++++++
...sh-completion-get-rid-of-awk-sed-and-grep.patch | 113 ++++++++++++++++++++
...ount-properly-check-return-for-mount_add_.patch | 25 +++++
systemd.spec | 15 +++-
7 files changed, 455 insertions(+), 1 deletions(-)
---
diff --git a/0155-fix-sparse-warnings.patch b/0155-fix-sparse-warnings.patch
new file mode 100644
index 0000000..82bcf79
--- /dev/null
+++ b/0155-fix-sparse-warnings.patch
@@ -0,0 +1,94 @@
+From e425ad8c3800e126450f3fc8e49a357f674fc3eb Mon Sep 17 00:00:00 2001
+From: Frederic Crozat <fcrozat at suse.com>
+Date: Wed, 29 Feb 2012 14:42:49 +0100
+Subject: [PATCH] fix sparse warnings (cherry picked from commit
+ 6a39419fe4e4ab7beb2412b6a52b5fd513509452)
+
+Conflicts:
+
+ src/log.c
+---
+ src/getty-generator.c | 2 +-
+ src/hashmap.c | 4 ++--
+ src/macro.h | 1 +
+ src/mount.c | 2 +-
+ src/util.c | 4 ++--
+ 5 files changed, 7 insertions(+), 6 deletions(-)
+
+diff --git a/src/getty-generator.c b/src/getty-generator.c
+index 6b5b254..1bb0d34 100644
+--- a/src/getty-generator.c
++++ b/src/getty-generator.c
+@@ -28,7 +28,7 @@
+ #include "unit-name.h"
+ #include "virt.h"
+
+-const char *arg_dest = "/tmp";
++static const char *arg_dest = "/tmp";
+
+ static int add_symlink(const char *fservice, const char *tservice) {
+ char *from = NULL, *to = NULL;
+diff --git a/src/hashmap.c b/src/hashmap.c
+index 7ef8097..6928118 100644
+--- a/src/hashmap.c
++++ b/src/hashmap.c
+@@ -55,10 +55,10 @@ struct pool {
+ unsigned n_used;
+ };
+
+-struct pool *first_hashmap_pool = NULL;
++static struct pool *first_hashmap_pool = NULL;
+ static void *first_hashmap_tile = NULL;
+
+-struct pool *first_entry_pool = NULL;
++static struct pool *first_entry_pool = NULL;
+ static void *first_entry_tile = NULL;
+
+ static void* allocate_tile(struct pool **first_pool, void **first_tile, size_t tile_size) {
+diff --git a/src/macro.h b/src/macro.h
+index 3f30aa7..5515490 100644
+--- a/src/macro.h
++++ b/src/macro.h
+@@ -23,6 +23,7 @@
+ ***/
+
+ #include <assert.h>
++#include <sys/param.h>
+ #include <sys/types.h>
+ #include <sys/uio.h>
+ #include <inttypes.h>
+diff --git a/src/mount.c b/src/mount.c
+index 3dc14bb..8281082 100644
+--- a/src/mount.c
++++ b/src/mount.c
+@@ -271,7 +271,7 @@ static char* mount_test_option(const char *haystack, const char *needle) {
+ * struct mntent */
+
+ if (!haystack)
+- return false;
++ return NULL;
+
+ zero(me);
+ me.mnt_opts = (char*) haystack;
+diff --git a/src/util.c b/src/util.c
+index 6065463..a488289 100644
+--- a/src/util.c
++++ b/src/util.c
+@@ -891,7 +891,7 @@ int load_env_file(
+ char ***rl) {
+
+ FILE *f;
+- char **m = 0;
++ char **m = NULL;
+ int r;
+
+ assert(fname);
+@@ -4172,7 +4172,7 @@ int wait_for_terminate_and_warn(const char *name, pid_t pid) {
+
+ }
+
+-void freeze(void) {
++_noreturn_ void freeze(void) {
+
+ /* Make sure nobody waits for us on a socket anymore */
+ close_all_fds(NULL, 0);
diff --git a/0156-socket-fail-the-socket-if-the-service-keeps-dying-on.patch b/0156-socket-fail-the-socket-if-the-service-keeps-dying-on.patch
new file mode 100644
index 0000000..e76a500
--- /dev/null
+++ b/0156-socket-fail-the-socket-if-the-service-keeps-dying-on.patch
@@ -0,0 +1,101 @@
+From 6af0f4d18a60f01d005410b541eb9a0655bc2a86 Mon Sep 17 00:00:00 2001
+From: Michal Schmidt <mschmidt at redhat.com>
+Date: Mon, 5 Mar 2012 22:47:54 +0100
+Subject: [PATCH] socket: fail the socket if the service keeps dying on start
+
+If the service reaches the start limit, mark the sockets that activate
+it as failed (with the result code 'service-broken').
+This way the sockets won't act as tarpits for clients connecting to
+them.
+(cherry picked from commit c2f3480897b51dd9b2137f1eeddb4c851e9c6e3b)
+
+Conflicts:
+
+ src/service.c
+ src/socket.c
+ src/socket.h
+---
+ src/service.c | 7 ++++---
+ src/socket.c | 9 ++++++---
+ src/socket.h | 2 +-
+ 3 files changed, 11 insertions(+), 7 deletions(-)
+
+diff --git a/src/service.c b/src/service.c
+index f99ee60..950e495 100644
+--- a/src/service.c
++++ b/src/service.c
+@@ -1375,7 +1375,7 @@ static int service_search_main_pid(Service *s) {
+ return 0;
+ }
+
+-static void service_notify_sockets_dead(Service *s) {
++static void service_notify_sockets_dead(Service *s, bool broken) {
+ Iterator i;
+ Unit *u;
+
+@@ -1388,7 +1388,7 @@ static void service_notify_sockets_dead(Service *s) {
+
+ SET_FOREACH(u, s->meta.dependencies[UNIT_TRIGGERED_BY], i)
+ if (u->meta.type == UNIT_SOCKET)
+- socket_notify_service_dead(SOCKET(u));
++ socket_notify_service_dead(SOCKET(u), broken);
+
+ return;
+ }
+@@ -1450,7 +1450,7 @@ static void service_set_state(Service *s, ServiceState state) {
+ state == SERVICE_FINAL_SIGKILL ||
+ state == SERVICE_FAILED ||
+ state == SERVICE_AUTO_RESTART)
+- service_notify_sockets_dead(s);
++ service_notify_sockets_dead(s, false);
+
+ if (state != SERVICE_START_PRE &&
+ state != SERVICE_START &&
+@@ -2275,6 +2275,7 @@ static int service_start(Unit *u) {
+ /* Make sure we don't enter a busy loop of some kind. */
+ if (!ratelimit_test(&s->ratelimit)) {
+ log_warning("%s start request repeated too quickly, refusing to start.", u->meta.id);
++ service_notify_sockets_dead(s, true);
+ return -ECANCELED;
+ }
+
+diff --git a/src/socket.c b/src/socket.c
+index 8bce18c..4b85528 100644
+--- a/src/socket.c
++++ b/src/socket.c
+@@ -2016,7 +2016,7 @@ int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds) {
+ return 0;
+ }
+
+-void socket_notify_service_dead(Socket *s) {
++void socket_notify_service_dead(Socket *s, bool broken) {
+ assert(s);
+
+ /* The service is dead. Dang!
+@@ -2025,8 +2025,11 @@ void socket_notify_service_dead(Socket *s) {
+ * services. */
+
+ if (s->state == SOCKET_RUNNING) {
+- log_debug("%s got notified about service death.", s->meta.id);
+- socket_enter_listening(s);
++ log_debug("%s got notified about service death (broken: %s)", s->meta.id, yes_no(broken));
++ if (broken)
++ socket_enter_stop_pre(s, false);
++ else
++ socket_enter_listening(s);
+ }
+ }
+
+diff --git a/src/socket.h b/src/socket.h
+index 4fc2cbe..31b9552 100644
+--- a/src/socket.h
++++ b/src/socket.h
+@@ -137,7 +137,7 @@ struct Socket {
+ int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
+
+ /* Called from the service when it shut down */
+-void socket_notify_service_dead(Socket *s);
++void socket_notify_service_dead(Socket *s, bool broken);
+
+ /* Called from the mount code figure out if a mount is a dependency of
+ * any of the sockets of this socket */
diff --git a/0157-socket-rename-broken-failure-result-to-failed-perman.patch b/0157-socket-rename-broken-failure-result-to-failed-perman.patch
new file mode 100644
index 0000000..c9f30fa
--- /dev/null
+++ b/0157-socket-rename-broken-failure-result-to-failed-perman.patch
@@ -0,0 +1,77 @@
+From dda7fed7d225da9242c767f2e548a4bf4d5fe022 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Tue, 6 Mar 2012 01:29:29 +0100
+Subject: [PATCH] socket: rename 'broken' failure result to 'failed-permanent'
+ on order not to introduce new terminology (cherry picked
+ from commit 6bda96a0234e2d3d61bc36de99c19a9293721fef)
+
+Conflicts:
+
+ src/service.c
+ src/socket.c
+ src/socket.h
+---
+ src/service.c | 4 ++--
+ src/socket.c | 6 +++---
+ src/socket.h | 2 +-
+ 3 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/src/service.c b/src/service.c
+index 950e495..af83b6e 100644
+--- a/src/service.c
++++ b/src/service.c
+@@ -1375,7 +1375,7 @@ static int service_search_main_pid(Service *s) {
+ return 0;
+ }
+
+-static void service_notify_sockets_dead(Service *s, bool broken) {
++static void service_notify_sockets_dead(Service *s, bool failed_permanent) {
+ Iterator i;
+ Unit *u;
+
+@@ -1388,7 +1388,7 @@ static void service_notify_sockets_dead(Service *s, bool broken) {
+
+ SET_FOREACH(u, s->meta.dependencies[UNIT_TRIGGERED_BY], i)
+ if (u->meta.type == UNIT_SOCKET)
+- socket_notify_service_dead(SOCKET(u), broken);
++ socket_notify_service_dead(SOCKET(u), failed_permanent);
+
+ return;
+ }
+diff --git a/src/socket.c b/src/socket.c
+index 4b85528..b40b7a1 100644
+--- a/src/socket.c
++++ b/src/socket.c
+@@ -2016,7 +2016,7 @@ int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds) {
+ return 0;
+ }
+
+-void socket_notify_service_dead(Socket *s, bool broken) {
++void socket_notify_service_dead(Socket *s, bool failed_permanent) {
+ assert(s);
+
+ /* The service is dead. Dang!
+@@ -2025,8 +2025,8 @@ void socket_notify_service_dead(Socket *s, bool broken) {
+ * services. */
+
+ if (s->state == SOCKET_RUNNING) {
+- log_debug("%s got notified about service death (broken: %s)", s->meta.id, yes_no(broken));
+- if (broken)
++ log_debug("%s got notified about service death (failed permanently: %s)", s->meta.id, yes_no(failed_permanent));
++ if (failed_permanent)
+ socket_enter_stop_pre(s, false);
+ else
+ socket_enter_listening(s);
+diff --git a/src/socket.h b/src/socket.h
+index 31b9552..b172402 100644
+--- a/src/socket.h
++++ b/src/socket.h
+@@ -137,7 +137,7 @@ struct Socket {
+ int socket_collect_fds(Socket *s, int **fds, unsigned *n_fds);
+
+ /* Called from the service when it shut down */
+-void socket_notify_service_dead(Socket *s, bool broken);
++void socket_notify_service_dead(Socket *s, bool failed_permanent);
+
+ /* Called from the mount code figure out if a mount is a dependency of
+ * any of the sockets of this socket */
diff --git a/0158-nspawn-be-less-cryptic-when-clone-fails.patch b/0158-nspawn-be-less-cryptic-when-clone-fails.patch
new file mode 100644
index 0000000..5f2b9ef
--- /dev/null
+++ b/0158-nspawn-be-less-cryptic-when-clone-fails.patch
@@ -0,0 +1,31 @@
+From a92d0708fa5755e2c66943c7827c538824473596 Mon Sep 17 00:00:00 2001
+From: Lennart Poettering <lennart at poettering.net>
+Date: Tue, 6 Mar 2012 02:06:29 +0100
+Subject: [PATCH] nspawn: be less cryptic when clone() fails
+
+Based on a patch suggested by Shawn Landden.
+(cherry picked from commit 52af21063b365f231ee6ae8bac18d690fff85799)
+---
+ src/nspawn.c | 9 +++++++--
+ 1 files changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/src/nspawn.c b/src/nspawn.c
+index 3ea603f..52b4aa8 100644
+--- a/src/nspawn.c
++++ b/src/nspawn.c
+@@ -705,8 +705,13 @@ int main(int argc, char *argv[]) {
+ sigset_add_many(&mask, SIGCHLD, SIGWINCH, SIGTERM, SIGINT, -1);
+ assert_se(sigprocmask(SIG_BLOCK, &mask, NULL) == 0);
+
+- if ((pid = syscall(__NR_clone, SIGCHLD|CLONE_NEWIPC|CLONE_NEWNS|CLONE_NEWPID|CLONE_NEWUTS|(arg_private_network ? CLONE_NEWNET : 0), NULL)) < 0) {
+- log_error("clone() failed: %m");
++ pid = syscall(__NR_clone, SIGCHLD|CLONE_NEWIPC|CLONE_NEWNS|CLONE_NEWPID|CLONE_NEWUTS|(arg_private_network ? CLONE_NEWNET : 0), NULL);
++ if (pid < 0) {
++ if (errno == EINVAL)
++ log_error("clone() failed, do you have namespace support enabled in your kernel? (You need UTS, IPC, PID and NET namespacing built in): %m");
++ else
++ log_error("clone() failed: %m");
++
+ goto finish;
+ }
+
diff --git a/0159-bash-completion-get-rid-of-awk-sed-and-grep.patch b/0159-bash-completion-get-rid-of-awk-sed-and-grep.patch
new file mode 100644
index 0000000..4290748
--- /dev/null
+++ b/0159-bash-completion-get-rid-of-awk-sed-and-grep.patch
@@ -0,0 +1,113 @@
+From 79453cbee691a52b48a8cb166a62de5a7dc999b9 Mon Sep 17 00:00:00 2001
+From: Harald Hoyer <harald at redhat.com>
+Date: Tue, 21 Feb 2012 15:48:24 +0100
+Subject: [PATCH] bash-completion: get rid of awk, sed and grep
+
+Get rid of "awk", "sed" and "grep" calls.
+This can be done entirely in bash!
+
+With help from Dave Reisner
+(cherry picked from commit e2e9329411a3753421e97c084d0f177003b20970)
+---
+ src/systemd-bash-completion.sh | 53 ++++++++++++++++++++++++++-------------
+ 1 files changed, 35 insertions(+), 18 deletions(-)
+
+diff --git a/src/systemd-bash-completion.sh b/src/systemd-bash-completion.sh
+index 176591f..eab290e 100644
+--- a/src/systemd-bash-completion.sh
++++ b/src/systemd-bash-completion.sh
+@@ -26,9 +26,11 @@ __contains_word () {
+ }
+
+ __filter_units_by_property () {
+- local property=$1 value=$2 ; shift ; shift
+- local -a units=( $* )
+- local -a props=( $(__systemctl show --property "$property" -- ${units[*]} | grep -v ^$) )
++ local property=$1 value=$2 ; shift 2
++ local units=("$@")
++ local props
++ IFS=$'\n' read -rd '' -a props < \
++ <(__systemctl show --property "$property" -- "${units[@]}")
+ for ((i=0; $i < ${#units[*]}; i++)); do
+ if [[ "${props[i]}" = "$property=$value" ]]; then
+ echo "${units[i]}"
+@@ -36,13 +38,20 @@ __filter_units_by_property () {
+ done
+ }
+
+-__get_all_units () { __systemctl list-units --all | awk ' {print $1}' ; }
+-__get_active_units () { __systemctl list-units | awk ' {print $1}' ; }
+-__get_inactive_units () { __systemctl list-units --all | awk '$3 == "inactive" {print $1}' ; }
+-__get_failed_units () { __systemctl list-units | awk '$3 == "failed" {print $1}' ; }
+-__get_enabled_units () { __systemctl list-unit-files | awk '$2 == "enabled" {print $1}' ; }
+-__get_disabled_units () { __systemctl list-unit-files | awk '$2 == "disabled" {print $1}' ; }
+-__get_masked_units () { __systemctl list-unit-files | awk '$2 == "masked" {print $1}' ; }
++__get_all_units () { __systemctl list-units --all \
++ | { while read a b; do echo "$a"; done; }; }
++__get_active_units () { __systemctl list-units \
++ | { while read a b; do echo "$a"; done; }; }
++__get_inactive_units () { __systemctl list-units --all \
++ | { while read a b c d; do [[ $c == "inactive" ]] && echo "$a"; done; }; }
++__get_failed_units () { __systemctl list-units \
++ | { while read a b c d; do [[ $c == "failed" ]] && echo "$a"; done; }; }
++__get_enabled_units () { __systemctl list-unit-files \
++ | { while read a b c ; do [[ $b == "enabled" ]] && echo "$a"; done; }; }
++__get_disabled_units () { __systemctl list-unit-files \
++ | { while read a b c ; do [[ $b == "disabled" ]] && echo "$a"; done; }; }
++__get_masked_units () { __systemctl list-unit-files \
++ | { while read a b c ; do [[ $b == "masked" ]] && echo "$a"; done; }; }
+
+ _systemctl () {
+ local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
+@@ -133,11 +142,17 @@ _systemctl () {
+
+ elif __contains_word "$verb" ${VERBS[STARTABLE_UNITS]}; then
+ comps=$( __filter_units_by_property CanStart yes \
+- $( __get_inactive_units | grep -Ev '\.(device|snapshot)$' ))
++ $( __get_inactive_units \
++ | while read line; do \
++ [[ "$line" =~ \.(device|snapshot)$ ]] || echo "$line"; \
++ done ))
+
+ elif __contains_word "$verb" ${VERBS[RESTARTABLE_UNITS]}; then
+ comps=$( __filter_units_by_property CanStart yes \
+- $( __get_all_units | grep -Ev '\.(device|snapshot|socket|timer)$' ))
++ $( __get_all_units \
++ | while read line; do \
++ [[ "$line" =~ \.(device|snapshot|socket|timer)$ ]] || echo "$line"; \
++ done ))
+
+ elif __contains_word "$verb" ${VERBS[STOPPABLE_UNITS]}; then
+ comps=$( __filter_units_by_property CanStop yes \
+@@ -161,13 +176,15 @@ _systemctl () {
+ comps=''
+
+ elif __contains_word "$verb" ${VERBS[JOBS]}; then
+- comps=$( __systemctl list-jobs | awk '{print $1}' )
++ comps=$( __systemctl list-jobs | { while read a b; do echo "$a"; done; } )
+
+ elif __contains_word "$verb" ${VERBS[SNAPSHOTS]}; then
+- comps=$( __systemctl list-units --type snapshot --full --all | awk '{print $1}' )
++ comps=$( __systemctl list-units --type snapshot --full --all \
++ | { while read a b; do echo "$a"; done; } )
+
+ elif __contains_word "$verb" ${VERBS[ENVS]}; then
+- comps=$( __systemctl show-environment | sed 's_\([^=]\+=\).*_\1_' )
++ comps=$( __systemctl show-environment \
++ | while read line; do echo "${line%%=*}=";done )
+ compopt -o nospace
+
+ elif __contains_word "$verb" ${VERBS[FILE]}; then
+@@ -180,9 +197,9 @@ _systemctl () {
+ }
+ complete -F _systemctl systemctl
+
+-__get_all_sessions () { systemd-loginctl list-sessions | awk '{print $1}' ; }
+-__get_all_users () { systemd-loginctl list-users | awk '{print $2}' ; }
+-__get_all_seats () { systemd-loginctl list-seats | awk '{print $1}' ; }
++__get_all_sessions () { systemd-loginctl list-sessions | { while read a b; do echo "$a"; done; } ; }
++__get_all_users () { systemd-loginctl list-users | { while read a b; do echo "$b"; done; } ; }
++__get_all_seats () { systemd-loginctl list-seats | { while read a b; do echo "$a"; done; } ; }
+
+ _systemd_loginctl () {
+ local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
diff --git a/0160-mount-properly-check-return-for-mount_add_.patch b/0160-mount-properly-check-return-for-mount_add_.patch
new file mode 100644
index 0000000..ec3093e
--- /dev/null
+++ b/0160-mount-properly-check-return-for-mount_add_.patch
@@ -0,0 +1,25 @@
+From 70cb1063f8588e659c6e0eb6ad544823a5d2cd98 Mon Sep 17 00:00:00 2001
+From: Dave Reisner <d at falconindy.com>
+Date: Fri, 17 Feb 2012 12:17:49 -0500
+Subject: [PATCH] mount: properly check return for mount_add_*
+
+Previously, mount_load_etc_fstab() could never fail for reasons other
+than a setmntent() or allocation failure.
+(cherry picked from commit 85eda5721f8d2a20482ef228d341fbbd134c6799)
+---
+ src/mount.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/src/mount.c b/src/mount.c
+index 8281082..ccf1e9c 100644
+--- a/src/mount.c
++++ b/src/mount.c
+@@ -1549,7 +1549,7 @@ static int mount_load_etc_fstab(Manager *m) {
+ free(what);
+ free(where);
+
+- if (r < 0)
++ if (k < 0)
+ r = k;
+ }
+
diff --git a/systemd.spec b/systemd.spec
index 0ad488d..d359b3e 100644
--- a/systemd.spec
+++ b/systemd.spec
@@ -2,7 +2,7 @@ Name: systemd
Url: http://www.freedesktop.org/wiki/Software/systemd
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Version: 37
-Release: 15%{?dist}
+Release: 16%{?dist}
License: GPLv2+
Group: System Environment/Base
Summary: A System and Service Manager
@@ -206,6 +206,13 @@ Patch0151: 0151-Fix-broken-Git-repository-URLs.patch
Patch0152: 0152-timedate-don-t-fail-if-NTP-is-not-installed.patch
Patch0153: 0153-namespace-temporaily-reset-umask-when-creating-priva.patch
Patch0154: 0154-logind-move-X11-socket.patch
+# from v44:
+Patch0155: 0155-fix-sparse-warnings.patch
+Patch0156: 0156-socket-fail-the-socket-if-the-service-keeps-dying-on.patch
+Patch0157: 0157-socket-rename-broken-failure-result-to-failed-perman.patch
+Patch0158: 0158-nspawn-be-less-cryptic-when-clone-fails.patch
+Patch0159: 0159-bash-completion-get-rid-of-awk-sed-and-grep.patch
+Patch0160: 0160-mount-properly-check-return-for-mount_add_.patch
# For sysvinit tools
Obsoletes: SysVinit < 2.86-24, sysvinit < 2.86-24
@@ -527,6 +534,12 @@ fi
%{_bindir}/systemd-sysv-convert
%changelog
+* Tue Mar 06 2012 Michal Schmidt <mschmidt at redhat.com> - 37-16
+- From upstream:
+ - avoid socket tarpits when the service keeps failing
+ - get rid of awk, sed, grep in bash completion
+ - and minor fixes
+
* Thu Mar 01 2012 Michal Schmidt <mschmidt at redhat.com> - 37-15
- logind: move X11 socket
More information about the scm-commits
mailing list