rpms/acl/devel acl-2.2.39-walk.patch,1.1,1.2 acl.spec,1.31,1.32
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Wed Mar 21 10:36:11 UTC 2007
Author: twoerner
Update of /cvs/dist/rpms/acl/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv1423
Modified Files:
acl-2.2.39-walk.patch acl.spec
Log Message:
[tw]
- new improved walk patch with fixed getfacl exit code (rhbz#232884)
acl-2.2.39-walk.patch:
getfacl.c | 179 +++++++++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 127 insertions(+), 52 deletions(-)
Index: acl-2.2.39-walk.patch
===================================================================
RCS file: /cvs/dist/rpms/acl/devel/acl-2.2.39-walk.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- acl-2.2.39-walk.patch 23 Feb 2007 00:04:48 -0000 1.1
+++ acl-2.2.39-walk.patch 21 Mar 2007 10:36:08 -0000 1.2
@@ -1,5 +1,5 @@
--- acl-2.2.39/getfacl/getfacl.c.walk 2006-06-20 08:51:25.000000000 +0200
-+++ acl-2.2.39/getfacl/getfacl.c 2007-02-16 18:58:29.000000000 +0100
++++ acl-2.2.39/getfacl/getfacl.c 2007-03-21 10:52:07.000000000 +0100
@@ -34,7 +34,6 @@
#include <dirent.h>
#include <libgen.h>
@@ -21,7 +21,7 @@
int opt_print_acl = 0;
int opt_print_default_acl = 0;
int opt_strip_leading_slash = 1;
-@@ -562,71 +561,84 @@
+@@ -562,71 +561,140 @@
static int __errors;
@@ -36,7 +36,13 @@
+ DIR *dir;
+ struct dirent *entry;
+ struct stat buf;
-+ char path[FILENAME_MAX+1];
++ char path[FILENAME_MAX];
++ char path2[FILENAME_MAX];
++ char path3[FILENAME_MAX];
++ char *dir_name;
++ size_t len;
++ ssize_t slen;
++ int res;
/* Process the target of a symbolic link, and traverse the link,
only if doing a logical walk, or if the symbolic link was
@@ -45,32 +51,96 @@
- if (S_ISLNK(stat->st_mode) &&
- (opt_walk_physical || (ftw->level > 0 && !opt_walk_logical)))
-+ if (level > 0 && !opt_recursive)
++ len = strlen(file);
++ /* check for FILENAME_MAX */
++ if (len >= FILENAME_MAX) {
++ fprintf(stderr, "%s: %s: %s\n", progname, xquote(file),
++ strerror(ENAMETOOLONG));
++ __errors++;
return 0;
++ }
++ /* string ends with '/', remove it and restart */
++ if (len > 1 && file[len-1] == '/') {
++ strncpy(path, file, len);
++ path[len-1] = '\0'; /* overwrite slash */
++ return walk_tree(path);
++ }
- if (do_print(file, stat))
-+ if (lstat(file, &buf) != 0) {
-+ fprintf(stderr, "%s: %s: %s\n", progname, xquote(file),
-+ strerror(errno));
- __errors++;
--
+- __errors++;
++ if (level > 0 && !opt_recursive)
++ return 0;
+
- if (flag == FTW_DNR && opt_recursive) {
- /* Item is a directory which can't be read. */
- fprintf(stderr, "%s: %s: %s\n",
- progname, file, strerror(saved_errno));
++ if (lstat(file, &buf) != 0) {
++ fprintf(stderr, "%s: %s: %s\n", progname, xquote(file),
++ strerror(errno));
++ __errors++;
return 0;
}
- /* We also get here in non-recursive mode. In that case,
- return something != 0 to abort nftw. */
--
++ if (S_ISLNK(buf.st_mode)) {
++ /* physical means: no links at all */
++ if (opt_walk_physical)
++ return 1;
++
++ /* logical: show information or walk if points to directory
++ * also for symbolic link arguments on level 0 */
++ if (opt_walk_logical || level == 0) {
++ /* copy and append terminating '\0' */
++ strncpy(path2, file, len+1);
++
++ /* get directory name */
++ dir_name = dirname(path2);
++
++ /* get link target */
++ slen = readlink(file, path, FILENAME_MAX-1);
++ if (slen < 0) {
++ fprintf(stderr, "%s: %s: %s\n", progname,
++ xquote(file), strerror(errno));
++ __errors++;
++ return 0;
++ }
++ path[slen] = '\0';
+
- if (!opt_recursive)
-+ if (S_ISLNK(buf.st_mode) && opt_walk_physical)
- return 1;
+- return 1;
++ if (slen == 0 || path[0] == '/') {
++ /* absolute:
++ * copy and append terminating '\0' */
++ strncpy(path3, path, slen+1);
++ } else
++ /* relative */
++ snprintf(path3, FILENAME_MAX, "%s/%s",
++ dir_name, path);
++
++ if (lstat(path3, &buf) != 0) {
++ fprintf(stderr, "%s: %s: %s\n", progname,
++ xquote(path), strerror(errno));
++ __errors++;
++ return 0;
++ }
- return 0;
-}
--
++ if ((S_ISDIR(buf.st_mode) && opt_recursive &&
++ link_count < 1) || S_ISLNK(buf.st_mode)) {
++ /* walk directory or follow symlink on level
++ * 0 */
++ link_count++;
++ res = walk_tree(path3);
++ link_count--;
++ if (res != 1)
++ return 0;
++ } else
++ if (do_print(path3, &buf))
++ __errors++;
+
-char *resolve_symlinks(const char *file)
-{
- static char buffer[4096];
@@ -84,19 +154,6 @@
- } else {
- buffer[len+1] = '\0';
- path = buffer;
-+ if (S_ISLNK(buf.st_mode) && opt_walk_logical && opt_recursive) {
-+ if (stat(file, &buf) != 0) {
-+ fprintf(stderr, "%s: %s: %s\n", progname, xquote(file),
-+ strerror(errno));
-+ __errors++;
-+ return 0;
-+ }
-+ if (S_ISDIR(buf.st_mode) && link_count < 1) {
-+ link_count++;
-+ snprintf(path, FILENAME_MAX, "%s/", file);
-+ if (walk_tree(path) != 1)
-+ return 0;
-+ link_count--;
+ return 1;
+ }
}
@@ -118,8 +175,8 @@
+ if (do_print(file, &buf))
__errors++;
+
++ /* it is a directory, walk */
+ if (S_ISDIR(buf.st_mode)) {
-+ level++;
+ dir = opendir(file);
+ if (!dir) {
+ fprintf(stderr, "%s: %s: %s\n", progname,
@@ -128,23 +185,21 @@
+ return 0;
+ }
+
++ level++;
+ while ((entry = readdir(dir)) != NULL) {
+ if (! strcmp(entry->d_name, ".") ||
+ ! strcmp(entry->d_name, ".."))
+ continue;
+
-+ if (file[strlen(file)-1] == '/')
-+ snprintf(path, FILENAME_MAX, "%s%s", file,
-+ entry->d_name);
-+ else
-+ snprintf(path, FILENAME_MAX, "%s/%s", file,
-+ entry->d_name);
++ snprintf(path, FILENAME_MAX, "%s/%s", file,
++ entry->d_name);
+
-+ if (walk_tree(path) != 1)
-+ return 0;
++ /* ignore result, walk every entry */
++ res = walk_tree(path);
+ }
-+ closedir(dir);
+ level--;
++
++ closedir(dir);
}
- return __errors;
+
@@ -152,3 +207,29 @@
}
int main(int argc, char *argv[])
+@@ -762,15 +830,22 @@
+ if (*line == '\0')
+ continue;
+
+- had_errors += walk_tree(line);
++ /* ignore result of walk_tree, use __errors */
++ __errors = 0;
++ walk_tree(line);
++ had_errors += __errors;
+ }
+ if (!feof(stdin)) {
+ fprintf(stderr, _("%s: Standard input: %s\n"),
+ progname, strerror(errno));
+ had_errors++;
+ }
+- } else
+- had_errors += walk_tree(argv[optind]);
++ } else {
++ /* ignore result of walk_tree, use __errors */
++ __errors = 0;
++ walk_tree(argv[optind]);
++ had_errors += __errors;
++ }
+ optind++;
+ } while (optind < argc);
+
Index: acl.spec
===================================================================
RCS file: /cvs/dist/rpms/acl/devel/acl.spec,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- acl.spec 23 Feb 2007 10:47:32 -0000 1.31
+++ acl.spec 21 Mar 2007 10:36:08 -0000 1.32
@@ -1,7 +1,7 @@
Summary: Access control list utilities
Name: acl
Version: 2.2.39
-Release: 3%{?dist}
+Release: 3.1%{?dist}
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: libattr-devel >= 2.4.1
Source: ftp://oss.sgi.com/projects/xfs/cmd_tars/acl_%{version}-1.tar.gz
@@ -102,6 +102,9 @@
/%{_lib}/libacl.so.*
%changelog
+* Wed Mar 21 2007 Thomas Woerner <twoerner at redhat.com> 2.2.39-3.1
+- new improved walk patch with fixed getfacl exit code (rhbz#232884)
+
* Fri Feb 23 2007 Karsten Hopp <karsten at redhat.com> 2.2.39-3
- fix buildroot
- remove trailing dot from summary
More information about the fedora-cvs-commits
mailing list