cf5a80bff3
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@
155 lines
4.3 KiB
Plaintext
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);
|
|
}
|
|
}
|
|
|