tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: mtree and file names containing an asterisk



On Thu, 14 Aug 2025, Edgar Fuß wrote:

It looks like mtree has a problem with file names containing an asterisk

ef@trave:/tmp/x$ echo foobar >foobar
ef@trave:/tmp/x$ echo 'foo*bar' >'foo*bar'
ef@trave:/tmp/x$ ls -l
total 16
-rw-r--r--  1 ef  wheel  8 Aug 14 17:27 foo*bar
-rw-r--r--  1 ef  wheel  7 Aug 14 17:26 foobar
ef@trave:/tmp/x$ /usr/sbin/mtree -c -p /tmp/x
#	   user: ef
#	machine: trave.math.uni-bonn.de
#	   tree: /tmp/x
#	   date: Thu Aug 14 17:27:17 2025

# .
/set type=file uid=0 gid=0 mode=0644 nlink=1 flags=none
.               type=dir uid=10513 mode=0755 nlink=2 \
               time=1755185194.512283258
   foo\052bar  uid=10513 size=8 time=1755185221.401737966
   foobar      uid=10513 size=7 time=1755185211.763689351
ef@trave:/tmp/x$ /usr/sbin/mtree -c -p /tmp/x >/tmp/x.mtree
ef@trave:/tmp/x$ /usr/sbin/mtree -p /tmp/x -f /tmp/x.mtree
foobar: size (8, 7)
	modification time (Thu Aug 14 17:27:01 2025, Thu Aug 14 17:26:51 2025)
./foobar missing

What the hell?


This is explained in the manual. If the filename in the spec. contains a
wildcard, it is treated as such:

```
     3.   A file specification, consisting of a path name, followed by
          whitespace, followed by zero or more whitespace separated
          keyword/value pairs.

          The path name may be preceded by whitespace characters.  The path
          name may contain any of the standard path name matching characters
          (`[', `]', `?' or `*'), in which case files in the hierarchy will be
          associated with the first pattern that they match.
```

But, maybe mtree(8) should not do wildcard expansion on the filenames read from
a directory entry. It should only do so if comes from a spec.:

```
diff -urN mtree.orig/spec.c mtree/spec.c
--- mtree.orig/spec.c	2024-12-06 00:53:12.760341743 +0000
+++ mtree/spec.c	2025-08-14 22:34:47.288307464 +0000
@@ -175,6 +175,10 @@
 			tname = ntname;
 			tnamelen = plen;
 		}
+#define	MAGIC	"?*["
+		unsigned int flags = 0;
+		if (strpbrk(p, MAGIC))
+			flags = F_MAGIC;
 		if (strunvis(tname, p) == -1)
 			mtree_err("strunvis failed on `%s'", p);
 		p = tname;
@@ -209,9 +213,7 @@
 		*centry = ginfo;
 		centry->lineno = mtree_lineno;
 		strcpy(centry->name, p);
-#define	MAGIC	"?*["
-		if (strpbrk(p, MAGIC))
-			centry->flags |= F_MAGIC;
+		centry->flags |= flags;
 		set(next, centry);

 		if (root == NULL) {
```

-RVP


Home | Main Index | Thread Index | Old Index