hal/hald/linux2 coldplug.c,1.15,1.16
Kay Sievers
kay at freedesktop.org
Thu Jul 7 09:08:54 PDT 2005
Update of /cvs/hal/hal/hald/linux2
In directory gabe:/tmp/cvs-serv21790/hald/linux2
Modified Files:
coldplug.c
Log Message:
2005-07-07 Kay Sievers <kay.sievers at vrfy.org>
* hald/linux2/coldplug.c: (hal_util_get_udevinfo_path),
(hal_util_init_sysfs_to_dev_map), (coldplug_get_device_file),
(coldplug_synthesize_events), (coldplug_synthesize_block_event),
(coldplug_compute_visit_device):
The next udev version will not store anything in its database if not
neccessary. So udev does not need to write 600 pretty useless database
files and HAL does not need to process the information that is already
contained in the sysfs-path.
The udevinfo-dump of the next udev version will only print devices which
have a custom configuration. This changes HAL to look for the default
device-node derived from the kernels devpath if udev has not specified
anything else.
Index: coldplug.c
===================================================================
RCS file: /cvs/hal/hal/hald/linux2/coldplug.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- coldplug.c 27 Apr 2005 18:53:39 -0000 1.15
+++ coldplug.c 7 Jul 2005 16:08:51 -0000 1.16
@@ -53,6 +53,8 @@
#define DMPREFIX "dm-"
+static GHashTable *sysfs_to_dev_map;
+static char dev_root[HAL_PATH_MAX];
/* Returns the path of the udevinfo program
*
@@ -65,14 +67,14 @@
struct stat s;
static gchar *path = NULL;
gchar *possible_paths[] = {
- "/sbin/udevinfo",
"/usr/bin/udevinfo",
+ "/bin/udevinfo",
"/usr/sbin/udevinfo",
- "/usr/local/sbin/udevinfo"
+ "/sbin/udevinfo",
};
if (path != NULL)
- return path;
+ return path;
for (i = 0; i < sizeof (possible_paths) / sizeof (char *); i++) {
if (stat (possible_paths[i], &s) == 0 && S_ISREG (s.st_mode)) {
@@ -83,15 +85,15 @@
return path;
}
-static GHashTable *
-hal_util_get_sysfs_to_dev_map (void)
+
+static gboolean
+hal_util_init_sysfs_to_dev_map (void)
{
- GHashTable *sysfs_to_dev_map;
- char *udevinfo_argv[7] = {NULL, "-d", NULL};
+ char *udevdump_argv[] = { "/usr/bin/udevinfo", "-d", NULL };
+ char *udevroot_argv[] = { "/usr/bin/udevinfo", "-r", NULL };
char *udevinfo_stdout;
- char *udevinfo_stderr;
int udevinfo_exitcode;
- char *p;
+ char *p;
char *q;
char *r;
int len;
@@ -101,37 +103,48 @@
gboolean has_more_lines;
sysfs_mount_path = get_hal_sysfs_path ();
-
sysfs_to_dev_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+ udevdump_argv[0] = (char *) hal_util_get_udevinfo_path ();
+ udevroot_argv[0] = (char *) hal_util_get_udevinfo_path ();
- /* get path to udevinfo */
- udevinfo_argv[0] = (char *) hal_util_get_udevinfo_path ();
- if (udevinfo_argv[0] == NULL)
+ /* get udevroot */
+ if (g_spawn_sync ("/", udevroot_argv, NULL, 0, NULL, NULL,
+ &udevinfo_stdout,
+ NULL,
+ &udevinfo_exitcode,
+ NULL) != TRUE) {
+ HAL_ERROR (("Couldn't invoke %s", udevroot_argv[0]));
goto error;
+ }
+ if (udevinfo_exitcode != 0) {
+ HAL_ERROR (("%s returned %d", udevroot_argv[0], udevinfo_exitcode));
+ goto error;
+ }
+ g_strlcpy(dev_root, udevinfo_stdout, sizeof(dev_root));
+ p = strchr(dev_root, '\n');
+ if (p)
+ p[0] = '\0';
+ g_free(udevinfo_stdout);
+ HAL_INFO (("dev_root is %s", dev_root));
- /* Invoke udevinfo */
- if (udevinfo_argv[0] == NULL || g_spawn_sync ("/",
- udevinfo_argv,
- NULL,
- 0,
- NULL,
- NULL,
- &udevinfo_stdout,
- &udevinfo_stderr,
- &udevinfo_exitcode,
- NULL) != TRUE) {
- HAL_ERROR (("Couldn't invoke %s", udevinfo_argv[0]));
+ /* get udevdump */
+ if (g_spawn_sync ("/", udevdump_argv, NULL, 0, NULL, NULL,
+ &udevinfo_stdout,
+ NULL,
+ &udevinfo_exitcode,
+ NULL) != TRUE) {
+ HAL_ERROR (("Couldn't invoke %s", udevdump_argv[0]));
+ g_free(udevinfo_stdout);
goto error;
}
if (udevinfo_exitcode != 0) {
- HAL_ERROR (("%s returned %d", udevinfo_argv[0], udevinfo_exitcode));
+ HAL_ERROR (("%s returned %d", udevdump_argv[0], udevinfo_exitcode));
goto error;
}
has_more_lines = TRUE;
-
p = udevinfo_stdout;
do {
@@ -142,7 +155,7 @@
for (q = p; *q != '\n' && *q != '\0' && *q != '='; q++)
;
-
+
len = q - p;
switch (*q) {
case '=':
@@ -162,12 +175,12 @@
HAL_ERROR (("Expected '=', not '%c' in line '%s'", *q, p));
goto error;
}
-
+
q++;
r = q;
for ( ; *q != '\n' && *q != '\0'; q++)
;
-
+
len = q - r;
switch (*q) {
case '\0':
@@ -178,7 +191,6 @@
strncpy (device_file, r, len > PATH_MAX ? PATH_MAX : len);
device_file [len > PATH_MAX ? PATH_MAX : len] = '\0';
break;
-
default:
HAL_ERROR (("Expected '\\n' or '\\0', not '%c' in line '%s'", *q, p));
goto error;
@@ -186,7 +198,7 @@
g_hash_table_insert (sysfs_to_dev_map, g_strdup_printf ("%s%s", sysfs_mount_path, sysfs_path),
g_strdup(device_file));
-
+
#ifdef HAL_COLDPLUG_VERBOSE
printf ("Got '%s' -> '%s'\n", sysfs_path, device_file);
#endif
@@ -194,22 +206,54 @@
} while (has_more_lines);
- return sysfs_to_dev_map;
+ g_free(udevinfo_stdout);
+ return TRUE;
error:
+ g_free(udevinfo_stdout);
g_hash_table_destroy (sysfs_to_dev_map);
- return NULL;
+ return FALSE;
}
+static gchar
+*coldplug_get_device_file(const gchar *sysfs_path)
+{
+ const gchar *device_file;
+ const char *pos;
+ gchar path[HAL_PATH_MAX];
+ struct stat statbuf;
+
+ device_file = (gchar *) g_hash_table_lookup (sysfs_to_dev_map, sysfs_path);
+ if (device_file != NULL)
+ return g_strdup(device_file);
+
+ HAL_INFO (("sysfs_path %s not in udevdb", sysfs_path));
+
+ /* device is not in udevdb, use the default kernel name */
+ pos = strrchr(sysfs_path, '/');
+ if (pos == NULL)
+ return NULL;
+
+ g_strlcpy(path, dev_root, sizeof(path));
+ g_strlcat(path, pos, sizeof(path));
+ if (stat (path, &statbuf))
+ return NULL;
+
+ if (!S_ISBLK (statbuf.st_mode) && !S_ISCHR (statbuf.st_mode))
+ return NULL;
+
+ HAL_INFO (("return sysfs_path %s", path));
+
+ return g_strdup(path);
+}
static gboolean
-coldplug_synthesize_block_event(const gchar *f, GHashTable *sysfs_to_dev_map);
+coldplug_synthesize_block_event(const gchar *f);
static void
coldplug_compute_visit_device (const gchar *path,
GHashTable *sysfs_to_bus_map,
- GHashTable *sysfs_to_class_in_devices_map,
- GHashTable *sysfs_to_dev_map);
+ GHashTable *sysfs_to_class_in_devices_map);
/* For debugging */
/*#define HAL_COLDPLUG_VERBOSE*/
@@ -297,15 +341,11 @@
*/
GSList *sysfs_dm_dev = NULL;
- GHashTable *sysfs_to_dev_map = NULL;
-
-
- if ((sysfs_to_dev_map = hal_util_get_sysfs_to_dev_map ()) == NULL) {
+ if (hal_util_init_sysfs_to_dev_map () == FALSE) {
HAL_ERROR (("Unable to get sysfs to dev map"));
goto error;
}
-
/* build bus map */
sysfs_to_bus_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
g_snprintf (path, HAL_PATH_MAX, "%s/bus", get_hal_sysfs_path ());
@@ -431,7 +471,7 @@
while ((f1 = g_dir_read_name (dir1)) != NULL) {
g_snprintf (path, HAL_PATH_MAX, "%s/devices/%s/%s", get_hal_sysfs_path (), f, f1);
- coldplug_compute_visit_device (path, sysfs_to_bus_map, sysfs_to_class_in_devices_map, sysfs_to_dev_map);
+ coldplug_compute_visit_device (path, sysfs_to_bus_map, sysfs_to_class_in_devices_map);
}
g_dir_close (dir1);
}
@@ -461,9 +501,10 @@
g_strlcpy (hotplug_event->sysfs.subsystem, subsystem, sizeof (hotplug_event->sysfs.subsystem));
g_strlcpy (hotplug_event->sysfs.sysfs_path, sysfs_path, sizeof (hotplug_event->sysfs.sysfs_path));
- device_file = (gchar *) g_hash_table_lookup (sysfs_to_dev_map, sysfs_path);
+ device_file = coldplug_get_device_file (sysfs_path);
if (device_file != NULL) {
strncpy (hotplug_event->sysfs.device_file, device_file, sizeof (hotplug_event->sysfs.device_file));
+ g_free (device_file);
}
hotplug_event->sysfs.net_ifindex = -1;
@@ -487,12 +528,12 @@
sysfs_dm_dev = g_slist_append(sysfs_dm_dev, g_strdup(f));
continue;
}
- if (coldplug_synthesize_block_event(f, sysfs_to_dev_map) == FALSE)
+ if (coldplug_synthesize_block_event(f) == FALSE)
goto error;
}
/* process all dm devices last so that their backing devices exist */
for (li = sysfs_dm_dev; li != NULL; li = g_slist_next (g_slist_next (li))) {
- if (coldplug_synthesize_block_event (li->data, sysfs_to_dev_map) == FALSE)
+ if (coldplug_synthesize_block_event (li->data) == FALSE)
goto error;
g_free (li->data);
}
@@ -500,7 +541,7 @@
g_dir_close (dir);
g_hash_table_destroy (sysfs_to_dev_map);
-
+
return TRUE;
error:
HAL_ERROR (("Error building the orderered list of sysfs paths"));
@@ -508,7 +549,7 @@
}
static gboolean
-coldplug_synthesize_block_event(const gchar *f, GHashTable *sysfs_to_dev_map)
+coldplug_synthesize_block_event(const gchar *f)
{
GDir *dir1;
gsize flen;
@@ -540,9 +581,10 @@
g_strlcpy (hotplug_event->sysfs.subsystem, "block", sizeof (hotplug_event->sysfs.subsystem));
g_strlcpy (hotplug_event->sysfs.sysfs_path, path, sizeof (hotplug_event->sysfs.sysfs_path));
- device_file = (gchar *) g_hash_table_lookup (sysfs_to_dev_map, path);
+ device_file = coldplug_get_device_file (path);
if (device_file != NULL) {
strncpy (hotplug_event->sysfs.device_file, device_file, sizeof (hotplug_event->sysfs.device_file));
+ g_free (device_file);
}
if (normalized_target != NULL)
@@ -573,9 +615,10 @@
g_strlcpy (hotplug_event->sysfs.subsystem, "block", sizeof (hotplug_event->sysfs.subsystem));
g_strlcpy (hotplug_event->sysfs.sysfs_path, path1, sizeof (hotplug_event->sysfs.sysfs_path));
g_strlcpy (hotplug_event->sysfs.wait_for_sysfs_path, path, sizeof (hotplug_event->sysfs.wait_for_sysfs_path));
- device_file = (gchar *) g_hash_table_lookup (sysfs_to_dev_map, path1);
+ device_file = coldplug_get_device_file (path1);
if (device_file != NULL) {
strncpy (hotplug_event->sysfs.device_file, device_file, sizeof (hotplug_event->sysfs.device_file));
+ g_free (device_file);
}
hotplug_event->sysfs.net_ifindex = -1;
hotplug_event_enqueue (hotplug_event);
@@ -592,8 +635,7 @@
static void
coldplug_compute_visit_device (const gchar *path,
GHashTable *sysfs_to_bus_map,
- GHashTable *sysfs_to_class_in_devices_map,
- GHashTable *sysfs_to_dev_map)
+ GHashTable *sysfs_to_class_in_devices_map)
{
gchar *bus;
GError *err = NULL;
@@ -647,9 +689,10 @@
g_strlcpy (hotplug_event->sysfs.subsystem, subsystem, sizeof (hotplug_event->sysfs.subsystem));
g_strlcpy (hotplug_event->sysfs.sysfs_path, sysfs_path, sizeof (hotplug_event->sysfs.sysfs_path));
- device_file = (gchar *) g_hash_table_lookup (sysfs_to_dev_map, sysfs_path);
+ device_file = coldplug_get_device_file (sysfs_path);
if (device_file != NULL) {
strncpy (hotplug_event->sysfs.device_file, device_file, sizeof (hotplug_event->sysfs.device_file));
+ g_free (device_file);
}
if (path != NULL)
g_strlcpy (hotplug_event->sysfs.wait_for_sysfs_path, path, sizeof (hotplug_event->sysfs.wait_for_sysfs_path));
@@ -669,7 +712,7 @@
while ((f = g_dir_read_name (dir)) != NULL) {
gchar path_child[HAL_PATH_MAX];
struct stat statbuf;
-
+
g_snprintf (path_child, HAL_PATH_MAX, "%s/%s", path, f);
if (lstat (path_child, &statbuf) == 0) {
@@ -678,8 +721,7 @@
/* recursion fun */
coldplug_compute_visit_device (path_child,
sysfs_to_bus_map,
- sysfs_to_class_in_devices_map,
- sysfs_to_dev_map);
+ sysfs_to_class_in_devices_map);
}
}
}
More information about the hal-commit
mailing list