mirror of
https://github.com/systemd/systemd.git
synced 2026-07-25 08:45:56 +00:00
libudev: device - add devtype support
This commit is contained in:
committed by
Kay Sievers
parent
01acecef8f
commit
bf8b2ae177
@@ -17,6 +17,7 @@ udev_device_new_from_devnum
|
||||
udev_device_new_from_subsystem_sysname
|
||||
udev_device_get_parent
|
||||
udev_device_get_parent_with_subsystem
|
||||
udev_device_get_parent_with_devtype
|
||||
udev_device_ref
|
||||
udev_device_unref
|
||||
udev_device_get_udev
|
||||
@@ -26,6 +27,7 @@ udev_device_get_devnode
|
||||
udev_device_get_sysname
|
||||
udev_device_get_sysnum
|
||||
udev_device_get_subsystem
|
||||
udev_device_get_devtype
|
||||
udev_device_get_devlinks_list_entry
|
||||
udev_device_get_properties_list_entry
|
||||
udev_device_get_action
|
||||
|
||||
@@ -40,6 +40,7 @@ struct udev_device {
|
||||
const char *sysnum;
|
||||
char *devnode;
|
||||
char *subsystem;
|
||||
char *devtype;
|
||||
char *driver;
|
||||
char *action;
|
||||
char *devpath_old;
|
||||
@@ -59,6 +60,7 @@ struct udev_device {
|
||||
dev_t devnum;
|
||||
unsigned int parent_set:1;
|
||||
unsigned int subsystem_set:1;
|
||||
unsigned int devtype_set:1;
|
||||
unsigned int devlinks_uptodate:1;
|
||||
unsigned int envp_uptodate:1;
|
||||
unsigned int driver_set:1;
|
||||
@@ -204,7 +206,9 @@ int udev_device_read_uevent_file(struct udev_device *udev_device)
|
||||
continue;
|
||||
pos[0] = '\0';
|
||||
|
||||
if (strncmp(line, "MAJOR=", 6) == 0)
|
||||
if (strncmp(line, "DEVTYPE=", 8) == 0)
|
||||
udev_device_set_devtype(udev_device, &line[8]);
|
||||
else if (strncmp(line, "MAJOR=", 6) == 0)
|
||||
maj = strtoull(&line[6], NULL, 10);
|
||||
else if (strncmp(line, "MINOR=", 6) == 0)
|
||||
min = strtoull(&line[6], NULL, 10);
|
||||
@@ -553,6 +557,22 @@ struct udev_device *udev_device_get_parent_with_subsystem(struct udev_device *ud
|
||||
return parent;
|
||||
}
|
||||
|
||||
struct udev_device *udev_device_get_parent_with_devtype(struct udev_device *udev_device, const char *devtype)
|
||||
{
|
||||
struct udev_device *parent;
|
||||
|
||||
parent = udev_device_get_parent(udev_device);
|
||||
while (parent != NULL) {
|
||||
const char *parent_devtype;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* udev_device_get_udev:
|
||||
* @udev_device: udev device
|
||||
@@ -605,6 +625,7 @@ void udev_device_unref(struct udev_device *udev_device)
|
||||
free(udev_device->sysname);
|
||||
free(udev_device->devnode);
|
||||
free(udev_device->subsystem);
|
||||
free(udev_device->devtype);
|
||||
udev_list_cleanup_entries(udev_device->udev, &udev_device->devlinks_list);
|
||||
udev_list_cleanup_entries(udev_device->udev, &udev_device->properties_list);
|
||||
free(udev_device->action);
|
||||
@@ -723,6 +744,25 @@ const char *udev_device_get_subsystem(struct udev_device *udev_device)
|
||||
return udev_device->subsystem;
|
||||
}
|
||||
|
||||
/**
|
||||
* udev_device_get_devtype:
|
||||
* @udev_device: udev device
|
||||
*
|
||||
* Retrieve the devtype string of the udev device.
|
||||
*
|
||||
* Returns: the devtype name of the udev device, or #NULL if it can not be determined
|
||||
**/
|
||||
const char *udev_device_get_devtype(struct udev_device *udev_device)
|
||||
{
|
||||
if (udev_device == NULL)
|
||||
return NULL;
|
||||
if (!udev_device->devtype_set) {
|
||||
udev_device->devtype_set = 1;
|
||||
udev_device_read_uevent_file(udev_device);
|
||||
}
|
||||
return udev_device->devtype;
|
||||
}
|
||||
|
||||
/**
|
||||
* udev_device_get_devlinks_list_entry:
|
||||
* @udev_device: udev device
|
||||
@@ -963,6 +1003,17 @@ int udev_device_set_subsystem(struct udev_device *udev_device, const char *subsy
|
||||
return 0;
|
||||
}
|
||||
|
||||
int udev_device_set_devtype(struct udev_device *udev_device, const char *devtype)
|
||||
{
|
||||
free(udev_device->devtype);
|
||||
udev_device->devtype = strdup(devtype);
|
||||
if (udev_device->devtype == NULL)
|
||||
return -ENOMEM;
|
||||
udev_device->devtype_set = 1;
|
||||
udev_device_add_property(udev_device, "DEVTYPE", udev_device->devtype);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode)
|
||||
{
|
||||
free(udev_device->devnode);
|
||||
|
||||
@@ -325,6 +325,8 @@ struct udev_device *udev_monitor_receive_device(struct udev_monitor *udev_monito
|
||||
} else if (strncmp(key, "SUBSYSTEM=", 10) == 0) {
|
||||
udev_device_set_subsystem(udev_device, &key[10]);
|
||||
subsystem_set = 1;
|
||||
} else if (strncmp(key, "DEVTYPE=", 8) == 0) {
|
||||
udev_device_set_devtype(udev_device, &key[8]);
|
||||
} else if (strncmp(key, "DEVNAME=", 8) == 0) {
|
||||
udev_device_set_devnode(udev_device, &key[8]);
|
||||
} else if (strncmp(key, "DEVLINKS=", 9) == 0) {
|
||||
|
||||
@@ -56,6 +56,7 @@ extern struct udev_list_entry *udev_get_properties_list_entry(struct udev *udev)
|
||||
/* libudev-device */
|
||||
extern int udev_device_set_syspath(struct udev_device *udev_device, const char *syspath);
|
||||
extern int udev_device_set_subsystem(struct udev_device *udev_device, const char *subsystem);
|
||||
extern int udev_device_set_devtype(struct udev_device *udev_device, const char *devtype);
|
||||
extern int udev_device_set_devnode(struct udev_device *udev_device, const char *devnode);
|
||||
extern int udev_device_add_devlink(struct udev_device *udev_device, const char *devlink);
|
||||
extern void udev_device_cleanup_devlinks_list(struct udev_device *udev_device);
|
||||
|
||||
@@ -63,11 +63,13 @@ extern struct udev_device *udev_device_new_from_devnum(struct udev *udev, char t
|
||||
extern struct udev_device *udev_device_new_from_subsystem_sysname(struct udev *udev, const char *subsystem, const char *sysname);
|
||||
extern struct udev_device *udev_device_get_parent(struct udev_device *udev_device);
|
||||
extern struct udev_device *udev_device_get_parent_with_subsystem(struct udev_device *udev_device, const char *subsystem);
|
||||
extern struct udev_device *udev_device_get_parent_with_devtype(struct udev_device *udev_device, const char *devtype);
|
||||
extern struct udev_device *udev_device_ref(struct udev_device *udev_device);
|
||||
extern void udev_device_unref(struct udev_device *udev_device);
|
||||
extern struct udev *udev_device_get_udev(struct udev_device *udev_device);
|
||||
extern const char *udev_device_get_devpath(struct udev_device *udev_device);
|
||||
extern const char *udev_device_get_subsystem(struct udev_device *udev_device);
|
||||
extern const char *udev_device_get_devtype(struct udev_device *udev_device);
|
||||
extern const char *udev_device_get_syspath(struct udev_device *udev_device);
|
||||
extern const char *udev_device_get_sysname(struct udev_device *udev_device);
|
||||
extern const char *udev_device_get_sysnum(struct udev_device *udev_device);
|
||||
|
||||
@@ -67,6 +67,10 @@ static void print_device(struct udev_device *device)
|
||||
if (str != NULL)
|
||||
printf("subsystem: '%s'\n", str);
|
||||
|
||||
str = udev_device_get_devtype(device);
|
||||
if (str != NULL)
|
||||
printf("devtype: '%s'\n", str);
|
||||
|
||||
str = udev_device_get_driver(device);
|
||||
if (str != NULL)
|
||||
printf("driver: '%s'\n", str);
|
||||
|
||||
Reference in New Issue
Block a user