passwd: rework:
[oweals/busybox.git] / libbb / xreadlink.c
index 66f63b8838cfa4d47bb443f4f1d2d3687d1a3cff..14863d9d5f75cae98fdcdcba8235614677eced43 100644 (file)
@@ -1,5 +1,7 @@
+/* vi: set sw=4 ts=4: */
 /*
- *  xreadlink.c - safe implementation of readlink
+ *  xreadlink.c - safe implementation of readlink.
+ *  Returns a NULL on failure...
  */
 
 #include <stdio.h>
 #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 *xreadlink(const char *path)
+{
+       enum { GROWBY = 80 }; /* how large we will grow strings by */
 
-       char *buf = NULL;   
+       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);
-       }           
+               if (readsize == -1) {
+                       bb_perror_msg("%s", path);
+                       free(buf);
+                       return NULL;
+               }
+       }
        while (bufsize < readsize + 1);
 
        buf[readsize] = '\0';
 
        return buf;
-}       
-
+}