diff options
author | Barry Naujok <bnaujok@sgi.com> | 2007-09-11 04:08:29 +0000 |
---|---|---|
committer | Barry Naujok <bnaujok@sgi.com> | 2007-09-11 04:08:29 +0000 |
commit | f9aff61461415248101f14a8adb0350ab693ad39 (patch) | |
tree | 787e671dd57c46db6552360a47e5e57e29cb0e9d /getfattr/getfattr.c | |
parent | 99249fe723c09f6bec1e1e5067c63a4be667523d (diff) | |
download | attr-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/getfattr.c')
-rw-r--r-- | getfattr/getfattr.c | 39 |
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++; } |