diff options
author | Mark Whitley | 2001-04-30 18:17:00 +0000 |
---|---|---|
committer | Mark Whitley | 2001-04-30 18:17:00 +0000 |
commit | 8a633268ef478a31bd649d582ce07e9c26a4a03a (patch) | |
tree | a90a2bc3c3815f7f0e70f009b9b175736902a848 /libbb/xreadlink.c | |
parent | 6f343944548c2e41fde4a376e805bf322a8e01c9 (diff) | |
download | busybox-8a633268ef478a31bd649d582ce07e9c26a4a03a.zip busybox-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.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/libbb/xreadlink.c b/libbb/xreadlink.c new file mode 100644 index 0000000..66f63b8 --- /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; +} + |