1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-23 21:35:11 +03:00

libudev: pass udev_device in enumerate

This commit is contained in:
Kay Sievers 2008-09-17 23:32:43 -07:00
parent 7bcbf7ecc8
commit a076080bd4
6 changed files with 32 additions and 51 deletions

View File

@ -15,6 +15,7 @@ udev_device_get_udev
udev_device_get_syspath
udev_device_get_devpath
udev_device_get_devname
udev_device_get_sysname
udev_device_get_subsystem
udev_device_get_devlinks
udev_device_get_properties

View File

@ -109,43 +109,17 @@ static int devices_delay(struct udev *udev, const char *syspath)
return 0;
}
static int devices_call(struct udev *udev, const char *syspath,
int (*cb)(struct udev *udev,
const char *syspath, const char *subsystem, const char *name,
void *data),
void *data,
int *cb_rc)
{
char subsystem[UTIL_PATH_SIZE];
const char *name;
name = strrchr(syspath, '/');
if (name == NULL)
return -1;
name++;
if (util_get_sys_subsystem(udev, syspath, subsystem, sizeof(subsystem)) < 2)
return -1;
*cb_rc = cb(udev, syspath, subsystem, name, data);
return 0;
}
/**
* udev_enumerate_devices:
* @udev_device: udev device
* @cb: function to be called for every property found
* @udev: udev library context
* @subsystem: the subsystem to enumerate
* @cb: function to be called for every device found
* @data: data to be passed to the function
*
* Retrieve the property key/value pairs belonging to the
* udev device. For every key/value pair, the passed function will be
* called. If the function returns 1, remaning properties will be
* ignored.
*
* Returns: the number of properties passed to the caller, or a negative value on error
* Returns: the number of devices passed to the caller, or a negative value on error
**/
int udev_enumerate_devices(struct udev *udev, const char *subsystem,
int (*cb)(struct udev *udev,
const char *syspath, const char *subsystem, const char *name, void *data),
int (*cb)(struct udev_device *udev_device, void *data),
void *data)
{
char base[UTIL_PATH_SIZE];
@ -171,9 +145,16 @@ int udev_enumerate_devices(struct udev *udev, const char *subsystem,
list_for_each_entry_safe(loop_device, tmp_device, &device_list, node) {
if (devices_delay(udev, loop_device->name))
continue;
if (cb_rc == 0)
if (devices_call(udev, loop_device->name, cb, data, &cb_rc) == 0)
if (cb_rc == 0) {
struct udev_device *device;
device = udev_device_new_from_syspath(udev, loop_device->name);
if (device != NULL) {
cb_rc = cb(device, data);
count++;
udev_device_unref(device);
}
}
list_del(&loop_device->node);
free(loop_device->name);
free(loop_device);
@ -181,9 +162,16 @@ int udev_enumerate_devices(struct udev *udev, const char *subsystem,
/* handle remaining delayed devices */
list_for_each_entry_safe(loop_device, tmp_device, &device_list, node) {
if (cb_rc == 0)
if (devices_call(udev, loop_device->name, cb, data, &cb_rc) == 0)
if (cb_rc == 0) {
struct udev_device *device;
device = udev_device_new_from_syspath(udev, loop_device->name);
if (device != NULL) {
cb_rc = cb(device, data);
count++;
udev_device_unref(device);
}
}
list_del(&loop_device->node);
free(loop_device->name);
free(loop_device);

View File

@ -70,8 +70,7 @@ extern unsigned long long int udev_device_get_seqnum(struct udev_device *udev_de
extern const char *udev_device_get_attr_value(struct udev_device *udev_device, const char *attr);
extern int udev_enumerate_devices(struct udev *udev, const char *subsystem,
int (*cb)(struct udev *udev,
const char *syspath, const char *subsystem, const char *name, void *data),
int (*cb)(struct udev_device *udev_device, void *data),
void *data);
struct udev_monitor;

View File

@ -116,11 +116,12 @@ static int test_device_parents(struct udev *udev, const char *syspath)
return 0;
}
static int devices_enum_cb(struct udev *udev,
const char *devpath, const char *subsystem, const char *name,
void *data)
static int devices_enum_cb(struct udev_device *device, void *data)
{
printf("device: '%s' (%s) '%s'\n", devpath, subsystem, name);
printf("device: '%s' (%s) '%s'\n",
udev_device_get_syspath(device),
udev_device_get_subsystem(device),
udev_device_get_sysname(device));
return 0;
}

View File

@ -165,18 +165,10 @@ static void print_record(struct udev_device *device)
printf("\n");
}
static int export_all_cb(struct udev *udev,
const char *syspath, const char *subsystem, const char *name,
void *data)
static int export_all_cb(struct udev_device *device, void *data)
{
struct udev_device *device;
device = udev_device_new_from_syspath(udev, syspath);
if (device == NULL)
return 0;
if (udev_device_get_devname(device) != NULL)
print_record(device);
udev_device_unref(device);
return 0;
}

View File

@ -126,7 +126,7 @@ static int pass_to_socket(struct udev *udev, const char *syspath, const char *ac
int fd;
char link_target[UTIL_PATH_SIZE];
int len;
const char *devpath = syspath[strlen(udev_get_sys_path(udev))];
const char *devpath = &syspath[strlen(udev_get_sys_path(udev))];
int err = 0;
if (verbose)