of the recursive scan, on the grounds that they're more likely to
have wanted a scan of the link target than of the link itself. We
still don't follow symlinks once we've started recursing, of course.
git-svn-id: svn://svn.tartarus.org/sgt/agedu@8329
cda61777-01e9-0310-a592-
d414129be87e
+#if defined HAVE_LSTAT64 && HAVE_STAT64
#define STRUCT_STAT struct stat64
#define LSTAT lstat64
#define STRUCT_STAT struct stat64
#define LSTAT lstat64
#else
#define STRUCT_STAT struct stat
#define LSTAT lstat
#else
#define STRUCT_STAT struct stat
#define LSTAT lstat
}
static void du_recurse(char **path, size_t pathlen, size_t *pathsize,
}
static void du_recurse(char **path, size_t pathlen, size_t *pathsize,
- gotdata_fn_t gotdata, err_fn_t err, void *gotdata_ctx)
+ gotdata_fn_t gotdata, err_fn_t err, void *gotdata_ctx,
+ int toplevel)
{
const char *name;
dirhandle d;
STRUCT_STAT st;
char **names;
size_t i, nnames, namesize;
{
const char *name;
dirhandle d;
STRUCT_STAT st;
char **names;
size_t i, nnames, namesize;
- if (LSTAT(*path, &st) < 0) {
+ /*
+ * Special case: at the very top of the scan, we follow a
+ * symlink.
+ */
+ if (toplevel)
+ statret = STAT(*path, &st);
+ else
+ statret = LSTAT(*path, &st);
+ if (statret < 0) {
err(gotdata_ctx, "%s: lstat: %s\n", *path, strerror(errno));
return;
}
err(gotdata_ctx, "%s: lstat: %s\n", *path, strerror(errno));
return;
}
sprintf(*path + pathlen, "/%s", names[i]);
}
sprintf(*path + pathlen, "/%s", names[i]);
}
- du_recurse(path, newpathlen, pathsize, gotdata, err, gotdata_ctx);
+ du_recurse(path, newpathlen, pathsize, gotdata, err, gotdata_ctx, 0);
path = snewn(pathsize, char);
strcpy(path, inpath);
path = snewn(pathsize, char);
strcpy(path, inpath);
- du_recurse(&path, pathlen, &pathsize, gotdata, err, gotdata_ctx);
+ du_recurse(&path, pathlen, &pathsize, gotdata, err, gotdata_ctx, 1);