summaryrefslogtreecommitdiff
path: root/getfattr
diff options
context:
space:
mode:
authorBarry Naujok <bnaujok@sgi.com>2007-09-11 04:08:29 +0000
committerBarry Naujok <bnaujok@sgi.com>2007-09-11 04:08:29 +0000
commitf9aff61461415248101f14a8adb0350ab693ad39 (patch)
tree787e671dd57c46db6552360a47e5e57e29cb0e9d /getfattr
parent99249fe723c09f6bec1e1e5067c63a4be667523d (diff)
downloadattr-f9aff61461415248101f14a8adb0350ab693ad39.tar.gz
Fix symlink handling in getfattr, getfacl and setfacl
Merge of master-melb:xfs-cmds:29637a by kenmcd. Fix symlink handling in getfattr
Diffstat (limited to 'getfattr')
-rw-r--r--getfattr/getfattr.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/getfattr/getfattr.c b/getfattr/getfattr.c
index 4875990..dccad37 100644
--- a/getfattr/getfattr.c
+++ b/getfattr/getfattr.c
@@ -410,6 +410,38 @@ void help(void)
" --help this help text\n"));
}
+char *resolve_symlinks(const char *file)
+{
+ static char buffer[4096];
+ struct stat stat;
+ char *path = NULL;
+
+ if (lstat(file, &stat) == -1)
+ return path;
+
+ if (S_ISLNK(stat.st_mode) && !opt_walk_physical)
+ path = realpath(file, buffer);
+ else
+ path = (char *)file; /* not a symlink, use given path */
+
+ return path;
+}
+
+int walk_tree(const char *file)
+{
+ const char *p;
+
+ if ((p = resolve_symlinks(file)) == NULL) {
+ fprintf(stderr, "%s: %s: %s\n", progname,
+ xquote(file), strerror(errno));
+ return 1;
+ } else if (nftw(p, do_print, 0, opt_walk_logical? 0 : FTW_PHYS) < 0) {
+ fprintf(stderr, "%s: %s: %s\n", progname, xquote(file),
+ strerror(errno));
+ return 1;
+ }
+ return 0;
+}
int main(int argc, char *argv[])
{
@@ -499,12 +531,7 @@ int main(int argc, char *argv[])
}
while (optind < argc) {
- if (nftw(argv[optind], do_print, 0,
- opt_walk_physical * FTW_PHYS) < 0) {
- fprintf(stderr, "%s: %s: %s\n", progname, argv[optind],
- strerror_ea(errno));
- had_errors++;
- }
+ had_errors += walk_tree(argv[optind]);
optind++;
}