int devlink_priority;
int refcount;
dev_t devnum;
+ int ifindex;
int watch_handle;
int maj, min;
bool parent_set;
udev_device_set_seqnum(udev_device, strtoull(&property[7], NULL, 10));
} else if (strncmp(property, "TIMEOUT=", 8) == 0) {
udev_device_set_timeout(udev_device, strtoull(&property[8], NULL, 10));
+ } else if (strncmp(property, "IFINDEX=", 8) == 0) {
+ udev_device_set_ifindex(udev_device, strtoull(&property[8], NULL, 10));
} else {
udev_device_add_property_from_string(udev_device, property);
}
return 0;
}
- f = fopen(filename, "r");
+ f = fopen(filename, "re");
if (f == NULL) {
dbg(udev_device->udev, "error reading db file %s: %m\n", filename);
return -1;
return 0;
util_strscpyl(filename, sizeof(filename), udev_device->syspath, "/uevent", NULL);
- f = fopen(filename, "r");
+ f = fopen(filename, "re");
if (f == NULL)
return -1;
udev_device->uevent_loaded = true;
maj = strtoull(&line[6], NULL, 10);
else if (strncmp(line, "MINOR=", 6) == 0)
min = strtoull(&line[6], NULL, 10);
+ else if (strncmp(line, "IFINDEX=", 8) == 0)
+ udev_device_set_ifindex(udev_device, strtoull(&line[8], NULL, 10));
else if (strncmp(line, "DEVNAME=", 8) == 0)
udev_device_set_knodename(udev_device, &line[8]);
{
if (udev_device == NULL)
return NULL;
- if (!udev_device->info_loaded)
+ if (!udev_device->info_loaded) {
+ udev_device_read_uevent_file(udev_device);
udev_device_read_db(udev_device);
+ }
+
+ /* we might get called before we handled an event and have a db, use the kernel-provided name */
+ if (udev_device->devnode == NULL && udev_device_get_knodename(udev_device) != NULL) {
+ if (asprintf(&udev_device->devnode, "%s/%s",
+ udev_get_dev_path(udev_device->udev), udev_device_get_knodename(udev_device)) < 0)
+ return NULL;
+ return udev_device->devnode;
+ }
+
return udev_device->devnode;
}
goto out;
/* read attribute value */
- fd = open(path, O_RDONLY);
+ fd = open(path, O_RDONLY|O_CLOEXEC);
if (fd < 0) {
dbg(udev_device->udev, "attribute '%s' can not be opened\n", path);
goto out;
udev_device->watch_handle = handle;
return 0;
}
+
+int udev_device_get_ifindex(struct udev_device *udev_device)
+{
+ return udev_device->ifindex;
+}
+
+int udev_device_set_ifindex(struct udev_device *udev_device, int ifindex)
+{
+ udev_device->ifindex = ifindex;
+ return 0;
+}