goto deleted_file;
if (S_ISLNK(st.st_mode)) {
- size_t len = st.st_size;
+ size_t len = xsize_t(st.st_size);
result_size = len;
result = xmalloc(len + 1);
if (result_size != readlink(elem->path, result, len)) {
}
else if (0 <= (fd = open(elem->path, O_RDONLY)) &&
!fstat(fd, &st)) {
- size_t len = st.st_size;
+ size_t len = xsize_t(st.st_size);
size_t sz = 0;
+ int is_file, i;
elem->mode = canon_mode(st.st_mode);
+ /* if symlinks don't work, assume symlink if all parents
+ * are symlinks
+ */
+ is_file = has_symlinks;
+ for (i = 0; !is_file && i < num_parent; i++)
+ is_file = !S_ISLNK(elem->parent[i].mode);
+ if (!is_file)
+ elem->mode = canon_mode(S_IFLNK);
+
result_size = len;
result = xmalloc(len + 1);
while (sz < len) {