return 0;
}
+static int node_remove_symlink(sd_device *dev, const char *slink) {
+ assert(dev);
+ assert(slink);
+
+ if (unlink(slink) < 0 && errno != ENOENT)
+ return log_device_debug_errno(dev, errno, "Failed to remove '%s': %m", slink);
+
+ (void) rmdir_parents(slink, "/dev");
+ return 0;
+}
+
static int node_create_symlink(sd_device *dev, const char *devnode, const char *slink) {
struct stat st;
int r;
/* On removal, we cannot verify the diskseq. Skipping further check below. */
if (!add) {
- if (unlink(slink) < 0 && errno != ENOENT)
- return log_device_debug_errno(dev, errno, "Failed to remove '%s': %m", slink);
+ r = node_remove_symlink(dev, slink);
+ if (r < 0)
+ return r;
- (void) rmdir_parents(slink, "/dev");
return 1; /* done */
}
return node_create_symlink(dev, devnode, slink);
log_device_debug(dev, "No reference left for '%s', removing", slink);
-
- if (unlink(slink) < 0 && errno != ENOENT)
- log_device_debug_errno(dev, errno, "Failed to remove '%s', ignoring: %m", slink);
-
- (void) rmdir_parents(slink, "/dev");
-
- return 0;
+ return node_remove_symlink(dev, slink);
}
static int device_get_devpath_by_devnum(sd_device *dev, char **ret) {
return log_device_debug_errno(dev, r, "Failed to get device path: %m");
/* remove /dev/{block,char}/$major:$minor */
- if (unlink(filename) < 0 && errno != ENOENT)
- return log_device_debug_errno(dev, errno, "Failed to remove '%s': %m", filename);
-
- return 0;
+ return node_remove_symlink(dev, filename);
}
static int udev_node_apply_permissions_impl(