1/* 2 * xreadlink.c - safe implementation of readlink. 3 * Returns a NULL on failure... 4 */ 5 6#include <stdio.h> 7 8/* 9 * NOTE: This function returns a malloced char* that you will have to free 10 * yourself. You have been warned. 11 */ 12 13#include <unistd.h> 14#include "libbb.h" 15 16extern char *xreadlink(const char *path) 17{ 18 static const int GROWBY = 80; /* how large we will grow strings by */ 19 20 char *buf = NULL; 21 int bufsize = 0, readsize = 0; 22 23 do { 24 buf = xrealloc(buf, bufsize += GROWBY); 25 readsize = readlink(path, buf, bufsize); /* 1st try */ 26 if (readsize == -1) { 27 perror_msg("%s:%s", applet_name, path); 28 return NULL; 29 } 30 } 31 while (bufsize < readsize + 1); 32 33 buf[readsize] = '\0'; 34 35 return buf; 36} 37 38