summaryrefslogtreecommitdiff
path: root/sysutils/hal/files/patch-hald_hf-storage.c
blob: 9d468cbbd044ef8954289eed9ddbecafafae6b76 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
--- hald/freebsd/hf-storage.c.orig	2009-08-24 12:42:29.000000000 +0000
+++ hald/freebsd/hf-storage.c	2014-04-16 19:04:08.004114131 +0000
@@ -30,6 +30,7 @@
 #include <limits.h>
 #include <inttypes.h>
 #include <string.h>
+#include <unistd.h>
 #include <sys/param.h>
 #include <sys/types.h>
 #include <sys/disklabel.h>
@@ -174,6 +175,10 @@
   if (! geom_obj)
     return;
 
+  /* Exclude /dev/diskid/ labels as they are duplicates. */
+  if (strncmp(geom_obj->dev, "diskid/", 7) == 0)
+    return;
+
   node = g_node_find(hf_storage_geom_tree, G_PRE_ORDER, G_TRAVERSE_ALL,
                      GUINT_TO_POINTER(geom_obj->hash));
 
@@ -418,10 +423,42 @@
 	  continue;
 	}
 
+      /* XXX This is a hack, but we need to ignore dynamic labels like
+       * ufsids which are created and destroyed based on whether or not
+       * the actual device is mounted or not.  If we don't then strange
+       * things happen in applications like nautilus.
+       */
+      if ((! strcmp(fields[1], "LABEL") ||
+          ! strcmp(fields[1], "BSD") ||
+	  ! strcmp(fields[1], "PART")) &&
+          (! strncmp(fields[2], "ufsid/", strlen("ufsid/")) ||
+	   !  strncmp(fields[2], "ufs/", strlen("ufs/")) ||
+	   !  strncmp(fields[2], "diskid/", strlen("diskid/"))))
+        {
+          g_strfreev(fields);
+	  continue;
+	}
+
       geom_obj = g_new0(Geom_Object, 1);
 
       geom_obj->class = g_strdup(fields[1]);
       geom_obj->dev = g_strdup(fields[2]);
+      /* Allow for spaces in label names. */
+      if (! strcmp(fields[1], "LABEL"))
+        {
+          int j;
+
+	  for (j = 3; g_strv_length(fields) > (j + 2) &&
+               strcmp(fields[j + 2], "i"); j++)
+            {
+              char *tmp;
+
+	      tmp = g_strdup_printf("%s %s", geom_obj->dev, fields[j]);
+	      g_free(geom_obj->dev);
+	      geom_obj->dev = tmp;
+	    }
+	}
+
       geom_obj->type = -1;	/* We use -1 here to denote a missing type. */
       geom_obj->hash = hash;
 
@@ -458,6 +495,13 @@
                             {
                               g_free(geom_obj->class);
 			      geom_obj->class = g_strdup(fields[12]);
+			      if (! strcmp(geom_obj->class, "BSD") &&
+				    geom_obj->type == FS_UNUSED)
+				{
+			          geom_obj->type = FS_BSDFFS;
+				  g_free(geom_obj->str_type);
+				  geom_obj->str_type = g_strdup("freebsd-ufs");
+				}
 			    }
 			}
 		    }
@@ -589,11 +633,18 @@
   char *conftxt;
   GSList *new_disks;
 
-  if (strcmp(system, "DEVFS") || strcmp(subsystem, "CDEV") ||
+  if (! data || strcmp(system, "DEVFS") || strcmp(subsystem, "CDEV") ||
+      ! strncmp(data, "cdev=ufs/", strlen("cdev=ufs/")) ||
+      ! strncmp(data, "cdev=ufsid/", strlen("cdev=ufsid/")) ||
       (strcmp(type, "CREATE") && strcmp(type, "DESTROY")))
     return FALSE;
 
+  if (! strcmp(type, "DESTROY"))
+    g_usleep(G_USEC_PER_SEC/2);
+
   conftxt = hf_get_string_sysctl(NULL, "kern.geom.conftxt");
+  if (! conftxt)
+    return FALSE;
   new_disks = hf_storage_parse_conftxt(conftxt);
   g_free(conftxt);
 
@@ -669,7 +720,7 @@
   if (hf_is_waiting)
     return TRUE;
 
-  hf_storage_devd_notify("DEVFS", "CDEV", "CREATE", NULL);
+  hf_storage_devd_notify("DEVFS", "CDEV", "CREATE", "");
 
   return TRUE;
 }