2006-07-25 Jim Meyering <jim@meyering.net>
+ Get --dired offsets right when handling stat-failed entries.
+ * src/ls.c (print_long_format): Be careful to increment P by the
+ appropriate amount, even when inode_number_width and nlink_width
+ are zero.
+ * tests/ls/stat-failed: Test for the above.
+
* src/ls.c (gobble_file) [USE_ACL]: Don't use-uninitialized the
have_acl member. That would happen for a directory with both a
non-stat'able entry and one with an ACL.
char hbuf[INT_BUFSIZE_BOUND (uintmax_t)];
sprintf (p, "%*s ", inode_number_width,
f->stat_failed ? "?" : umaxtostr (f->stat.st_ino, hbuf));
- p += inode_number_width + 1;
+ /* Increment by strlen (p) here, rather than by inode_number_width + 1.
+ The latter is wrong when inode_number_width is zero. */
+ p += strlen (p);
}
if (print_block_size)
sprintf (p, "%s %*s ", modebuf, nlink_width,
f->stat_failed ? "?" : umaxtostr (f->stat.st_nlink, hbuf));
}
- p += sizeof modebuf - 2 + any_has_acl + 1 + nlink_width + 1;
+ /* Increment by strlen (p) here, rather than by, e.g.,
+ sizeof modebuf - 2 + any_has_acl + 1 + nlink_width + 1.
+ The latter is wrong when nlink_width is zero. */
+ p += strlen (p);
DIRED_INDENT ();
ls -Log d > out 2> err
test $? = 1 || fail=1
+cat <<\EOF > exp || fail=1
+total 0
+?--------- ? ? ? d/s
+EOF
+
+cmp out exp || fail=1
+test $fail = 1 && diff out exp 2> /dev/null
+
+# Ensure that the offsets in --dired output are accurate.
+rm -f out exp
+ls --dired -il d > out 2> /dev/null && fail=1
+
+cat <<\EOF > exp || fail=1
+ total 0
+ ? ?--------- ? ? ? ? ? d/s
+//DIRED// 46 49
+//DIRED-OPTIONS// --quoting-style=literal
+EOF
+
+cmp out exp || fail=1
+test $fail = 1 && diff out exp 2> /dev/null
+
(exit $fail); exit $fail