summaryrefslogtreecommitdiff
path: root/src/libstddjb/absolutepath_tmp.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2017-12-07 15:49:02 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2017-12-07 15:49:02 +0000
commit933e986a9207d2b61c5119e18603b44b924e7226 (patch)
treec670bc83141d6aebc70e31c11168e005a31e5180 /src/libstddjb/absolutepath_tmp.c
parent11f210ecaa0e085612058b459523fa2003578aa5 (diff)
downloadskalibs-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.c63
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 ;
-}