From 933e986a9207d2b61c5119e18603b44b924e7226 Mon Sep 17 00:00:00 2001 From: Laurent Bercot Date: Thu, 7 Dec 2017 15:49:02 +0000 Subject: Finally implement sarealpath() over realpath(). Prettier atomic_symlink(). --- src/libunixonacid/atomic_symlink.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src/libunixonacid') diff --git a/src/libunixonacid/atomic_symlink.c b/src/libunixonacid/atomic_symlink.c index 660e4d3..d438263 100644 --- a/src/libunixonacid/atomic_symlink.c +++ b/src/libunixonacid/atomic_symlink.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -17,7 +18,7 @@ int atomic_symlink (char const *target, char const *name, char const *suffix) } { size_t namelen = strlen(name) ; - size_t suffixlen = suffix ? strlen(suffix) : 8 ; + size_t suffixlen = suffix ? strlen(suffix) : 25 ; char tmp[namelen + suffixlen + 2] ; memcpy(tmp, name, namelen) ; tmp[namelen] = ':' ; @@ -25,8 +26,14 @@ int atomic_symlink (char const *target, char const *name, char const *suffix) memcpy(tmp + namelen + 1, suffix, suffixlen + 1) ; else { - random_name(tmp + namelen + 1, 8) ; - tmp[namelen + 9] = 0 ; + memcpy(tmp + namelen + 1, "atomic_symlink:", 15) ; + random_name(tmp + namelen + 16, 8) ; + tmp[namelen + 24] = 0 ; + } + { + int e = errno ; + if (unlink(tmp) < 0 && errno != ENOENT) return 0 ; + errno = e ; } if (symlink(target, tmp) < 0) return 0 ; if (rename(tmp, name) < 0) -- cgit v1.2.3