+ util_strscpy(name, sizeof(name), property);
+ val = strchr(name, '=');
+ if (val == NULL)
+ return NULL;
+ val[0] = '\0';
+ val = &val[1];
+ if (val[0] == '\0')
+ val = NULL;
+ return udev_device_add_property(udev_device, name, val);
+}
+
+/*
+ * parse property string, and if needed, update internal values accordingly
+ *
+ * udev_device_add_property_from_string_parse_finish() needs to be
+ * called after adding properties, and its return value checked
+ *
+ * udev_device_set_info_loaded() needs to be set, to avoid trying
+ * to use a device without a DEVPATH set
+ */
+void udev_device_add_property_from_string_parse(struct udev_device *udev_device, const char *property)
+{
+ if (strncmp(property, "DEVPATH=", 8) == 0) {
+ char path[UTIL_PATH_SIZE];
+
+ util_strscpyl(path, sizeof(path), udev_get_sys_path(udev_device->udev), &property[8], NULL);
+ udev_device_set_syspath(udev_device, path);
+ } else if (strncmp(property, "SUBSYSTEM=", 10) == 0) {
+ udev_device_set_subsystem(udev_device, &property[10]);
+ } else if (strncmp(property, "DEVTYPE=", 8) == 0) {
+ udev_device_set_devtype(udev_device, &property[8]);
+ } else if (strncmp(property, "DEVNAME=", 8) == 0) {
+ if (property[8] == '/')
+ udev_device_set_devnode(udev_device, &property[8]);
+ else
+ udev_device_set_knodename(udev_device, &property[8]);
+ } else if (strncmp(property, "DEVLINKS=", 9) == 0) {
+ char devlinks[UTIL_PATH_SIZE];
+ char *slink;
+ char *next;
+
+ util_strscpy(devlinks, sizeof(devlinks), &property[9]);
+ slink = devlinks;
+ next = strchr(slink, ' ');
+ while (next != NULL) {