summaryrefslogtreecommitdiff
path: root/src/udev/udev-node.c
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2022-09-19 05:25:58 +0900
committerGitHub <noreply@github.com>2022-09-19 05:25:58 +0900
commit5b4671ec47ac727f73404ea7c805fd1a730b6aeb (patch)
treec80a45fa1aceb7ebcaa7d62fe4c020de160bbb15 /src/udev/udev-node.c
parent3afe230d4aa97a89712d160ce7f8900fc644661c (diff)
parent6d42138593b003ca4cd1a11ead2d119e6d730841 (diff)
downloadsystemd-5b4671ec47ac727f73404ea7c805fd1a730b6aeb.tar.gz
Merge pull request #24646 from yuwata/udev-node-symlink_atomic
udev: introduce symlink_atomic_full() and use it
Diffstat (limited to 'src/udev/udev-node.c')
-rw-r--r--src/udev/udev-node.c33
1 files changed, 7 insertions, 26 deletions
diff --git a/src/udev/udev-node.c b/src/udev/udev-node.c
index f3da48862b..9e34ea6b01 100644
--- a/src/udev/udev-node.c
+++ b/src/udev/udev-node.c
@@ -14,6 +14,7 @@
#include "format-util.h"
#include "fs-util.h"
#include "hexdecoct.h"
+#include "label.h"
#include "mkdir-label.h"
#include "parse-util.h"
#include "path-util.h"
@@ -69,8 +70,6 @@ int udev_node_cleanup(void) {
}
static int node_symlink(sd_device *dev, const char *devnode, const char *slink) {
- _cleanup_free_ char *target = NULL;
- const char *id, *slink_tmp;
struct stat st;
int r;
@@ -91,34 +90,16 @@ static int node_symlink(sd_device *dev, const char *devnode, const char *slink)
} else if (errno != ENOENT)
return log_device_debug_errno(dev, errno, "Failed to lstat() '%s': %m", slink);
- /* use relative link */
- r = path_make_relative_parent(slink, devnode, &target);
- if (r < 0)
- return log_device_debug_errno(dev, r, "Failed to get relative path from '%s' to '%s': %m", slink, devnode);
-
- r = device_get_device_id(dev, &id);
+ r = mkdir_parents_label(slink, 0755);
if (r < 0)
- return log_device_debug_errno(dev, r, "Failed to get device id: %m");
-
- slink_tmp = strjoina(slink, ".tmp-", id);
- (void) unlink(slink_tmp);
+ return log_device_debug_errno(dev, r, "Failed to create parent directory of '%s': %m", slink);
- r = mkdir_parents_label(slink_tmp, 0755);
- if (r < 0)
- return log_device_debug_errno(dev, r, "Failed to create parent directory of '%s': %m", slink_tmp);
-
- mac_selinux_create_file_prepare(slink_tmp, S_IFLNK);
- r = RET_NERRNO(symlink(target, slink_tmp));
- mac_selinux_create_file_clear();
+ /* use relative link */
+ r = symlink_atomic_full_label(devnode, slink, /* make_relative = */ true);
if (r < 0)
- return log_device_debug_errno(dev, r, "Failed to create symlink '%s' to '%s': %m", slink_tmp, target);
-
- if (rename(slink_tmp, slink) < 0) {
- r = log_device_debug_errno(dev, errno, "Failed to rename '%s' to '%s': %m", slink_tmp, slink);
- (void) unlink(slink_tmp);
- return r;
- }
+ return log_device_debug_errno(dev, r, "Failed to create symlink '%s' to '%s': %m", slink, devnode);
+ log_device_debug(dev, "Successfully created symlink '%s' to '%s'", slink, devnode);
return 0;
}