aboutsummaryrefslogtreecommitdiff
path: root/libbb/xreadlink.c
diff options
context:
space:
mode:
authorMark Whitley <markw@lineo.com>2001-04-30 18:17:00 +0000
committerMark Whitley <markw@lineo.com>2001-04-30 18:17:00 +0000
commit8a633268ef478a31bd649d582ce07e9c26a4a03a (patch)
treea90a2bc3c3815f7f0e70f009b9b175736902a848 /libbb/xreadlink.c
parent6f343944548c2e41fde4a376e805bf322a8e01c9 (diff)
downloadbusybox-8a633268ef478a31bd649d582ce07e9c26a4a03a.tar.gz
Made new xreadlink function for libbb and changed applets to use it instead of
readlink(2).
Diffstat (limited to 'libbb/xreadlink.c')
-rw-r--r--libbb/xreadlink.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/libbb/xreadlink.c b/libbb/xreadlink.c
new file mode 100644
index 000000000..66f63b883
--- /dev/null
+++ b/libbb/xreadlink.c
@@ -0,0 +1,34 @@
+/*
+ * xreadlink.c - safe implementation of readlink
+ */
+
+#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);
+ }
+ while (bufsize < readsize + 1);
+
+ buf[readsize] = '\0';
+
+ return buf;
+}
+