sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit 903d43bbb85a2846030cdfaae8b6d7597b16a1d6
parent 8dc92fbd6cb4f5ac8e5297db06028cee535200d8
Author: FRIGN <dev@frign.de>
Date:   Tue,  3 Mar 2015 00:11:41 +0100

Use dynamic array in recurse() instead of PATH_MAX-array

Thanks Evan!

Diffstat:
Mlibutil/recurse.c | 14++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/libutil/recurse.c b/libutil/recurse.c @@ -15,10 +15,11 @@ int recurse_follow = 'P'; void recurse(const char *path, void (*fn)(const char *, int), int depth) { - char buf[PATH_MAX]; struct dirent *d; struct stat lst, st; DIR *dp; + size_t len; + char *buf; if (lstat(path, &lst) < 0) eprintf("lstat %s:", path); @@ -31,17 +32,14 @@ recurse(const char *path, void (*fn)(const char *, int), int depth) if (!(dp = opendir(path))) eprintf("opendir %s:", path); + len = strlen(path); while ((d = readdir(dp))) { if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, "..")) continue; - if (strlcpy(buf, path, sizeof(buf)) >= sizeof(buf)) - eprintf("path too long\n"); - if (buf[strlen(buf) - 1] != '/') - if (strlcat(buf, "/", sizeof(buf)) >= sizeof(buf)) - eprintf("path too long\n"); - if (strlcat(buf, d->d_name, sizeof(buf)) >= sizeof(buf)) - eprintf("path too long\n"); + buf = emalloc(len + (*(path + len) != '/') + strlen(d->d_name) + 1); + sprintf(buf, "%s%s%s", path, (*(path + len) == '/') ? "" : "/", d->d_name); fn(buf, depth + 1); + free(buf); } closedir(dp);