From e282ab2a97731af46a4c7f8f3cef45d39fb19997 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Sat, 23 Jan 2010 12:37:14 +0200 Subject: [PATCH] Added t_readlink(). --HG-- branch : HEAD --- src/lib/abspath.c | 21 +++++++++++++++++++++ src/lib/abspath.h | 2 ++ 2 files changed, 23 insertions(+) diff --git a/src/lib/abspath.c b/src/lib/abspath.c index 80903188e9..aeaa9a4a44 100644 --- a/src/lib/abspath.c +++ b/src/lib/abspath.c @@ -42,3 +42,24 @@ int t_get_current_dir(const char **dir_r) *dir_r = dir; return 0; } + +int t_readlink(const char *path, const char **dest_r) +{ + /* @UNSAFE */ + ssize_t ret; + char *dest; + size_t size = 128; + + dest = t_buffer_get(size); + while ((ret = readlink(path, dest, size)) >= (ssize_t)size) { + size = nearest_power(size+1); + dest = t_buffer_get(size); + } + if (ret < 0) + return -1; + + dest[ret] = '\0'; + t_buffer_alloc(ret + 1); + *dest_r = dest; + return 0; +} diff --git a/src/lib/abspath.h b/src/lib/abspath.h index cbdc9dede2..27956fb775 100644 --- a/src/lib/abspath.h +++ b/src/lib/abspath.h @@ -9,5 +9,7 @@ const char *t_abspath_to(const char *path, const char *root); /* Returns current directory, allocated from data stack. */ int t_get_current_dir(const char **dir_r); +/* Returns symlink destination, allocated from data stack. */ +int t_readlink(const char *path, const char **dest_r); #endif -- 2.47.3