]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added t_readlink().
authorTimo Sirainen <tss@iki.fi>
Sat, 23 Jan 2010 10:37:14 +0000 (12:37 +0200)
committerTimo Sirainen <tss@iki.fi>
Sat, 23 Jan 2010 10:37:14 +0000 (12:37 +0200)
--HG--
branch : HEAD

src/lib/abspath.c
src/lib/abspath.h

index 80903188e9a60404f1b8542968b2accd0fbf3827..aeaa9a4a443c3cdc6b4e798602cae400ff14c3be 100644 (file)
@@ -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;
+}
index cbdc9dede26c81975cb9e2eccb4a8ece71328125..27956fb77573f72bc6e8f44f779ddfe4e2fc06c0 100644 (file)
@@ -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