diff options
author | Rémi Cardona <remi@gentoo.org> | 2006-12-23 21:54:03 +0000 |
---|---|---|
committer | Rémi Cardona <remi@gentoo.org> | 2006-12-23 21:54:03 +0000 |
commit | 8641686e6c78987b9b746068b488564206c33e45 (patch) | |
tree | 3cb84a98f99c1d652e32e3a62cfa07f1a50f2687 /gnome-base | |
parent | Stable on ppc wrt bug #151920. (diff) | |
download | gentoo-2-8641686e6c78987b9b746068b488564206c33e45.tar.gz gentoo-2-8641686e6c78987b9b746068b488564206c33e45.tar.bz2 gentoo-2-8641686e6c78987b9b746068b488564206c33e45.zip |
add backported fix from gvm 2.17 to fix a segfault on startup, fixes bug #154675, thanks to AJ Christensen for the patch
(Portage version: 2.1.2_rc4)
Diffstat (limited to 'gnome-base')
4 files changed, 320 insertions, 1 deletions
diff --git a/gnome-base/gnome-volume-manager/ChangeLog b/gnome-base/gnome-volume-manager/ChangeLog index a99b95b669e5..b83609d2db4a 100644 --- a/gnome-base/gnome-volume-manager/ChangeLog +++ b/gnome-base/gnome-volume-manager/ChangeLog @@ -1,6 +1,14 @@ # ChangeLog for gnome-base/gnome-volume-manager # Copyright 1999-2006 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-volume-manager/ChangeLog,v 1.76 2006/12/21 12:58:43 corsair Exp $ +# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-volume-manager/ChangeLog,v 1.77 2006/12/23 21:54:03 remi Exp $ + +*gnome-volume-manager-2.15.0-r1 (23 Dec 2006) + + 23 Dec 2006; Remi Cardona <remi@gentoo.org> + +files/gnome-volume-manager-2.15.0-check_local_user.patch, + +gnome-volume-manager-2.15.0-r1.ebuild: + add backported fix from gvm 2.17 to fix a segfault on startup, fixes bug + #154675, thanks to AJ Christensen for the patch 21 Dec 2006; Markus Rothe <corsair@gentoo.org> gnome-volume-manager-2.15.0.ebuild: diff --git a/gnome-base/gnome-volume-manager/files/digest-gnome-volume-manager-2.15.0-r1 b/gnome-base/gnome-volume-manager/files/digest-gnome-volume-manager-2.15.0-r1 new file mode 100644 index 000000000000..461fb7e2eaad --- /dev/null +++ b/gnome-base/gnome-volume-manager/files/digest-gnome-volume-manager-2.15.0-r1 @@ -0,0 +1,3 @@ +MD5 d723bc2069fd19cf1c31961fbc1cf3c8 gnome-volume-manager-2.15.0.tar.bz2 318479 +RMD160 eca6bb29b3173d8dbee36f4441b68c762732cb26 gnome-volume-manager-2.15.0.tar.bz2 318479 +SHA256 f3d2ce3e2f2a4b757d4688bae7f6b8418d11340618f15d34871a002516ab8e0e gnome-volume-manager-2.15.0.tar.bz2 318479 diff --git a/gnome-base/gnome-volume-manager/files/gnome-volume-manager-2.15.0-check_local_user.patch b/gnome-base/gnome-volume-manager/files/gnome-volume-manager-2.15.0-check_local_user.patch new file mode 100644 index 000000000000..985da86c8c7d --- /dev/null +++ b/gnome-base/gnome-volume-manager/files/gnome-volume-manager-2.15.0-check_local_user.patch @@ -0,0 +1,246 @@ +# patch to g-v-m 2.15.0 to fix the startx session bug which is caused by +# gvm_local_user, where ut_line is returned as ttyN rather than :0. +=================================================================== +RCS file: src/manager.c,v +retrieving revision 1.152 +retrieving revision 1.153 +diff -u -r1.152 -r1.153 +--- src/manager.c 2006/08/07 13:47:31 1.152 ++++ src/manager.c 2006/08/11 18:01:08 1.153 +@@ -1717,6 +1717,58 @@ + } + + ++static gboolean ++gvm_mount_options (GPtrArray *options, guint32 opts, const char *type, const char *where) ++{ ++ char *option, *key, *tmp, *p; ++ GSList *list, *l, *n; ++ GConfClient *gconf; ++ const char *dir; ++ ++ if (!strncmp (where, "/org/freedesktop/Hal/", 21)) { ++ /* flatten the UDI */ ++ dir = p = tmp = g_strdup (where); ++ while (*p != '\0') { ++ if (*p == '/') ++ *p = '_'; ++ p++; ++ } ++ } else { ++ dir = where; ++ tmp = NULL; ++ } ++ ++ key = g_strdup_printf ("/system/storage/%s/%s/mount_options", type, dir); ++ g_free (tmp); ++ ++ gconf = gconf_client_get_default (); ++ list = gconf_client_get_list (gconf, key, GCONF_VALUE_STRING, NULL); ++ g_object_unref (gconf); ++ g_free (key); ++ ++ if (list == NULL) { ++ fprintf (stderr, "no mount options found for %s::%s\n", type, where); ++ return FALSE; ++ } ++ ++ for (l = list; l != NULL; l = n) { ++ option = l->data; ++ n = l->next; ++ ++ g_ptr_array_add (options, option); ++ ++ g_slist_free_1 (l); ++ } ++ ++ if (opts & MOUNT_UID) { ++ option = g_strdup_printf ("uid=%u", getuid ()); ++ g_ptr_array_add (options, option); ++ } ++ ++ return TRUE; ++} ++ ++ + /* + * gvm_device_mount - mount the given device. + * +@@ -1761,10 +1813,13 @@ + + return retval; + } else { +- char *mount_point, *fstype, fmask_opt[12], *charset_opt = NULL; ++ char *mount_point, *fstype, *drive, **moptions, fmask_opt[12], *charset_opt = NULL; + DBusMessage *dmesg, *reply; ++ gboolean freev = FALSE; + GPtrArray *options; ++ guint32 opts = 0; + DBusError error; ++ size_t i, j; + + if (!(dmesg = dbus_message_new_method_call ("org.freedesktop.Hal", udi, + "org.freedesktop.Hal.Device.Volume", +@@ -1773,26 +1828,48 @@ + return FALSE; + } + ++ if ((moptions = libhal_device_get_property_strlist (hal_ctx, udi, "volume.mount.valid_options", NULL))) { ++ for (i = 0; moptions[i]; i++) { ++ for (j = 0; j < G_N_ELEMENTS (mount_options); j++) { ++ if (!strcmp (moptions[i], mount_options[j].name)) ++ opts |= mount_options[j].flag; ++ } ++ } ++ ++ libhal_free_string_array (moptions); ++ } ++ + options = g_ptr_array_new (); ++ ++ /* check volume-specific mount options */ ++ if (gvm_mount_options (options, opts, "volumes", udi)) { ++ freev = TRUE; ++ goto mount; ++ } ++ ++ /* check drive specific mount options */ ++ if ((drive = libhal_device_get_property_string (hal_ctx, udi, "block.storage_device", NULL))) { ++ if (gvm_mount_options (options, opts, "drives", drive)) { ++ libhal_free_string (drive); ++ freev = TRUE; ++ goto mount; ++ } ++ libhal_free_string (drive); ++ } ++ + if ((fstype = libhal_device_get_property_string (hal_ctx, udi, "volume.fstype", NULL))) { +- char **moptions = NULL; + const char *iocharset; +- guint32 opts = 0; + char uid[32]; +- size_t i, j; + mode_t mask; + +- if ((moptions = libhal_device_get_property_strlist (hal_ctx, udi, "volume.mount.valid_options", NULL))) { +- for (i = 0; moptions[i]; i++) { +- for (j = 0; j < G_N_ELEMENTS (mount_options); j++) { +- if (!strcmp (moptions[i], mount_options[j].name)) +- opts |= mount_options[j].flag; +- } +- } +- +- libhal_free_string_array (moptions); ++ /* fall back to using fstype-specific mount options */ ++ if (gvm_mount_options (options, opts, "default_options", fstype)) { ++ libhal_free_string (fstype); ++ freev = TRUE; ++ goto mount; + } + ++ /* take our best guess at what the user would want */ + if (!strcmp (fstype, "vfat")) { + if (opts & MOUNT_NOEXEC) + g_ptr_array_add (options, "noexec"); +@@ -1843,9 +1920,11 @@ + g_ptr_array_add (options, uid); + } + +- g_free (fstype); ++ libhal_free_string (fstype); + } + ++ mount: ++ + mount_point = ""; + fstype = ""; + +@@ -1857,6 +1936,11 @@ + return FALSE; + } + ++ if (freev) { ++ for (i = 0; i < options->len; i++) ++ g_free (options->pdata[i]); ++ } ++ + g_ptr_array_free (options, TRUE); + g_free (charset_opt); + +@@ -3080,31 +3164,64 @@ + } + + ++enum { ++ LOCAL_USER_CHECKED = (1 << 0), ++ LOCAL_USER_FOUND = (1 << 1) ++}; ++ + /* checks that the user is logged-in at a local X session (which does not necessarily infer an *active* session) */ + static gboolean + gvm_local_user (void) + { +- gboolean local = FALSE; ++ static guint32 local = 0; ++ struct dirent *dent; + struct utmp *utmp; + const char *user; +- size_t ulen; ++ char *vtend; ++ size_t n; ++ DIR *dir; ++ int vt; ++ ++ if (local & LOCAL_USER_CHECKED) ++ return (local & LOCAL_USER_FOUND); + + user = g_get_user_name (); +- ulen = strlen (user); ++ n = strlen (user); + +- setutent (); ++ if (!(dir = opendir (GVM_CONSOLE_AUTH_DIR))) ++ goto fallback; + +- while (!local && (utmp = getutent ())) { +- if (utmp->ut_type != USER_PROCESS || strncmp (utmp->ut_user, user, ulen) != 0) +- continue; ++ /* this works for pam_console ($path/user) and pam_foreground ($path/user:vt) - see bug #336932 */ ++ while ((dent = readdir (dir))) { ++ if (!strncmp (user, dent->d_name, n) && dent->d_name[n] == '\0' ++ || (dent->d_name[n] == ':' && ((vt = strtol (dent->d_name + n + 1, &vtend, 10)) >= 0) && *vtend == '\0')) { ++ local = LOCAL_USER_FOUND; ++ break; ++ } ++ } ++ ++ closedir (dir); ++ ++ fallback: ++ ++ if (!(local & LOCAL_USER_FOUND)) { ++ setutent (); ++ ++ while (!(local & LOCAL_USER_FOUND) && (utmp = getutent ())) { ++ if (utmp->ut_type != USER_PROCESS || strncmp (utmp->ut_user, user, n) != 0) ++ continue; ++ ++ /* only accept local X sessions or local tty's (user started X via `startx`) */ ++ local = utmp->ut_line[0] == ':' && utmp->ut_line[1] >= '0' && utmp->ut_line[1] <= '9' ++ || !strncmp (utmp->ut_line, "tty", 3) ? LOCAL_USER_FOUND : 0; ++ } + +- /* only accept local X sessions */ +- local = utmp->ut_line[0] == ':' && utmp->ut_line[1] >= '0' && utmp->ut_line[1] <= '9'; ++ endutent (); + } + +- endutent (); ++ local |= LOCAL_USER_CHECKED; + +- return local; ++ return (local & LOCAL_USER_FOUND); + } + + /* checks that the user is at the local active X session */ + diff --git a/gnome-base/gnome-volume-manager/gnome-volume-manager-2.15.0-r1.ebuild b/gnome-base/gnome-volume-manager/gnome-volume-manager-2.15.0-r1.ebuild new file mode 100644 index 000000000000..958d56b8bb72 --- /dev/null +++ b/gnome-base/gnome-volume-manager/gnome-volume-manager-2.15.0-r1.ebuild @@ -0,0 +1,62 @@ +# Copyright 1999-2006 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/gnome-base/gnome-volume-manager/gnome-volume-manager-2.15.0-r1.ebuild,v 1.1 2006/12/23 21:54:03 remi Exp $ + +inherit gnome2 eutils autotools + +DESCRIPTION="Daemon that enforces volume-related policies" +HOMEPAGE="http://www.gnome.org/" + +LICENSE="GPL-2" +SLOT="0" +KEYWORDS="~alpha amd64 ~ia64 ppc ppc64 sparc x86" +IUSE="crypt debug doc" + +RDEPEND="gnome-base/nautilus + >=gnome-base/libgnomeui-2.1.5 + || ( + >=dev-libs/dbus-glib-0.71 + ( <sys-apps/dbus-0.90 >=sys-apps/dbus-0.31 ) + ) + >=sys-apps/hal-0.5.6 + >=x11-libs/gtk+-2.6 + >=gnome-base/libglade-2 + >=x11-libs/libnotify-0.3 + >=gnome-base/gconf-2 + >=gnome-base/control-center-2.0 + gnome-base/gnome-mime-data + gnome-base/gnome-mount" + +DEPEND="${RDEPEND} + sys-devel/gettext + >=dev-util/pkgconfig-0.20 + >=dev-util/intltool-0.35" + +DOCS="AUTHORS ChangeLog README HACKING NEWS TODO" + +src_unpack() { + unpack ${A} + cd ${S} + + epatch "${FILESDIR}/${P}-check_local_user.patch" +} + +pkg_setup() { + G2CONF="${G2CONF} \ + $(use_enable crypt) \ + $(use_enable debug) \ + $(use_enable doc)" + + # FIXME: We should be more intelligent about disabling multiuser support + # (like enable it when pam_console is available?). For now, this is a + # slightly nicer solution than applying ${PN}-1.5.9-no-pam_console.patch + G2CONF="${G2CONF} --disable-multiuser" +} + +pkg_postinst() { + gnome2_pkg_postinst + + einfo "To start the gnome-volume-manager daemon you need to configure" + einfo "it through it's preferences capplet. Also the HAL daemon (hald)" + einfo "needs to be running or it will shut down." +} |