/* * xreadlink.c - safe implementation of readlink. * Returns a NULL on failure... */ #include <stdio.h> /* * NOTE: This function returns a malloced char* that you will have to free * yourself. You have been warned. */ #include <unistd.h> #include "libbb.h" extern char *xreadlink(const char *path) { static const int GROWBY = 80; /* how large we will grow strings by */ char *buf = NULL; int bufsize = 0, readsize = 0; do { buf = xrealloc(buf, bufsize += GROWBY); readsize = readlink(path, buf, bufsize); /* 1st try */ if (readsize == -1) { perror_msg("%s:%s", applet_name, path); return NULL; } } while (bufsize < readsize + 1); buf[readsize] = '\0'; return buf; }