openbsd-ports/devel/glib2/patches/patch-gio_gunixmounts_c
ajacoutot cf5a80bff3 *** HEADS UP!
Major update to glib2-2.26.0.
This starts a flood commit of several big updates (gtk+2 and GNOME 2.32).

Please note that there will be some WANTLIB/DEPENDS breakage probably,
this went into several bulks but it's impossible to catch everything.
Any gtk+2/glib2 related build failures, please talk to me or jasper@

The ports tree is expected to be in a unconsistent state for a couple of
days to give us time to fix everything we didn't spot or any runtime
issue with the latest GNOME.
We do this now so that we have packages with all the latest major bumped
libraries at p2k10.

Thanks to landry@ and his zomg!cluster for the bulks and reports.

ok jasper@
2010-09-30 07:17:19 +00:00

155 lines
4.3 KiB
Plaintext

$OpenBSD: patch-gio_gunixmounts_c,v 1.2 2010/09/30 07:17:19 ajacoutot Exp $
https://bugzilla.gnome.org/show_bug.cgi?id=583330
From FreeBSD: poll the list of mounted filesystems since we can't rely
on checking for mtab updates like other systems.
--- gio/gunixmounts.c.orig Mon Aug 9 15:34:46 2010
+++ gio/gunixmounts.c Mon Sep 27 14:42:36 2010
@@ -135,6 +135,9 @@ struct _GUnixMountMonitor {
GFileMonitor *fstab_monitor;
GFileMonitor *mtab_monitor;
+
+ guint mount_poller_source;
+ GList *mount_poller_mounts;
};
struct _GUnixMountMonitorClass {
@@ -146,6 +149,8 @@ static GUnixMountMonitor *the_mount_monitor = NULL;
static GList *_g_get_unix_mounts (void);
static GList *_g_get_unix_mount_points (void);
+static guint64 mount_poller_time = 0;
+
G_DEFINE_TYPE (GUnixMountMonitor, g_unix_mount_monitor, G_TYPE_OBJECT);
#define MOUNT_POLL_INTERVAL 4000
@@ -172,6 +177,7 @@ G_DEFINE_TYPE (GUnixMountMonitor, g_unix_mount_monitor
#endif
#if defined(HAVE_GETMNTINFO) && defined(HAVE_FSTAB_H) && defined(HAVE_SYS_MOUNT_H)
+#include <sys/param.h>
#include <sys/ucred.h>
#include <sys/mount.h>
#include <fstab.h>
@@ -222,20 +228,28 @@ g_unix_is_mount_path_system_internal (const char *moun
"/", /* we already have "Filesystem root" in Nautilus */
"/bin",
"/boot",
+ "/compat/linux/proc",
+ "/compat/linux/sys",
"/dev",
"/etc",
"/home",
"/lib",
"/lib64",
+ "/libexec",
"/media",
"/mnt",
"/opt",
+ "/rescue",
"/root",
"/sbin",
"/srv",
"/tmp",
"/usr",
+ "/usr/X11R6",
"/usr/local",
+ "/usr/obj",
+ "/usr/ports",
+ "/usr/src",
"/var",
"/var/log/audit", /* https://bugzilla.redhat.com/show_bug.cgi?id=333041 */
"/var/tmp", /* https://bugzilla.redhat.com/show_bug.cgi?id=335241 */
@@ -1056,6 +1070,10 @@ get_mounts_timestamp (void)
if (stat (monitor_file, &buf) == 0)
return (guint64)buf.st_mtime;
}
+ else
+ {
+ return mount_poller_time;
+ }
return 0;
}
@@ -1196,6 +1214,13 @@ g_unix_mount_monitor_finalize (GObject *object)
g_object_unref (monitor->mtab_monitor);
}
+ if (monitor->mount_poller_source > 0)
+ {
+ g_source_remove (monitor->mount_poller_source);
+ g_list_foreach (monitor->mount_poller_mounts, (GFunc)g_unix_mount_free, NULL);
+ g_list_free (monitor->mount_poller_mounts);
+ }
+
the_mount_monitor = NULL;
G_OBJECT_CLASS (g_unix_mount_monitor_parent_class)->finalize (object);
@@ -1276,6 +1301,51 @@ mtab_file_changed (GFileMonitor *monitor,
g_signal_emit (mount_monitor, signals[MOUNTS_CHANGED], 0);
}
+static gboolean
+mount_change_poller (gpointer user_data)
+{
+ GUnixMountMonitor *mount_monitor;
+ GList *current_mounts;
+ gboolean has_changed = FALSE;
+
+ mount_monitor = user_data;
+ current_mounts = _g_get_unix_mounts ();
+
+ if (g_list_length (current_mounts) != g_list_length (mount_monitor->mount_poller_mounts))
+ {
+ g_list_foreach (mount_monitor->mount_poller_mounts, (GFunc)g_unix_mount_free, NULL);
+ has_changed = TRUE;
+ }
+ else
+ {
+ int i;
+
+ for (i = 0; i < g_list_length (current_mounts); i++)
+ {
+ GUnixMountEntry *m1;
+ GUnixMountEntry *m2;
+
+ m1 = (GUnixMountEntry *)g_list_nth_data (current_mounts, i);
+ m2 = (GUnixMountEntry *)g_list_nth_data (mount_monitor->mount_poller_mounts, i);
+ if (! has_changed && g_unix_mount_compare (m1, m2) != 0)
+ has_changed = TRUE;
+
+ g_unix_mount_free (m2);
+ }
+ }
+
+ g_list_free (mount_monitor->mount_poller_mounts);
+ mount_monitor->mount_poller_mounts = current_mounts;
+
+ if (has_changed)
+ {
+ mount_poller_time = (guint64)time (NULL);
+ g_signal_emit (mount_monitor, signals[MOUNTS_CHANGED], 0);
+ }
+
+ return TRUE;
+}
+
static void
g_unix_mount_monitor_init (GUnixMountMonitor *monitor)
{
@@ -1297,6 +1367,12 @@ g_unix_mount_monitor_init (GUnixMountMonitor *monitor)
g_object_unref (file);
g_signal_connect (monitor->mtab_monitor, "changed", (GCallback)mtab_file_changed, monitor);
+ }
+ else
+ {
+ monitor->mount_poller_mounts = _g_get_unix_mounts ();
+ mount_poller_time = (guint64)time (NULL);
+ monitor->mount_poller_source = g_timeout_add_seconds (3, (GSourceFunc)mount_change_poller, monitor);
}
}