diff options
author | Laurent Bercot <ska-skaware@skarnet.org> | 2017-12-07 15:49:02 +0000 |
---|---|---|
committer | Laurent Bercot <ska-skaware@skarnet.org> | 2017-12-07 15:49:02 +0000 |
commit | 933e986a9207d2b61c5119e18603b44b924e7226 (patch) | |
tree | c670bc83141d6aebc70e31c11168e005a31e5180 /src/libstddjb/absolutepath_tmp.c | |
parent | 11f210ecaa0e085612058b459523fa2003578aa5 (diff) | |
download | skalibs-933e986a9207d2b61c5119e18603b44b924e7226.tar.xz |
Finally implement sarealpath() over realpath(). Prettier atomic_symlink().
Diffstat (limited to 'src/libstddjb/absolutepath_tmp.c')
-rw-r--r-- | src/libstddjb/absolutepath_tmp.c | 63 |
1 files changed, 0 insertions, 63 deletions
diff --git a/src/libstddjb/absolutepath_tmp.c b/src/libstddjb/absolutepath_tmp.c deleted file mode 100644 index 100a7e9..0000000 --- a/src/libstddjb/absolutepath_tmp.c +++ /dev/null @@ -1,63 +0,0 @@ -/* ISC license. */ - -/* MT-unsafe (because of chdir) */ - -#include <unistd.h> -#include <errno.h> -#include <skalibs/stralloc.h> -#include <skalibs/djbunix.h> - -int sarealpath_tmp (stralloc *sa, char const *path, stralloc *tmp) -{ - size_t tmpbase = tmp->len ; - size_t base = sa->len ; - unsigned int loop = 48 ; - int fdhere ; - int wasnull = !sa->s ; - - if (!path) return (errno = EINVAL, -1) ; - if (!stralloc_cats(sa, path)) return -1 ; - fdhere = open_read(".") ; - if (fdhere == -1) - { - if (wasnull) stralloc_free(sa) ; else sa->len = base ; - return -1 ; - } - - do - { - tmp->len = tmpbase ; - if (!loop--) { errno = ELOOP ; goto err ; } - if (!sadirname(tmp, sa->s + base, sa->len - base) - || !stralloc_0(tmp) - || (chdir(tmp->s + tmpbase) == -1)) - goto err ; - tmp->len = tmpbase ; - if (!sabasename(tmp, sa->s + base, sa->len - base) - || !stralloc_0(tmp)) goto err ; - sa->len = base ; - } - while (sareadlink(sa, tmp->s + tmpbase) >= 0) ; - - if ((errno != EINVAL) - || (sagetcwd(sa) == -1) - || ((sa->len > base + 1) && !stralloc_catb(sa, "/", 1)) - || ((--tmp->len > tmpbase) && (tmp->s[tmpbase] != '/') && !stralloc_catb(sa, tmp->s + tmpbase, tmp->len - tmpbase))) - goto err ; - - tmp->len = tmpbase ; - fd_chdir(fdhere) ; - fd_close(fdhere) ; - return 0 ; - -err: - { - int e = errno ; - tmp->len = tmpbase ; - fd_chdir(fdhere) ; - fd_close(fdhere) ; - if (wasnull) stralloc_free(sa) ; else sa->len = base ; - errno = e ; - } - return -1 ; -} |