diff --git a/udev/lib/exported_symbols b/udev/lib/exported_symbols index 0826e6f6f1..4db23b2251 100644 --- a/udev/lib/exported_symbols +++ b/udev/lib/exported_symbols @@ -10,6 +10,7 @@ udev_device_ref udev_device_unref udev_device_get_udev udev_device_get_devpath +udev_device_get_syspath udev_device_get_devname udev_device_get_subsystem udev_device_get_devlinks diff --git a/udev/lib/libudev-device.c b/udev/lib/libudev-device.c index 6465157fbd..c4d65e9c49 100644 --- a/udev/lib/libudev-device.c +++ b/udev/lib/libudev-device.c @@ -32,6 +32,17 @@ #include "libudev-private.h" #include "../udev.h" +struct udev_device { + int refcount; + struct udev *udev; + char *devpath; + char *syspath; + char *devname; + char *subsystem; + struct list_head link_list; + struct list_head env_list; +}; + struct udev_device *device_init(struct udev *udev) { struct udev_device *udev_device; @@ -99,7 +110,7 @@ struct udev_device *udev_device_new_from_devpath(struct udev *udev, const char * /* resolve possible symlink to real path */ strlcpy(path, devpath, sizeof(path)); sysfs_resolve_link(path, sizeof(path)); - udev_device->devpath = strdup(path); + device_set_devpath(udev_device, devpath); log_info(udev, "device %p has devpath '%s'\n", udev_device, udev_device_get_devpath(udev_device)); err = udev_db_get_device(udevice, path); @@ -171,7 +182,7 @@ void udev_device_unref(struct udev_device *udev_device) udev_device->refcount--; if (udev_device->refcount > 0) return; - free(udev_device->devpath); + free(udev_device->syspath); free(udev_device->devname); free(udev_device->subsystem); name_list_cleanup(&udev_device->link_list); @@ -184,10 +195,10 @@ void udev_device_unref(struct udev_device *udev_device) * udev_device_get_devpath: * @udev_device: udev device * - * Retrieve the sys path of the udev device. The path does not contain - * the sys mount point. + * Retrieve the kernel devpath value of the udev device. The path + * does not contain the sys mount point, and starts with a '/'. * - * Returns: the sys path of the udev device + * Returns: the devpath of the udev device **/ const char *udev_device_get_devpath(struct udev_device *udev_device) { @@ -196,6 +207,22 @@ const char *udev_device_get_devpath(struct udev_device *udev_device) return udev_device->devpath; } +/** + * udev_device_get_syspath: + * @udev_device: udev device + * + * Retrieve the sys path of the udev device. The path is an + * absolute path and starts with the sys mount point. + * + * Returns: the sys path of the udev device + **/ +const char *udev_device_get_syspath(struct udev_device *udev_device) +{ + if (udev_device == NULL) + return NULL; + return udev_device->syspath; +} + /** * udev_device_get_devname: * @udev_device: udev device @@ -305,3 +332,41 @@ int udev_device_get_properties(struct udev_device *udev_device, } return count; } + +int device_set_devpath(struct udev_device *udev_device, const char *devpath) +{ + if (asprintf(&udev_device->syspath, "%s%s", udev_get_sys_path(udev_device->udev), devpath) < 0) + return -ENOMEM; + udev_device->devpath = &udev_device->syspath[strlen(udev_get_sys_path(udev_device->udev))]; + return 0; +} + +int device_set_subsystem(struct udev_device *udev_device, const char *subsystem) +{ + udev_device->subsystem = strdup(subsystem); + if (udev_device->subsystem == NULL) + return -1; + return 0; +} + +int device_set_devname(struct udev_device *udev_device, const char *devname) +{ + udev_device->devname = strdup(devname); + if (udev_device->devname == NULL) + return -ENOMEM; + return 0; +} + +int device_add_devlink(struct udev_device *udev_device, const char *devlink) +{ + if (name_list_add(&udev_device->link_list, devlink, 0) == NULL) + return -ENOMEM; + return 0; +} + +int device_add_property(struct udev_device *udev_device, const char *property) +{ + if (name_list_add(&udev_device->env_list, property, 0) == NULL) + return -ENOMEM; + return 0; +} diff --git a/udev/lib/libudev-monitor.c b/udev/lib/libudev-monitor.c index c8f07eae8f..92617e8888 100644 --- a/udev/lib/libudev-monitor.c +++ b/udev/lib/libudev-monitor.c @@ -257,25 +257,25 @@ struct udev_device *udev_monitor_get_device(struct udev_monitor *udev_monitor) bufpos += keylen + 1; if (strncmp(key, "DEVPATH=", 8) == 0) { - udev_device->devpath = strdup(&key[8]); + device_set_devpath(udev_device, &key[8]); } else if (strncmp(key, "SUBSYSTEM=", 10) == 0) { - udev_device->subsystem = strdup(&key[10]); + device_set_subsystem(udev_device, &key[10]); } else if (strncmp(key, "DEVNAME=", 8) == 0) { - udev_device->devname = strdup(&key[8]); + device_set_devname(udev_device, &key[8]); } else if (strncmp(key, "DEVLINKS=", 9) == 0) { char *slink = &key[9]; char *next = strchr(slink, ' '); while (next != NULL) { next[0] = '\0'; - name_list_add(&udev_device->link_list, slink, 0); + device_add_devlink(udev_device, slink); slink = &next[1]; next = strchr(slink, ' '); } if (slink[0] != '\0') - name_list_add(&udev_device->link_list, slink, 0); + device_add_devlink(udev_device, slink); } - name_list_add(&udev_device->env_list, key, 0); + device_add_property(udev_device, key); } return udev_device; diff --git a/udev/lib/libudev-private.h b/udev/lib/libudev-private.h index 6331f99d5b..ffdf571513 100644 --- a/udev/lib/libudev-private.h +++ b/udev/lib/libudev-private.h @@ -43,16 +43,16 @@ void udev_log(struct udev *udev, #define log_err(format, arg...) do { } while (0) #endif -struct udev_device { - int refcount; - struct udev *udev; - char *devpath; - char *devname; - char *subsystem; - struct list_head link_list; - struct list_head env_list; -}; - +/* libudev */ extern struct udev_device *device_init(struct udev *udev); + +/* libudev-device */ +extern int device_set_devpath(struct udev_device *udev_device, const char *devpath); +extern int device_set_subsystem(struct udev_device *udev_device, const char *subsystem); +extern int device_set_devname(struct udev_device *udev_device, const char *devname); +extern int device_add_devlink(struct udev_device *udev_device, const char *devlink); +extern int device_add_property(struct udev_device *udev_device, const char *property); + +/* libudev-utils */ extern ssize_t util_get_sys_subsystem(struct udev *udev, const char *devpath, char *subsystem, size_t size); #endif diff --git a/udev/lib/libudev.h b/udev/lib/libudev.h index 3a1c1bf3ac..30753a19a7 100644 --- a/udev/lib/libudev.h +++ b/udev/lib/libudev.h @@ -44,8 +44,9 @@ 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_devname(struct udev_device *udev_device); extern const char *udev_device_get_subsystem(struct udev_device *udev_device); +extern const char *udev_device_get_syspath(struct udev_device *udev_device); +extern const char *udev_device_get_devname(struct udev_device *udev_device); extern int udev_device_get_devlinks(struct udev_device *udev_device, int (*cb)(struct udev_device *udev_device, const char *value, void *data), diff --git a/udev/lib/test-libudev.c b/udev/lib/test-libudev.c index 3c38600192..d0095f15fc 100644 --- a/udev/lib/test-libudev.c +++ b/udev/lib/test-libudev.c @@ -58,6 +58,8 @@ static void print_device(struct udev_device *device) printf("devpath: '%s'\n", str); str = udev_device_get_subsystem(device); printf("subsystem: '%s'\n", str); + str = udev_device_get_syspath(device); + printf("syspath: '%s'\n", str); str = udev_device_get_devname(device); printf("devname: '%s'\n", str); count = udev_device_get_devlinks(device, print_devlinks_cb, NULL);