if (r < 0)
return log_device_debug_errno(dev, r, "Failed to get device name: %m");
- fd = open(devnode, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
+ fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
if (fd < 0) {
- log_device_debug_errno(dev, errno, "Failed to open block device %s%s: %m",
- devnode, errno == ENOENT ? ", ignoring" : "");
- return errno == ENOENT ? 0 : -errno;
+ bool ignore = ERRNO_IS_DEVICE_ABSENT(fd);
+ log_device_debug_errno(dev, fd, "Failed to open block device %s%s: %m",
+ devnode, ignore ? ", ignoring" : "");
+ return ignore ? 0 : fd;
}
errno = 0;
return (absinfo->maximum - absinfo->minimum) / absinfo->resolution;
}
-static void extract_info(sd_device *dev, const char *devpath, bool test) {
+static void extract_info(sd_device *dev, bool test) {
char width[DECIMAL_STR_MAX(int)], height[DECIMAL_STR_MAX(int)];
struct input_absinfo xabsinfo = {}, yabsinfo = {};
_cleanup_close_ int fd = -1;
- fd = open(devpath, O_RDONLY|O_CLOEXEC);
+ fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
if (fd < 0)
return;
unsigned long bitmask_key[NBITS(KEY_MAX)];
unsigned long bitmask_rel[NBITS(REL_MAX)];
unsigned long bitmask_props[NBITS(INPUT_PROP_MAX)];
- const char *sysname, *devnode;
+ const char *sysname;
bool is_pointer;
bool is_key;
}
- if (sd_device_get_devname(dev, &devnode) >= 0 &&
- sd_device_get_sysname(dev, &sysname) >= 0 &&
+ if (sd_device_get_sysname(dev, &sysname) >= 0 &&
startswith(sysname, "event"))
- extract_info(dev, devnode, test);
+ extract_info(dev, test);
return 0;
}
}
if (fd < 0) {
- fd = open(node, O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
+ fd = sd_device_open(dev, O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
if (fd < 0)
- return log_device_error_errno(dev, errno, "Failed to open device '%s': %m", node);
+ return log_device_error_errno(dev, fd, "Failed to open device '%s': %m", node);
}
(void) map_keycode(dev, fd, scancode, keycode);
}
if (fd < 0) {
- fd = open(node, O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
+ fd = sd_device_open(dev, O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
if (fd < 0)
- return log_device_error_errno(dev, errno, "Failed to open device '%s': %m", node);
+ return log_device_error_errno(dev, fd, "Failed to open device '%s': %m", node);
}
if (has_abs == -1) {
gid_t gid,
OrderedHashmap *seclabel_list) {
- const char *devnode, *subsystem, *id = NULL;
+ const char *devnode, *subsystem;
bool apply_mode, apply_uid, apply_gid;
_cleanup_close_ int node_fd = -1;
struct stat stats;
r = sd_device_get_devnum(dev, &devnum);
if (r < 0)
return log_device_debug_errno(dev, r, "Failed to get devnum: %m");
- (void) device_get_device_id(dev, &id);
if (streq(subsystem, "block"))
mode |= S_IFBLK;
else
mode |= S_IFCHR;
- node_fd = open(devnode, O_PATH|O_NOFOLLOW|O_CLOEXEC);
+ node_fd = sd_device_open(dev, O_PATH|O_CLOEXEC);
if (node_fd < 0) {
- if (errno == ENOENT) {
- log_device_debug_errno(dev, errno, "Device node %s is missing, skipping handling.", devnode);
+ if (ERRNO_IS_DEVICE_ABSENT(node_fd)) {
+ log_device_debug_errno(dev, node_fd, "Device node %s is missing, skipping handling.", devnode);
return 0; /* This is necessarily racey, so ignore missing the device */
}
- return log_device_debug_errno(dev, errno, "Cannot open node %s: %m", devnode);
+ return log_device_debug_errno(dev, node_fd, "Cannot open node %s: %m", devnode);
}
if (fstat(node_fd, &stats) < 0)
return log_device_debug_errno(dev, errno, "cannot stat() node %s: %m", devnode);
- if ((mode != MODE_INVALID && (stats.st_mode & S_IFMT) != (mode & S_IFMT)) || stats.st_rdev != devnum) {
- log_device_debug(dev, "Found node '%s' with non-matching devnum %s, skipping handling.",
- devnode, strna(id));
- return 0; /* We might process a device that already got replaced by the time we have a look
- * at it, handle this gracefully and step away. */
- }
-
apply_mode = mode != MODE_INVALID && (stats.st_mode & 0777) != (mode & 0777);
apply_uid = uid_is_valid(uid) && stats.st_uid != uid;
apply_gid = gid_is_valid(gid) && stats.st_gid != gid;
return loop_write(manager->worker_watch[WRITE_END], &result, sizeof(result), false);
}
-static int device_get_whole_disk(sd_device *dev, const char **ret) {
+static int device_get_whole_disk(sd_device *dev, sd_device **ret_device, const char **ret_devname) {
const char *val;
int r;
assert(dev);
- assert(ret);
if (device_for_action(dev, SD_DEVICE_REMOVE))
goto irrelevant;
if (r < 0)
return log_device_debug_errno(dev, r, "Failed to get devname: %m");
- *ret = val;
+ if (ret_device)
+ *ret_device = dev;
+ if (ret_devname)
+ *ret_devname = val;
return 1;
irrelevant:
- *ret = NULL;
+ if (ret_device)
+ *ret_device = NULL;
+ if (ret_devname)
+ *ret_devname = NULL;
return 0;
}
static int worker_lock_whole_disk(sd_device *dev, int *ret_fd) {
_cleanup_close_ int fd = -1;
+ sd_device *dev_whole_disk;
const char *val;
int r;
* event handling; in the case udev acquired the lock, the external process can block until udev has
* finished its event handling. */
- r = device_get_whole_disk(dev, &val);
+ r = device_get_whole_disk(dev, &dev_whole_disk, &val);
if (r < 0)
return r;
if (r == 0)
goto nolock;
- fd = open(val, O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
+ fd = sd_device_open(dev_whole_disk, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
if (fd < 0) {
- bool ignore = ERRNO_IS_DEVICE_ABSENT(errno);
+ bool ignore = ERRNO_IS_DEVICE_ABSENT(fd);
- log_device_debug_errno(dev, errno, "Failed to open '%s'%s: %m", val, ignore ? ", ignoring" : "");
+ log_device_debug_errno(dev, fd, "Failed to open '%s'%s: %m", val, ignore ? ", ignoring" : "");
if (!ignore)
- return -errno;
+ return fd;
goto nolock;
}
if (STARTSWITH_SET(val, "dm-", "md", "drbd", "loop", "nbd", "zram"))
return 0;
- r = sd_device_get_devname(dev, &val);
- if (r == -ENOENT)
- return 0;
- if (r < 0)
- return log_device_debug_errno(dev, r, "Failed to get devname: %m");
-
- fd = open(val, O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
+ fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
if (fd < 0)
- return log_device_debug_errno(dev, errno, "Failed to open '%s', ignoring: %m", val);
+ return log_device_debug_errno(dev, fd, "Failed to open '%s', ignoring: %m", val);
if (ioctl(fd, BLKROSET, &state) < 0)
return log_device_warning_errno(dev, errno, "Failed to mark block device '%s' read-only: %m", val);
* device is not locked anymore. The assumption may not be true, but that should not cause any
* issues, as in that case events will be requeued soon. */
- r = device_get_whole_disk(dev, &devname);
+ r = device_get_whole_disk(dev, NULL, &devname);
if (r <= 0)
return r;
if (event->retry_again_next_usec == 0)
continue;
- if (device_get_whole_disk(event->dev, &event_devname) <= 0)
+ if (device_get_whole_disk(event->dev, NULL, &event_devname) <= 0)
continue;
if (!streq(devname, event_devname))
!startswith(sysname, "dm-")) {
_cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL;
bool part_table_read = false, has_partitions = false;
- const char *devname;
sd_device *d;
int fd;
- r = sd_device_get_devname(dev, &devname);
- if (r < 0)
- return r;
-
/* Try to re-read the partition table. This only succeeds if none of the devices is
* busy. The kernel returns 0 if no partition table is found, and we will not get an
* event for the disk. */
- fd = open(devname, O_RDONLY|O_CLOEXEC|O_NOFOLLOW|O_NONBLOCK);
+ fd = sd_device_open(dev, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
if (fd >= 0) {
r = flock(fd, LOCK_EX|LOCK_NB);
if (r >= 0)