git: 2ecfc040a09f - main - pkg: refactor out a pkg_read_fd()

From: Kyle Evans <kevans_at_FreeBSD.org>
Date: Wed, 01 Jan 2025 21:11:42 UTC
The branch main has been updated by kevans:

URL: https://cgit.FreeBSD.org/src/commit/?id=2ecfc040a09f8c42f67bbfdcc4bd02ef84dac8b7

commit 2ecfc040a09f8c42f67bbfdcc4bd02ef84dac8b7
Author:     Kyle Evans <kevans@FreeBSD.org>
AuthorDate: 2025-01-01 21:10:28 +0000
Commit:     Kyle Evans <kevans@FreeBSD.org>
CommitDate: 2025-01-01 21:11:23 +0000

    pkg: refactor out a pkg_read_fd()
    
    We already have to do this for reading the pubkey, just pull it out for
    other uses.  The ECC signer will use this to verify the bootstrap if
    the PUBKEY mechanism is used.
    
    Reviewed by:    bapt, emaste
    Differential Revision:  https://reviews.freebsd.org/D48107
---
 usr.sbin/pkg/pkg.c | 40 +++++++++++++++++++++++++++-------------
 usr.sbin/pkg/pkg.h |  2 ++
 2 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/usr.sbin/pkg/pkg.c b/usr.sbin/pkg/pkg.c
index 4d476f7653f7..6d0a75d2786a 100644
--- a/usr.sbin/pkg/pkg.c
+++ b/usr.sbin/pkg/pkg.c
@@ -451,32 +451,46 @@ load_fingerprints(const char *path, int *count)
 	return (fingerprints);
 }
 
+char *
+pkg_read_fd(int fd, size_t *osz)
+{
+	char *obuf;
+	char buf[4096];
+	FILE *fp;
+	ssize_t r;
+
+	obuf = NULL;
+	*osz = 0;
+	fp = open_memstream(&obuf, osz);
+	if (fp == NULL)
+		err(EXIT_FAILURE, "open_memstream()");
+
+	while ((r = read(fd, buf, sizeof(buf))) >0) {
+		fwrite(buf, 1, r, fp);
+	}
+
+	if (ferror(fp))
+		errx(EXIT_FAILURE, "reading file");
+
+	fclose(fp);
+
+	return (obuf);
+}
+
 static struct pubkey *
 read_pubkey(int fd)
 {
 	struct pubkey *pk;
 	char *sigb;
 	size_t sigsz;
-	FILE *sig;
-	char buf[4096];
-	int r;
 
 	if (lseek(fd, 0, 0) == -1) {
 		warn("lseek");
 		return (NULL);
 	}
 
-	sigsz = 0;
-	sigb = NULL;
-	sig = open_memstream(&sigb, &sigsz);
-	if (sig == NULL)
-		err(EXIT_FAILURE, "open_memstream()");
-
-	while ((r = read(fd, buf, sizeof(buf))) >0) {
-		fwrite(buf, 1, r, sig);
-	}
+	sigb = pkg_read_fd(fd, &sigsz);
 
-	fclose(sig);
 	pk = calloc(1, sizeof(struct pubkey));
 	pk->siglen = sigsz;
 	pk->sig = calloc(1, pk->siglen);
diff --git a/usr.sbin/pkg/pkg.h b/usr.sbin/pkg/pkg.h
index d42f5a95d327..2d0dab96a20f 100644
--- a/usr.sbin/pkg/pkg.h
+++ b/usr.sbin/pkg/pkg.h
@@ -63,4 +63,6 @@ struct pubkey {
 	int siglen;
 };
 
+char *pkg_read_fd(int fd, size_t *osz);
+
 #endif /* _PKG_H */