_public_ int sd_device_open(sd_device *device, int flags) {
_cleanup_close_ int fd = -1, fd2 = -1;
- const char *devname, *subsystem = NULL;
+ const char *devname, *subsystem = NULL, *val = NULL;
uint64_t q, diskseq = 0;
struct stat st;
dev_t devnum;
if (r < 0 && r != -ENOENT)
return r;
- r = sd_device_get_diskseq(device, &diskseq);
- if (r < 0 && r != -ENOENT)
- return r;
-
fd = open(devname, FLAGS_SET(flags, O_PATH) ? flags : O_CLOEXEC|O_NOFOLLOW|O_PATH);
if (fd < 0)
return -errno;
if (FLAGS_SET(flags, O_PATH))
return TAKE_FD(fd);
+ r = sd_device_get_property_value(device, "ID_IGNORE_DISKSEQ", &val);
+ if (r < 0 && r != -ENOENT)
+ return r;
+
+ if (!val || parse_boolean(val) <= 0) {
+ r = sd_device_get_diskseq(device, &diskseq);
+ if (r < 0 && r != -ENOENT)
+ return r;
+ }
+
fd2 = open(FORMAT_PROC_FD_PATH(fd), flags);
if (fd2 < 0)
return -errno;