- char bus_dev_name[SYSFS_PATH_MAX];
- char bus_id[SYSFS_NAME_LEN];
- struct stat stat_buf;
- ino_t dev_inode;
-
- dprintf("%s\n", sysfs_path);
-
- if (sysfs_get_name_from_path(sysfs_path, bus_id, SYSFS_NAME_LEN))
- return -1;
-
- snprintf(bus_dev_name, MAX_NAME_LEN, "%s/%s/%s/%s/%s", sysfs_mnt_path,
- SYSFS_BUS_NAME, bus, SYSFS_DEVICES_NAME, bus_id);
-
- if (stat(sysfs_path, &stat_buf))
- return -1;
- dev_inode = stat_buf.st_ino;
-
- if (stat(bus_dev_name, &stat_buf)) {
- if (errno == ENOENT)
- return 0;
- else
- return -1;
- }
- if (dev_inode == stat_buf.st_ino)
- return 1;
- else
- return 0;
-}
-
-static int get_major_minor(const char *devpath, int *major, int *minor)
-{
- struct sysfs_class_device *class_dev;
- char dev_value[SYSFS_NAME_LEN];
- char *dev;
-
- dprintf("%s\n", devpath);
- class_dev = sysfs_open_class_device_path(devpath);
- if (!class_dev) {
- log_message(LOG_WARNING, "open class %s failed: %s\n", devpath,
- strerror(errno));
- return -1;
- }
-
- dev = sysfs_get_attr(class_dev, "dev");
- if (dev)
- strncpy(dev_value, dev, SYSFS_NAME_LEN);
- sysfs_close_class_device(class_dev);
- if (!dev) {
- /*
- * XXX This happens a lot, since sg has no dev attr.
- * Someday change this back to a LOG_WARNING.
- */
- log_message(LOG_DEBUG, "%s could not get dev attribute: %s\n",
- devpath, strerror(errno));
- return -1;
- }
- dev = NULL;
-
- dprintf("dev %s", dev_value); /* dev_value has a trailing \n */
- if (sscanf(dev_value, "%u:%u", major, minor) != 2) {
- log_message(LOG_WARNING, "%s: invalid dev major/minor\n",
- devpath);
- return -1;
- }
-
- return 0;
-}
-
-static int create_tmp_dev(const char *devpath, char *tmpdev, int dev_type)
-{
- int major, minor;
-
- dprintf("(%s)\n", devpath);
-
- if (get_major_minor(devpath, &major, &minor))
- return -1;
- snprintf(tmpdev, MAX_NAME_LEN, "%s/%s-maj%d-min%d-%u",
- TMP_DIR, TMP_PREFIX, major, minor, getpid());
-
- dprintf("tmpdev '%s'\n", tmpdev);
-
- if (mknod(tmpdev, 0600 | dev_type, makedev(major, minor))) {
- log_message(LOG_WARNING, "mknod failed: %s\n", strerror(errno));
- return -1;