diff --git a/gdm-2.23.92-force-active-vt.patch b/gdm-2.23.92-force-active-vt.patch deleted file mode 100644 index 5a0f5e8..0000000 --- a/gdm-2.23.92-force-active-vt.patch +++ /dev/null @@ -1,172 +0,0 @@ -commit 01247e06779bef0b4619d6807f31e118d5b55cf0 -Author: Ray Strode -Date: Thu Sep 11 12:54:19 2008 -0400 - - Force vt if force-display-on-active-vt is set - - This will allow plymouth and gdm to transition smoothly - -diff --git a/configure.ac b/configure.ac -index 4a08418..8891882 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -1311,6 +1311,23 @@ fi - AC_SUBST(GDM_XAUTH_DIR) - - dnl --------------------------------------------------------------------------- -+dnl - Directory to spool events from other processes -+dnl --------------------------------------------------------------------------- -+ -+AC_ARG_WITH(spool-dir, -+ AS_HELP_STRING([--with-spool-dir=], -+ [spool directory])) -+ -+if ! test -z "$with_spool_dir"; then -+ GDM_SPOOL_DIR=$with_spool_dir -+else -+ GDM_SPOOL_DIR=${localstatedir}/spool/gdm -+fi -+ -+AC_SUBST(GDM_SPOOL_DIR) -+ -+ -+dnl --------------------------------------------------------------------------- - dnl - Finish - dnl --------------------------------------------------------------------------- - -diff --git a/daemon/Makefile.am b/daemon/Makefile.am -index 1846ed2..ced03a3 100644 ---- a/daemon/Makefile.am -+++ b/daemon/Makefile.am -@@ -16,6 +16,7 @@ INCLUDES = \ - -DPIXMAPDIR=\"$(pixmapdir)\" \ - -DSBINDIR=\"$(sbindir)\" \ - -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \ -+ -DGDM_SPOOL_DIR=\"$(GDM_SPOOL_DIR)\" \ - -DGDM_XAUTH_DIR=\"$(GDM_XAUTH_DIR)\" \ - -DGDM_DEFAULTS_CONF=\"$(GDM_DEFAULTS_CONF)\" \ - -DGDM_CUSTOM_CONF=\"$(GDM_CUSTOM_CONF)\" \ -diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c -index ca37a2a..e6f821f 100644 ---- a/daemon/gdm-server.c -+++ b/daemon/gdm-server.c -@@ -34,6 +34,8 @@ - #include - #include - -+#include -+ - #include - #include - #include -@@ -663,6 +665,56 @@ gdm_server_spawn (GdmServer *server, - return ret; - } - -+static gboolean -+should_force_display_on_active_vt (void) -+{ -+ gboolean should_force_display_on_active_vt; -+ -+ should_force_display_on_active_vt = g_file_test (GDM_SPOOL_DIR "/force-display-on-active-vt", -+ G_FILE_TEST_EXISTS); -+ g_unlink (GDM_SPOOL_DIR "/force-display-on-active-vt"); -+ -+ return should_force_display_on_active_vt; -+} -+ -+static int -+get_active_vt (void) -+{ -+ int console_fd; -+ struct vt_stat console_state = { 0 }; -+ -+ console_fd = open ("/dev/tty0", O_RDONLY | O_NOCTTY); -+ -+ if (console_fd < 0) { -+ goto out; -+ } -+ -+ if (ioctl (console_fd, VT_GETSTATE, &console_state) < 0) { -+ goto out; -+ } -+ -+out: -+ if (console_fd >= 0) { -+ close (console_fd); -+ } -+ -+ return console_state.v_active; -+} -+ -+static char * -+get_active_vt_as_string (void) -+{ -+ int vt; -+ -+ vt = get_active_vt (); -+ -+ if (vt <= 0) { -+ return NULL; -+ } -+ -+ return g_strdup_printf ("vt%d", vt); -+} -+ - /** - * gdm_server_start: - * @disp: Pointer to a GdmDisplay structure -@@ -675,8 +727,18 @@ gdm_server_start (GdmServer *server) - { - gboolean res; - -- /* fork X server process */ -- res = gdm_server_spawn (server, NULL); -+ if (should_force_display_on_active_vt ()) { -+ char *vt; -+ -+ g_free (server->priv->command); -+ server->priv->command = g_strdup (X_SERVER " -nr -verbose"); -+ vt = get_active_vt_as_string (); -+ res = gdm_server_spawn (server, vt); -+ g_free (vt); -+ } else { -+ /* fork X server process */ -+ res = gdm_server_spawn (server, NULL); -+ } - - return res; - } -diff --git a/data/Makefile.am b/data/Makefile.am -index 30e1f55..400c43d 100644 ---- a/data/Makefile.am -+++ b/data/Makefile.am -@@ -13,6 +13,7 @@ predir = $(gdmconfdir)/PreSession - postlogindir = $(gdmconfdir)/PostLogin - workingdir = $(GDM_WORKING_DIR) - xauthdir = $(GDM_XAUTH_DIR) -+spooldir = $(GDM_SPOOL_DIR) - - if OS_SOLARIS - DISTRO_XSESSION=$(srcdir)/Xsession.solaris -@@ -132,6 +133,7 @@ uninstall-hook: - -rf \ - $(DESTDIR)$(workingdir)/.gconf.mandatory \ - $(DESTDIR)$(xauthdir) -+ $(DESTDIR)$(spooldir) - - install-data-hook: gdm.conf-custom Xsession Init PostSession PreSession gconf.path - if test '!' -d $(DESTDIR)$(gdmconfdir); then \ -@@ -219,6 +221,12 @@ install-data-hook: gdm.conf-custom Xsession Init PostSession PreSession gconf.pa - chown root:gdm $(DESTDIR)$(workingdir) || : ; \ - fi - -+ if test '!' -d $(DESTDIR)$(spooldir); then \ -+ $(mkinstalldirs) $(DESTDIR)$(spooldir); \ -+ chmod 775 $(DESTDIR)$(spooldir); \ -+ chown root:gdm $(DESTDIR)$(spooldir) || : ; \ -+ fi -+ - $(INSTALL_DATA) $(srcdir)/gconf.path $(DESTDIR)$(workingdir)/.gconf.path - gconftool-2 --direct --config-source=xml:merged:$(DESTDIR)$(workingdir)/.gconf.mandatory --recursive-unset / - gconftool-2 --direct --config-source=xml:merged:$(DESTDIR)$(workingdir)/.gconf.mandatory --load $(srcdir)/session-setup.entries diff --git a/gdm-2.24.0-force-active-vt.patch b/gdm-2.24.0-force-active-vt.patch new file mode 100644 index 0000000..935f1db --- /dev/null +++ b/gdm-2.24.0-force-active-vt.patch @@ -0,0 +1,432 @@ +diff -ur gdm-2.24.0/configure.ac new/configure.ac +--- gdm-2.24.0/configure.ac 2008-09-22 13:01:25.000000000 -0400 ++++ new/configure.ac 2008-09-30 22:32:05.000000000 -0400 +@@ -1311,6 +1311,23 @@ + AC_SUBST(GDM_XAUTH_DIR) + + dnl --------------------------------------------------------------------------- ++dnl - Directory to spool events from other processes ++dnl --------------------------------------------------------------------------- ++ ++AC_ARG_WITH(spool-dir, ++ AS_HELP_STRING([--with-spool-dir=], ++ [spool directory])) ++ ++if ! test -z "$with_spool_dir"; then ++ GDM_SPOOL_DIR=$with_spool_dir ++else ++ GDM_SPOOL_DIR=${localstatedir}/spool/gdm ++fi ++ ++AC_SUBST(GDM_SPOOL_DIR) ++ ++ ++dnl --------------------------------------------------------------------------- + dnl - Finish + dnl --------------------------------------------------------------------------- + +diff -ur gdm-2.24.0/daemon/gdm-display.c new/daemon/gdm-display.c +--- gdm-2.24.0/daemon/gdm-display.c 2008-09-22 13:01:22.000000000 -0400 ++++ new/daemon/gdm-display.c 2008-10-15 17:03:39.000000000 -0400 +@@ -62,7 +62,9 @@ + gsize x11_cookie_size; + GdmDisplayAccessFile *access_file; + +- gboolean is_local; ++ guint is_local : 1; ++ guint force_active_vt : 1; ++ + guint finish_idle_id; + + GdmSlaveProxy *slave_proxy; +@@ -81,6 +83,7 @@ + PROP_X11_COOKIE, + PROP_X11_AUTHORITY_FILE, + PROP_IS_LOCAL, ++ PROP_FORCE_ACTIVE_VT, + PROP_SLAVE_COMMAND, + }; + +@@ -491,9 +494,10 @@ + gdm_slave_proxy_set_log_path (display->priv->slave_proxy, log_path); + g_free (log_path); + +- command = g_strdup_printf ("%s --display-id %s", ++ command = g_strdup_printf ("%s --display-id %s %s", + display->priv->slave_command, +- display->priv->id); ++ display->priv->id, ++ display->priv->force_active_vt? "--force-active-vt" : ""); + gdm_slave_proxy_set_command (display->priv->slave_proxy, command); + g_free (command); + +@@ -702,6 +706,13 @@ + } + + static void ++_gdm_display_set_force_active_vt (GdmDisplay *display, ++ gboolean force_active_vt) ++{ ++ display->priv->force_active_vt = force_active_vt; ++} ++ ++static void + _gdm_display_set_slave_command (GdmDisplay *display, + const char *command) + { +@@ -744,6 +755,9 @@ + case PROP_IS_LOCAL: + _gdm_display_set_is_local (self, g_value_get_boolean (value)); + break; ++ case PROP_FORCE_ACTIVE_VT: ++ _gdm_display_set_force_active_vt (self, g_value_get_boolean (value)); ++ break; + case PROP_SLAVE_COMMAND: + _gdm_display_set_slave_command (self, g_value_get_string (value)); + break; +@@ -792,6 +806,9 @@ + case PROP_IS_LOCAL: + g_value_set_boolean (value, self->priv->is_local); + break; ++ case PROP_FORCE_ACTIVE_VT: ++ g_value_set_boolean (value, self->priv->force_active_vt); ++ break; + case PROP_SLAVE_COMMAND: + g_value_set_string (value, self->priv->slave_command); + break; +@@ -960,6 +977,13 @@ + NULL, + TRUE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); ++ g_object_class_install_property (object_class, ++ PROP_FORCE_ACTIVE_VT, ++ g_param_spec_boolean ("force-active-vt", ++ NULL, ++ NULL, ++ FALSE, ++ G_PARAM_READWRITE | G_PARAM_CONSTRUCT)); + + g_object_class_install_property (object_class, + PROP_SLAVE_COMMAND, +diff -ur gdm-2.24.0/daemon/gdm-server.c new/daemon/gdm-server.c +--- gdm-2.24.0/daemon/gdm-server.c 2008-09-22 13:01:22.000000000 -0400 ++++ new/daemon/gdm-server.c 2008-10-15 16:24:46.000000000 -0400 +@@ -34,6 +34,8 @@ + #include + #include + ++#include ++ + #include + #include + #include +@@ -663,6 +665,44 @@ + return ret; + } + ++static int ++get_active_vt (void) ++{ ++ int console_fd; ++ struct vt_stat console_state = { 0 }; ++ ++ console_fd = open ("/dev/tty0", O_RDONLY | O_NOCTTY); ++ ++ if (console_fd < 0) { ++ goto out; ++ } ++ ++ if (ioctl (console_fd, VT_GETSTATE, &console_state) < 0) { ++ goto out; ++ } ++ ++out: ++ if (console_fd >= 0) { ++ close (console_fd); ++ } ++ ++ return console_state.v_active; ++} ++ ++static char * ++get_active_vt_as_string (void) ++{ ++ int vt; ++ ++ vt = get_active_vt (); ++ ++ if (vt <= 0) { ++ return NULL; ++ } ++ ++ return g_strdup_printf ("vt%d", vt); ++} ++ + /** + * gdm_server_start: + * @disp: Pointer to a GdmDisplay structure +@@ -681,6 +721,21 @@ + return res; + } + ++gboolean ++gdm_server_start_on_active_vt (GdmServer *server) ++{ ++ gboolean res; ++ char *vt; ++ ++ g_free (server->priv->command); ++ server->priv->command = g_strdup (X_SERVER " -nr -verbose"); ++ vt = get_active_vt_as_string (); ++ res = gdm_server_spawn (server, vt); ++ g_free (vt); ++ ++ return res; ++} ++ + static void + server_died (GdmServer *server) + { +diff -ur gdm-2.24.0/daemon/gdm-server.h new/daemon/gdm-server.h +--- gdm-2.24.0/daemon/gdm-server.h 2008-07-10 11:07:42.000000000 -0400 ++++ new/daemon/gdm-server.h 2008-10-15 16:21:36.000000000 -0400 +@@ -56,6 +56,7 @@ + GdmServer * gdm_server_new (const char *display_id, + const char *auth_file); + gboolean gdm_server_start (GdmServer *server); ++gboolean gdm_server_start_on_active_vt (GdmServer *server); + gboolean gdm_server_stop (GdmServer *server); + char * gdm_server_get_display_device (GdmServer *server); + +diff -ur gdm-2.24.0/daemon/gdm-simple-slave.c new/daemon/gdm-simple-slave.c +--- gdm-2.24.0/daemon/gdm-simple-slave.c 2008-09-22 13:01:22.000000000 -0400 ++++ new/daemon/gdm-simple-slave.c 2008-10-15 16:29:48.000000000 -0400 +@@ -84,6 +84,7 @@ + + enum { + PROP_0, ++ FORCE_ACTIVE_VT + }; + + static void gdm_simple_slave_class_init (GdmSimpleSlaveClass *klass); +@@ -1021,11 +1031,13 @@ + char *display_name; + char *auth_file; + gboolean display_is_local; ++ gboolean force_active_vt; + + g_object_get (slave, + "display-is-local", &display_is_local, + "display-name", &display_name, + "display-x11-authority-file", &auth_file, ++ "force-active-vt", &force_active_vt, + NULL); + + /* if this is local display start a server if one doesn't +@@ -1057,7 +1069,10 @@ + G_CALLBACK (on_server_ready), + slave); + +- res = gdm_server_start (slave->priv->server); ++ if (force_active_vt) ++ res = gdm_server_start_on_active_vt (slave->priv->server); ++ else ++ res = gdm_server_start (slave->priv->server); + if (! res) { + g_warning (_("Could not start the X " + "server (your graphical environment) " +@@ -1207,12 +1222,14 @@ + } + + GdmSlave * +-gdm_simple_slave_new (const char *id) ++gdm_simple_slave_new (const char *id, ++ gboolean force_active_vt) + { + GObject *object; + + object = g_object_new (GDM_TYPE_SIMPLE_SLAVE, + "display-id", id, ++ "force-active-vt", force_active_vt, + NULL); + + return GDM_SLAVE (object); +diff -ur gdm-2.24.0/daemon/gdm-simple-slave.h new/daemon/gdm-simple-slave.h +--- gdm-2.24.0/daemon/gdm-simple-slave.h 2008-07-10 11:07:42.000000000 -0400 ++++ new/daemon/gdm-simple-slave.h 2008-10-15 16:03:43.000000000 -0400 +@@ -48,7 +48,8 @@ + } GdmSimpleSlaveClass; + + GType gdm_simple_slave_get_type (void); +-GdmSlave * gdm_simple_slave_new (const char *id); ++GdmSlave * gdm_simple_slave_new (const char *id, ++ gboolean force_active_vt); + + G_END_DECLS + +diff -ur gdm-2.24.0/daemon/gdm-slave.c new/daemon/gdm-slave.c +--- gdm-2.24.0/daemon/gdm-slave.c 2008-07-28 22:40:42.000000000 -0400 ++++ new/daemon/gdm-slave.c 2008-10-15 16:31:33.000000000 -0400 +@@ -83,6 +84,7 @@ + char *display_hostname; + gboolean display_is_local; + gboolean display_is_parented; ++ gboolean force_active_vt; + char *display_seat_id; + char *display_x11_authority_file; + char *parent_display_name; +@@ -99,6 +101,7 @@ + PROP_DISPLAY_NUMBER, + PROP_DISPLAY_HOSTNAME, + PROP_DISPLAY_IS_LOCAL, ++ PROP_FORCE_ACTIVE_VT, + PROP_DISPLAY_SEAT_ID, + PROP_DISPLAY_X11_AUTHORITY_FILE + }; +@@ -1110,6 +1184,13 @@ + } + + static void ++_gdm_slave_set_force_active_vt (GdmSlave *slave, ++ gboolean force_active_vt) ++{ ++ slave->priv->force_active_vt = force_active_vt; ++} ++ ++static void + gdm_slave_set_property (GObject *object, + guint prop_id, + const GValue *value, +@@ -1141,6 +1222,9 @@ + case PROP_DISPLAY_IS_LOCAL: + _gdm_slave_set_display_is_local (self, g_value_get_boolean (value)); + break; ++ case PROP_FORCE_ACTIVE_VT: ++ _gdm_slave_set_force_active_vt (self, g_value_get_boolean (value)); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -1179,6 +1263,9 @@ + case PROP_DISPLAY_IS_LOCAL: + g_value_set_boolean (value, self->priv->display_is_local); + break; ++ case PROP_FORCE_ACTIVE_VT: ++ g_value_set_boolean (value, self->priv->force_active_vt); ++ break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; +@@ -1304,6 +1391,14 @@ + TRUE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + ++ g_object_class_install_property (object_class, ++ PROP_FORCE_ACTIVE_VT, ++ g_param_spec_boolean ("force-active-vt", ++ "Force Active VT", ++ "Force display to active VT", ++ TRUE, ++ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); ++ + signals [STOPPED] = + g_signal_new ("stopped", + G_TYPE_FROM_CLASS (object_class), +diff -ur gdm-2.24.0/daemon/gdm-static-display.c new/daemon/gdm-static-display.c +--- gdm-2.24.0/daemon/gdm-static-display.c 2008-07-10 11:07:42.000000000 -0400 ++++ new/daemon/gdm-static-display.c 2008-10-15 16:24:38.000000000 -0400 +@@ -86,10 +86,26 @@ + } + + static gboolean ++triggered_to_force_display_on_active_vt (void) ++{ ++ gboolean should_force_display_on_active_vt; ++ ++ should_force_display_on_active_vt = g_file_test (GDM_SPOOL_DIR "/force-display-on-active-vt", ++ G_FILE_TEST_EXISTS); ++ g_unlink (GDM_SPOOL_DIR "/force-display-on-active-vt"); ++ ++ return should_force_display_on_active_vt; ++} ++ ++static gboolean + gdm_static_display_manage (GdmDisplay *display) + { + g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE); + ++ if (triggered_to_force_display_on_active_vt ()) { ++ g_object_set (display, "force-active-vt", TRUE, NULL); ++ } ++ + GDM_DISPLAY_CLASS (gdm_static_display_parent_class)->manage (display); + + return TRUE; +diff -ur gdm-2.24.0/daemon/Makefile.am new/daemon/Makefile.am +--- gdm-2.24.0/daemon/Makefile.am 2008-08-01 12:39:12.000000000 -0400 ++++ new/daemon/Makefile.am 2008-09-30 22:32:05.000000000 -0400 +@@ -16,6 +16,7 @@ + -DPIXMAPDIR=\"$(pixmapdir)\" \ + -DSBINDIR=\"$(sbindir)\" \ + -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \ ++ -DGDM_SPOOL_DIR=\"$(GDM_SPOOL_DIR)\" \ + -DGDM_XAUTH_DIR=\"$(GDM_XAUTH_DIR)\" \ + -DGDM_DEFAULTS_CONF=\"$(GDM_DEFAULTS_CONF)\" \ + -DGDM_CUSTOM_CONF=\"$(GDM_CUSTOM_CONF)\" \ +diff -ur gdm-2.24.0/daemon/simple-slave-main.c new/daemon/simple-slave-main.c +--- gdm-2.24.0/daemon/simple-slave-main.c 2008-08-21 00:31:47.000000000 -0400 ++++ new/daemon/simple-slave-main.c 2008-10-15 16:25:38.000000000 -0400 +@@ -171,10 +171,12 @@ + GdmSlave *slave; + static char *display_id = NULL; + static gboolean debug = FALSE; ++ static gboolean force_active_vt = FALSE; + GdmSignalHandler *signal_handler; + static GOptionEntry entries [] = { + { "debug", 0, 0, G_OPTION_ARG_NONE, &debug, N_("Enable debugging code"), NULL }, + { "display-id", 0, 0, G_OPTION_ARG_STRING, &display_id, N_("Display ID"), N_("id") }, ++ { "force-active-vt", 0, 0, G_OPTION_ARG_NONE, &force_active_vt, N_("Force X to start on active vt"), NULL }, + { NULL } + }; + +@@ -231,7 +233,7 @@ + gdm_signal_handler_add (signal_handler, SIGUSR1, signal_cb, NULL); + gdm_signal_handler_add (signal_handler, SIGUSR2, signal_cb, NULL); + +- slave = gdm_simple_slave_new (display_id); ++ slave = gdm_simple_slave_new (display_id, force_active_vt); + if (slave == NULL) { + goto out; + } +diff -ur gdm-2.24.0/data/Makefile.am new/data/Makefile.am +--- gdm-2.24.0/data/Makefile.am 2008-09-22 13:01:23.000000000 -0400 ++++ new/data/Makefile.am 2008-09-30 22:32:05.000000000 -0400 +@@ -13,6 +13,7 @@ + postlogindir = $(gdmconfdir)/PostLogin + workingdir = $(GDM_WORKING_DIR) + xauthdir = $(GDM_XAUTH_DIR) ++spooldir = $(GDM_SPOOL_DIR) + + if OS_SOLARIS + DISTRO_XSESSION=$(srcdir)/Xsession.solaris +@@ -132,6 +133,7 @@ + -rf \ + $(DESTDIR)$(workingdir)/.gconf.mandatory \ + $(DESTDIR)$(xauthdir) ++ $(DESTDIR)$(spooldir) + + install-data-hook: gdm.conf-custom Xsession Init PostSession PreSession gconf.path + if test '!' -d $(DESTDIR)$(gdmconfdir); then \ +@@ -219,6 +221,12 @@ + chown root:gdm $(DESTDIR)$(workingdir) || : ; \ + fi + ++ if test '!' -d $(DESTDIR)$(spooldir); then \ ++ $(mkinstalldirs) $(DESTDIR)$(spooldir); \ ++ chmod 775 $(DESTDIR)$(spooldir); \ ++ chown root:gdm $(DESTDIR)$(spooldir) || : ; \ ++ fi ++ + $(INSTALL_DATA) $(srcdir)/gconf.path $(DESTDIR)$(workingdir)/.gconf.path + gconftool-2 --direct --config-source=xml:merged:$(DESTDIR)$(workingdir)/.gconf.mandatory --recursive-unset / + gconftool-2 --direct --config-source=xml:merged:$(DESTDIR)$(workingdir)/.gconf.mandatory --load $(srcdir)/session-setup.entries diff --git a/gdm.spec b/gdm.spec index 1d4418b..e377014 100644 --- a/gdm.spec +++ b/gdm.spec @@ -16,7 +16,7 @@ Summary: The GNOME Display Manager Name: gdm Version: 2.24.0 -Release: 9%{?dist} +Release: 10%{?dist} Epoch: 1 License: GPLv2+ Group: User Interface/X @@ -80,7 +80,7 @@ BuildRequires: libxklavier-devel Requires: audit-libs >= %{libauditver} Patch1: xkb-groups.patch -Patch2: gdm-2.23.92-force-active-vt.patch +Patch2: gdm-2.24.0-force-active-vt.patch Patch3: gdm-2.23.92-save-root-window.patch # http://bugzilla.gnome.org/show_bug.cgi?id=552578 Patch4: username-leak.patch @@ -347,6 +347,9 @@ fi %{_datadir}/gnome-2.0/ui/GNOME_FastUserSwitchApplet.xml %changelog +* Wed Oct 15 2008 Ray Strode - 1:2.24.0-10 +- Rework "force X on vt1" code to work after the user logs out + * Wed Oct 15 2008 Matthias Clasen - 1:2.24.0-9 - Save some space