summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémi Cardona <remi@gentoo.org>2006-12-23 21:54:03 +0000
committerRémi Cardona <remi@gentoo.org>2006-12-23 21:54:03 +0000
commit8641686e6c78987b9b746068b488564206c33e45 (patch)
tree3cb84a98f99c1d652e32e3a62cfa07f1a50f2687 /gnome-base
parentStable on ppc wrt bug #151920. (diff)
downloadgentoo-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')
-rw-r--r--gnome-base/gnome-volume-manager/ChangeLog10
-rw-r--r--gnome-base/gnome-volume-manager/files/digest-gnome-volume-manager-2.15.0-r13
-rw-r--r--gnome-base/gnome-volume-manager/files/gnome-volume-manager-2.15.0-check_local_user.patch246
-rw-r--r--gnome-base/gnome-volume-manager/gnome-volume-manager-2.15.0-r1.ebuild62
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."
+}