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