int devlink_priority;
int refcount;
dev_t devnum;
+ int watch_handle;
unsigned int parent_set:1;
unsigned int subsystem_set:1;
unsigned int devtype_set:1;
case 'E':
udev_device_add_property_from_string(udev_device, val);
break;
+ case 'W':
+ udev_device_set_watch_handle(udev_device, atoi(val));
+ break;
}
}
fclose(f);
udev_list_init(&udev_device->properties_list);
udev_list_init(&udev_device->sysattr_list);
udev_device->event_timeout = -1;
+ udev_device->watch_handle = -1;
/* copy global properties */
udev_list_entry_foreach(list_entry, udev_get_properties_list_entry(udev))
udev_device_add_property(udev_device,
return udev_device->parent_device;
}
-struct udev_device *udev_device_get_parent_with_subsystem(struct udev_device *udev_device, const char *subsystem)
+struct udev_device *udev_device_get_parent_with_subsystem_devtype(struct udev_device *udev_device, const char *subsystem, const char *devtype)
{
struct udev_device *parent;
- parent = udev_device_get_parent(udev_device);
- while (parent != NULL) {
- const char *parent_subsystem;
-
- parent_subsystem = udev_device_get_subsystem(parent);
- if (parent_subsystem != NULL && strcmp(parent_subsystem, subsystem) == 0)
- break;
- parent = udev_device_get_parent(parent);
- }
- return parent;
-}
-
-struct udev_device *udev_device_get_parent_with_devtype(struct udev_device *udev_device, const char *devtype)
-{
- struct udev_device *parent;
+ if (subsystem == NULL)
+ return NULL;
parent = udev_device_get_parent(udev_device);
while (parent != NULL) {
+ const char *parent_subsystem;
const char *parent_devtype;
- parent_devtype = udev_device_get_devtype(parent);
- if (parent_devtype != NULL && strcmp(parent_devtype, devtype) == 0)
- break;
+ parent_subsystem = udev_device_get_subsystem(parent);
+ if (parent_subsystem != NULL && strcmp(parent_subsystem, subsystem) == 0) {
+ if (devtype == NULL)
+ break;
+ parent_devtype = udev_device_get_devtype(parent);
+ if (parent_devtype != NULL && strcmp(parent_devtype, devtype) == 0)
+ break;
+ }
parent = udev_device_get_parent(parent);
}
return parent;
return NULL;
if (!udev_device->devtype_set) {
udev_device->devtype_set = 1;
- udev_device_read_uevent_file(udev_device);
+ if (!udev_device->info_loaded)
+ udev_device_read_uevent_file(udev_device);
}
return udev_device->devtype;
}
{
struct udev_list_entry *list_entry;
char path[UTIL_PATH_SIZE];
- char value[UTIL_NAME_SIZE];
+ char value[4096];
struct stat statbuf;
int fd;
ssize_t size;
return udev_device_add_property(udev_device, name, val);
}
+const char *udev_device_get_property_value(struct udev_device *udev_device, const char *key)
+{
+ struct udev_list_entry *list_entry;
+
+ if (udev_device == NULL)
+ return NULL;
+ if (key == NULL)
+ return NULL;
+
+ list_entry = udev_device_get_properties_list_entry(udev_device);
+ list_entry = udev_list_entry_get_by_name(list_entry, key);
+ return udev_list_entry_get_value(list_entry);
+}
+
#define ENVP_SIZE 128
#define MONITOR_BUF_SIZE 4096
static int update_envp_monitor_buf(struct udev_device *udev_device)
udev_device->ignore_remove = ignore;
return 0;
}
+
+int udev_device_get_watch_handle(struct udev_device *udev_device)
+{
+ if (!udev_device->info_loaded)
+ device_load_info(udev_device);
+ return udev_device->watch_handle;
+}
+
+int udev_device_set_watch_handle(struct udev_device *udev_device, int handle)
+{
+ udev_device->watch_handle = handle;
+ return 0;
+}