Wed Mar 18 14:44:38 2009 UTC ()
Forgot to cvs add this patch.


(jmcneill)
diff -r0 -r1.1 pkgsrc/sysutils/gamin/patches/patch-ag

File Added: pkgsrc/sysutils/gamin/patches/patch-ag
$NetBSD: patch-ag,v 1.1 2009/03/18 14:44:38 jmcneill Exp $

--- server/gam_fs.c.orig	2008-11-12 15:45:28.000000000 -0500
+++ server/gam_fs.c
@@ -10,6 +10,10 @@
 #include "gam_error.h"
 #include "gam_fs.h"
 
+#if defined(__NetBSD__)
+#include <sys/statvfs.h>
+#endif
+
 #define DEFAULT_POLL_TIMEOUT 0
 
 typedef struct _gam_fs_properties {
@@ -21,12 +25,16 @@ typedef struct _gam_fs_properties {
 typedef struct _gam_fs {
 	char *path;
 	char *fsname;
+	guint64 flags;
 } gam_fs;
 
 static gboolean initialized = FALSE;
+#if defined(__NetBSD__)
+static gboolean initializing = FALSE;
+#endif
 static GList *filesystems = NULL;
 static GList *fs_props = NULL;
-static struct stat mtab_sbuf;
+static struct stat mtab_sbuf, hal_mtab_sbuf;
 
 static void
 gam_fs_free_filesystems (void)
@@ -110,6 +118,7 @@ gam_fs_filesystem_sort_cb (gconstpointer
 	return strlen(fsb->path) - strlen (fsa->path);
 }
 
+#if defined(__linux__)
 static void
 gam_fs_scan_mtab (void)
 {
@@ -165,10 +174,40 @@ gam_fs_scan_mtab (void)
 	gam_fs_free_filesystems ();
 	filesystems = g_list_sort (new_filesystems, gam_fs_filesystem_sort_cb);
 }
+#endif
+
+#if defined(__NetBSD__)
+static void
+gam_fs_getmntinfo (void)
+{
+	struct statvfs *stat;
+	GList *new_filesystems = NULL;
+	gam_fs *fs = NULL;
+	int i, n;
+
+	n = getmntinfo(&stat, MNT_NOWAIT);
+	if (n == -1)
+		return;
+
+	for (i = 0; i < n; i++)
+	{
+		fs = g_new0 (gam_fs, 1);
+		fs->path = g_strdup (stat[i].f_mntonname);
+		fs->fsname = g_strdup (stat[i].f_fstypename);
+		fs->flags = stat[i].f_flag;
+
+		new_filesystems = g_list_prepend (new_filesystems, fs);
+	}
+
+	gam_fs_free_filesystems ();
+	filesystems = g_list_sort (new_filesystems, gam_fs_filesystem_sort_cb);
+}
+#endif
 
 void
 gam_fs_init (void)
 {
+#if defined(__linux__)
 	if (initialized == FALSE)
 	{
 		initialized = TRUE;
@@ -199,6 +238,56 @@ gam_fs_init (void)
 
 		mtab_sbuf = sbuf;
 	}
+#elif defined(__NetBSD__)
+	if (initialized == FALSE && initializing == FALSE)
+	{
+		GList *iterator = NULL;
+		GHashTable *fs_hash = NULL;
+		gam_fs *fs = NULL;
+
+		initialized = initializing = TRUE;
+
+		gam_fs_getmntinfo ();
+
+		iterator = filesystems;
+		fs_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
+
+		while (iterator) {
+			fs = iterator->data;
+
+			if (!g_hash_table_lookup (fs_hash, fs->fsname)) {
+				if (fs->flags & MNT_LOCAL)
+					gam_fs_set (fs->fsname, GFS_MT_DEFAULT, 0);
+				else
+					gam_fs_set (fs->fsname, GFS_MT_POLL, 5);
+
+				g_hash_table_insert (fs_hash, g_strdup (fs->fsname), GINT_TO_POINTER (1));
+			}
+
+			iterator = g_list_next (iterator);
+		}
+
+		g_hash_table_destroy (fs_hash);
+		initializing = FALSE;
+	} else if (initializing == FALSE) {
+		struct stat sbuf;
+		gboolean need_update = FALSE;
+
+		if (stat ("/etc/fstab", &sbuf) == 0)
+			if (sbuf.st_mtime != mtab_sbuf.st_mtime) {
+				mtab_sbuf = sbuf;
+				need_update = TRUE;
+			}
+		if (stat ("/media/.hal-mtab", &sbuf) == 0)
+			if (sbuf.st_mtime != hal_mtab_sbuf.st_mtime) {
+				hal_mtab_sbuf = sbuf;
+				need_update = TRUE;
+			}
+
+		if (need_update == TRUE)
+			gam_fs_getmntinfo ();
+	}
+#endif
 }
 
 gam_fs_mon_type