mailing list of musl libc
 help / color / mirror / Atom feed
* [musl] [PATCH v1] nftw: support FTW_ACTIONRETVAL extension
@ 2020-09-25  9:18 Tony Ambardar
  2020-09-25 19:06 ` Rich Felker
  0 siblings, 1 reply; 2+ messages in thread
From: Tony Ambardar @ 2020-09-25  9:18 UTC (permalink / raw)
  To: musl; +Cc: Tony Ambardar

Add the FTW_ACTIONRETVAL mode for walking file trees, a commonly used glibc
extension. This updates the existing musl nftw/ftw code to support the new
mode and include options e.g. to prune trees and skip tree siblings.

This patch is based on one originally submitted to musl's mailing list [1],
which was reviewed with interest but received no follow-up. It has since
been cleaned up, and tested on OpenWRT for building Linux's 'bpftool'
utility (the primary tool for BPF introspection and manipulation).

Including this extension should also further reduce any need for fts(3)
support.

[1] https://www.openwall.com/lists/musl/2018/12/16/1

Signed-off-by: Tony Ambardar <Tony.Ambardar@gmail.com>
---
 include/ftw.h   |  8 ++++++++
 src/misc/nftw.c | 35 ++++++++++++++++++++++++++++++-----
 2 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/include/ftw.h b/include/ftw.h
index b15c062a..ce85deac 100644
--- a/include/ftw.h
+++ b/include/ftw.h
@@ -21,6 +21,14 @@ extern "C" {
 #define FTW_CHDIR 4
 #define FTW_DEPTH 8
 
+#ifdef _GNU_SOURCE
+#define FTW_ACTIONRETVAL 16
+#define FTW_CONTINUE 0
+#define FTW_STOP 1
+#define FTW_SKIP_SUBTREE 2
+#define FTW_SKIP_SIBLINGS 3
+#endif
+
 struct FTW {
 	int base;
 	int level;
diff --git a/src/misc/nftw.c b/src/misc/nftw.c
index 8dcff7fe..0bb7b601 100644
--- a/src/misc/nftw.c
+++ b/src/misc/nftw.c
@@ -1,3 +1,4 @@
+#define _GNU_SOURCE
 #include <ftw.h>
 #include <dirent.h>
 #include <fcntl.h>
@@ -72,8 +73,20 @@ static int do_nftw(char *path, int (*fn)(const char *, const struct stat *, int,
 		if (!fd_limit) close(dfd);
 	}
 
-	if (!(flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev)))
-		return r;
+	if (!(flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev))) {
+		if (flags & FTW_ACTIONRETVAL)
+			switch (r) {
+			case FTW_SKIP_SUBTREE:
+				h = NULL;
+			case FTW_CONTINUE:
+				break;
+			case FTW_SKIP_SIBLINGS:
+			case FTW_STOP:
+				return r;
+			}
+		else
+			return r;
+	}
 
 	for (; h; h = h->chain)
 		if (h->dev == st.st_dev && h->ino == st.st_ino)
@@ -101,7 +114,10 @@ static int do_nftw(char *path, int (*fn)(const char *, const struct stat *, int,
 				strcpy(path+j+1, de->d_name);
 				if ((r=do_nftw(path, fn, fd_limit-1, flags, &new))) {
 					closedir(d);
-					return r;
+					if ((flags & FTW_ACTIONRETVAL) && r == FTW_SKIP_SIBLINGS)
+						break;
+					else
+						return r;
 				}
 			}
 			closedir(d);
@@ -112,8 +128,16 @@ static int do_nftw(char *path, int (*fn)(const char *, const struct stat *, int,
 	}
 
 	path[l] = 0;
-	if ((flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev)))
-		return r;
+	if ((flags & FTW_DEPTH) && (r=fn(path, &st, type, &lev))) {
+		if (flags & FTW_ACTIONRETVAL)
+			switch (r) {
+				case FTW_SKIP_SIBLINGS:
+				case FTW_STOP:
+					return r;
+			}
+		else
+			return r;
+	}
 
 	return 0;
 }
@@ -139,4 +163,5 @@ int nftw(const char *path, int (*fn)(const char *, const struct stat *, int, str
 	return r;
 }
 
+#undef nftw64
 weak_alias(nftw, nftw64);
-- 
2.25.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [musl] [PATCH v1] nftw: support FTW_ACTIONRETVAL extension
  2020-09-25  9:18 [musl] [PATCH v1] nftw: support FTW_ACTIONRETVAL extension Tony Ambardar
@ 2020-09-25 19:06 ` Rich Felker
  0 siblings, 0 replies; 2+ messages in thread
From: Rich Felker @ 2020-09-25 19:06 UTC (permalink / raw)
  To: musl

On Fri, Sep 25, 2020 at 02:18:28AM -0700, Tony Ambardar wrote:
> Add the FTW_ACTIONRETVAL mode for walking file trees, a commonly used glibc
> extension. This updates the existing musl nftw/ftw code to support the new
> mode and include options e.g. to prune trees and skip tree siblings.
> 
> This patch is based on one originally submitted to musl's mailing list [1],
> which was reviewed with interest but received no follow-up. It has since
> been cleaned up, and tested on OpenWRT for building Linux's 'bpftool'
> utility (the primary tool for BPF introspection and manipulation).
> 
> Including this extension should also further reduce any need for fts(3)
> support.
> 
> [1] https://www.openwall.com/lists/musl/2018/12/16/1

This isn't a decision on your patch in itself, but the reason that was
not followed up on was that it became apparent that the point of the
whole series was just trying to add everything to musl that systemd
happened to be using.

In general, there's policy (that should be expanded upon and moved to
somewhere more visible!) on criteria for including or excluding
nonstandard functionality from musl. The best write-up of it I could
find is in:

https://www.openwall.com/lists/musl/2014/07/19/8

I'm pretty sure there's a more detailed version somewhere but I didn't
immediately find it.

Since we haven't encountered any other programs (see 2A) that needed
this extension, is there a reason you think it's particularly
important to have, vs just fixing bpftool not to need it?

Rich

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2020-09-25 19:07 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-25  9:18 [musl] [PATCH v1] nftw: support FTW_ACTIONRETVAL extension Tony Ambardar
2020-09-25 19:06 ` Rich Felker

mailing list of musl libc

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://inbox.vuxu.org/musl

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V1 musl musl/ http://inbox.vuxu.org/musl \
		musl@inbox.vuxu.org
	public-inbox-index musl

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://inbox.vuxu.org/vuxu.archive.musl


code repositories for the project(s) associated with this inbox:

	https://git.vuxu.org/mirror/musl/

AGPL code for this site: git clone https://public-inbox.org/public-inbox.git