Module Name:    src
Committed By:   christos
Date:           Mon Jan 20 20:03:14 UTC 2025

Modified Files:
        src/usr.bin/xinstall: xinstall.c

Log Message:
>From FreeBSD via Ed Maste:

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


To generate a diff of this commit:
cvs rdiff -u -r1.128 -r1.129 src/usr.bin/xinstall/xinstall.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/xinstall/xinstall.c
diff -u src/usr.bin/xinstall/xinstall.c:1.128 src/usr.bin/xinstall/xinstall.c:1.129
--- src/usr.bin/xinstall/xinstall.c:1.128	Fri May 10 05:14:52 2024
+++ src/usr.bin/xinstall/xinstall.c	Mon Jan 20 15:03:14 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: xinstall.c,v 1.128 2024/05/10 09:14:52 wiz Exp $	*/
+/*	$NetBSD: xinstall.c,v 1.129 2025/01/20 20:03:14 christos Exp $	*/
 
 /*
  * Copyright (c) 1987, 1993
@@ -78,7 +78,7 @@ __COPYRIGHT("@(#) Copyright (c) 1987, 19
 #if 0
 static char sccsid[] = "@(#)xinstall.c	8.1 (Berkeley) 7/21/93";
 #else
-__RCSID("$NetBSD: xinstall.c,v 1.128 2024/05/10 09:14:52 wiz Exp $");
+__RCSID("$NetBSD: xinstall.c,v 1.129 2025/01/20 20:03:14 christos Exp $");
 #endif
 #endif /* not lint */
 
@@ -123,8 +123,8 @@ static int	numberedbackup;
 static int	verbose;
 static int	mode = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
 static char	pathbuf[MAXPATHLEN];
-static uid_t	uid = -1;
-static gid_t	gid = -1;
+static uid_t	uid = (uid_t)-1;
+static gid_t	gid = (gid_t)-1;
 static char	*group, *owner, *fflags, *tags;
 static FILE	*metafp;
 static char	*metafile;
@@ -134,7 +134,7 @@ static char	*afterinstallcmd;
 static const char *suffix = BACKUP_SUFFIX;
 static char	*destdir;
 
-enum {
+static enum {
 	DIGEST_NONE = 0,
 	DIGEST_MD5,
 	DIGEST_RMD160,
@@ -167,7 +167,7 @@ static void	install_dir(char *, u_int);
 static void	makelink(char *, char *);
 static void	metadata_log(const char *, const char *, struct timeval *,
 	    const char *, const char *, off_t);
-static int	parseid(char *, id_t *);
+static int	parseid(const char *, id_t *);
 static void 	run(const char *, const char *, const char *, int);
 static void	strip(const char *);
 __dead static void	usage(void);
@@ -445,7 +445,7 @@ main(int argc, char *argv[])
  *	parse uid or gid from arg into id, returning non-zero if successful
  */
 static int
-parseid(char *name, id_t *id)
+parseid(const char *name, id_t *id)
 {
 	char	*ep;
 
@@ -892,6 +892,7 @@ copy(int from_fd, char *from_name, int t
 	case DIGEST_NONE:
 		if (to_fd < 0)
 			return NULL; /* no need to do anything */
+		/*FALLTHROUGH*/
 	default:
 		break;
 	}
@@ -1203,6 +1204,25 @@ install_dir(char *path, u_int flags)
 }
 
 /*
+ * printid --
+ *	Print a user or group id or name into the metalog
+ */
+static void
+printid(char ug, const char *str)
+{
+	id_t id;
+
+	if (!str)
+		return;
+
+	fputc(ug, metafp);
+	if (parseid(str, &id))
+		fprintf(metafp, "id=%jd", (intmax_t)id);
+	else
+		fprintf(metafp, "name=%s", str);
+}
+
+/*
  * metadata_log --
  *	if metafp is not NULL, output mtree(8) full path name and settings to
  *	metafp, to allow permissions to be set correctly by other tools,
@@ -1249,10 +1269,8 @@ metadata_log(const char *path, const cha
 	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);
+	printid('u', owner);
+	printid('g', group);
 	fprintf(metafp, " mode=%#o", mode);
 	if (slink) {
 		strsvis(buf, slink, VIS_CSTYLE, extra);	/* encode link */

Reply via email to