From: Timo Sirainen Date: Sat, 23 Jan 2010 10:37:14 +0000 (+0200) Subject: Added t_readlink(). X-Git-Tag: 2.0.beta2~48 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e282ab2a97731af46a4c7f8f3cef45d39fb19997;p=thirdparty%2Fdovecot%2Fcore.git Added t_readlink(). --HG-- branch : HEAD --- 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