git: 4b04f5d7e8a2 - main - install: Fix METALOG ouptut for numeric -o and -g args

From: Ed Maste <emaste_at_FreeBSD.org>
Date: Tue, 21 Jan 2025 12:48:03 UTC
The branch main has been updated by emaste:

URL: https://cgit.FreeBSD.org/src/commit/?id=4b04f5d7e8a2bb0488ad5804ecaf45cef5b1d46f

commit 4b04f5d7e8a2bb0488ad5804ecaf45cef5b1d46f
Author:     Ed Maste <emaste@FreeBSD.org>
AuthorDate: 2025-01-17 19:14:22 +0000
Commit:     Ed Maste <emaste@FreeBSD.org>
CommitDate: 2025-01-21 12:47:48 +0000

    install: Fix METALOG ouptut for numeric -o and -g args
    
    install's -o and -g flags both accept a name or a numeric argument.
    In -U -M (non-root METALOG) mode it always emitted uname= and gname= in
    the METALOG, but these are not appropriate for numeric IDs.
    
    If the -o and/or -u arguments parse as an ID, emit uid= and/or gid=
    respectively.
    
    Note that if an argument is valid as both a name and numeric ID we will
    prefer the name in normal (non -U -M) mode and the ID in -U -M mode.  We
    don't want to require a passwd db in non-root mode, and entirely-numeric
    user or group names are a terrible idea so just accept this discrepancy.
    
    PR:             284119
    Reviewed by:    jlduran
    Sponsored by:   The FreeBSD Foundation
    Differential Revision: https://reviews.freebsd.org/D48504
---
 usr.bin/xinstall/xinstall.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c
index d0fcda340034..02b3eeccf8a7 100644
--- a/usr.bin/xinstall/xinstall.c
+++ b/usr.bin/xinstall/xinstall.c
@@ -1432,10 +1432,22 @@ metadata_log(const char *path, const char *type, struct timespec *ts,
 	p = buf;
 	/* Print details. */
 	fprintf(metafp, ".%s%s type=%s", *p ? "/" : "", p, type);
-	if (owner)
-		fprintf(metafp, " uname=%s", owner);
-	if (group)
-		fprintf(metafp, " gname=%s", group);
+	if (owner) {
+		id_t id;
+
+		if (parseid(owner, &id))
+			fprintf(metafp, " uid=%jd", (intmax_t)id);
+		else
+			fprintf(metafp, " uname=%s", owner);
+	}
+	if (group) {
+		id_t id;
+
+		if (parseid(group, &id))
+			fprintf(metafp, " gid=%jd", (intmax_t)id);
+		else
+			fprintf(metafp, " gname=%s", group);
+	}
 	fprintf(metafp, " mode=%#o", mode);
 	if (slink) {
 		strsnvis(buf, buflen, slink, VIS_CSTYLE, extra);