git: 18f20d5d967a - main - bsddialog: convert bsdinstall/distextract

From: Baptiste Daroussin <bapt_at_FreeBSD.org>
Date: Sat, 01 Jan 2022 20:52:53 UTC
The branch main has been updated by bapt:

URL: https://cgit.FreeBSD.org/src/commit/?id=18f20d5d967ae790f121963e1fcee68d729a529e

commit 18f20d5d967ae790f121963e1fcee68d729a529e
Author:     Alfonso Siciliano <alfsiciliano@gmail.com>
AuthorDate: 2022-01-01 20:50:44 +0000
Commit:     Baptiste Daroussin <bapt@FreeBSD.org>
CommitDate: 2022-01-01 20:51:23 +0000

    bsddialog: convert bsdinstall/distextract
    
    Differential Revision:  https://reviews.freebsd.org/D33581
---
 usr.sbin/bsdinstall/distextract/Makefile      |   3 +-
 usr.sbin/bsdinstall/distextract/distextract.c | 180 +++++++++++++-------------
 2 files changed, 92 insertions(+), 91 deletions(-)

diff --git a/usr.sbin/bsdinstall/distextract/Makefile b/usr.sbin/bsdinstall/distextract/Makefile
index 2b7180e28ea0..5e9f2b9e1473 100644
--- a/usr.sbin/bsdinstall/distextract/Makefile
+++ b/usr.sbin/bsdinstall/distextract/Makefile
@@ -2,7 +2,8 @@
 
 BINDIR= ${LIBEXECDIR}/bsdinstall
 PROG=	distextract
-LIBADD=	archive dpv dialog m
+CFLAGS+= -I${SRCTOP}/contrib/bsddialog/lib
+LIBADD=	archive bsddialog m
 
 MAN=
 
diff --git a/usr.sbin/bsdinstall/distextract/distextract.c b/usr.sbin/bsdinstall/distextract/distextract.c
index 8ad6c7b2c64b..df10c299ab7f 100644
--- a/usr.sbin/bsdinstall/distextract/distextract.c
+++ b/usr.sbin/bsdinstall/distextract/distextract.c
@@ -33,11 +33,12 @@ __FBSDID("$FreeBSD$");
 #include <sys/param.h>
 #include <archive.h>
 #include <ctype.h>
-#include <dialog.h>
-#include <dpv.h>
+#include <bsddialog.h>
+#include <bsddialog_progressview.h>
 #include <err.h>
 #include <errno.h>
 #include <limits.h>
+#include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -46,30 +47,27 @@ __FBSDID("$FreeBSD$");
 /* Data to process */
 static char *distdir = NULL;
 static struct archive *archive = NULL;
-static struct dpv_file_node *dists = NULL;
 
 /* Function prototypes */
 static void	sig_int(int sig);
 static int	count_files(const char *file);
-static int	extract_files(struct dpv_file_node *file, int out);
+static int	extract_files(struct bsddialog_fileminibar *file);
 
-#define _errx(...) (end_dialog(), errx(__VA_ARGS__))
+#define _errx(...) (bsddialog_end(), errx(__VA_ARGS__))
 
 int
 main(void)
 {
 	char *chrootdir;
 	char *distributions;
+	unsigned int i;
 	int retval;
-	size_t config_size = sizeof(struct dpv_config);
-	size_t file_node_size = sizeof(struct dpv_file_node);
+	size_t minibar_size = sizeof(struct bsddialog_fileminibar);
 	size_t span;
-	struct dpv_config *config;
-	struct dpv_file_node *dist = dists;
-	static char backtitle[] = "FreeBSD Installer";
-	static char title[] = "Archive Extraction";
-	static char aprompt[] = "\n  Overall Progress:";
-	static char pprompt[] = "Extracting distribution files...\n";
+	unsigned int nminibars;
+	struct bsddialog_fileminibar *dists;
+	struct bsddialog_progviewconf pvconf;
+	struct bsddialog_conf conf;
 	struct sigaction act;
 	char error[PATH_MAX + 512];
 
@@ -78,17 +76,17 @@ main(void)
 	if ((distdir = getenv("BSDINSTALL_DISTDIR")) == NULL)
 		distdir = __DECONST(char *, "");
 
-	/* Initialize dialog(3) */
-	init_dialog(stdin, stdout);
-	dialog_vars.backtitle = backtitle;
-	dlg_put_backtitle();
-
-	dialog_msgbox("",
-	    "Checking distribution archives.\nPlease wait...", 4, 35, FALSE);
-
-	/*
-	 * Parse $DISTRIBUTIONS into dpv(3) linked-list
-	 */
+	if (bsddialog_init() == BSDDIALOG_ERROR)
+		errx(EXIT_FAILURE, "Cannot init libbsdialog");
+	bsddialog_initconf(&conf);
+	bsddialog_backtitle(&conf, __DECONST(char *, "FreeBSD Installer"));
+	bsddialog_infobox(&conf,
+	    __DECONST(char *, "Checking distribution archives.\n"
+	    "Please wait..."), 4, 35);
+
+	/* Parse $DISTRIBUTIONS */
+	nminibars = 0;
+	dists = NULL;
 	while (*distributions != '\0') {
 		span = strcspn(distributions, "\t\n\v\f\r ");
 		if (span < 1) { /* currently on whitespace */
@@ -97,36 +95,36 @@ main(void)
 		}
 
 		/* Allocate a new struct for the distribution */
-		if (dist == NULL) {
-			if ((dist = calloc(1, file_node_size)) == NULL)
-				_errx(EXIT_FAILURE, "Out of memory!");
-			dists = dist;
-		} else {
-			dist->next = calloc(1, file_node_size);
-			if (dist->next == NULL)
-				_errx(EXIT_FAILURE, "Out of memory!");
-			dist = dist->next;
-		}
+		dists = realloc(dists, (nminibars + 1) * minibar_size);
+		if (dists == NULL)
+			_errx(EXIT_FAILURE, "Out of memory!");
 
-		/* Set path */
-		if ((dist->path = malloc(span + 1)) == NULL)
+		/* Set file path */
+		if ((dists[nminibars].path = malloc(span + 1)) == NULL)
 			_errx(EXIT_FAILURE, "Out of memory!");
-		snprintf(dist->path, span + 1, "%s", distributions);
-		dist->path[span] = '\0';
+		snprintf(dists[nminibars].path, span + 1, "%s", distributions);
+		dists[nminibars].path[span] = '\0';
 
-		/* Set display name */
-		dist->name = strrchr(dist->path, '/');
-		if (dist->name == NULL)
-			dist->name = dist->path;
+		/* Set mini bar label */
+		dists[nminibars].label = strrchr(dists[nminibars].path, '/');
+		if (dists[nminibars].label == NULL)
+			dists[nminibars].label = dists[nminibars].path;
 
 		/* Set initial length in files (-1 == error) */
-		dist->length = count_files(dist->path);
-		if (dist->length < 0) {
-			end_dialog();
+		dists[nminibars].size = count_files(dists[nminibars].path);
+		if (dists[nminibars].size < 0) {
+			bsddialog_end();
 			return (EXIT_FAILURE);
 		}
 
+		/* Set initial status to pending */
+		/* dists[nminibars].status = 10; */
+
+		/* Set initial read */
+		dists[nminibars].read = 0;
+
 		distributions += span;
+		nminibars += 1;
 	}
 
 	/* Optionally chdir(2) into $BSDINSTALL_CHROOT */
@@ -135,8 +133,9 @@ main(void)
 		snprintf(error, sizeof(error),
 		    "Could not change to directory %s: %s\n",
 		    chrootdir, strerror(errno));
-		dialog_msgbox("Error", error, 0, 0, TRUE);
-		end_dialog();
+		conf.title = __DECONST(char *, "Error");
+		bsddialog_msgbox(&conf, error, 0, 0);
+		bsddialog_end();
 		return (EXIT_FAILURE);
 	}
 
@@ -144,32 +143,23 @@ main(void)
 	act.sa_handler = sig_int;
 	sigaction(SIGINT, &act, 0);
 
-	/*
-	 * Hand off to dpv(3)
-	 */
-	if ((config = calloc(1, config_size)) == NULL)
-		_errx(EXIT_FAILURE, "Out of memory!");
-	config->backtitle	= backtitle;
-	config->title		= title;
-	config->pprompt		= pprompt;
-	config->aprompt		= aprompt;
-	config->options		|= DPV_WIDE_MODE;
-	config->label_size	= -1;
-	config->action		= extract_files;
-	config->status_solo	=
-	    "%10lli files read @ %'9.1f files/sec.";
-	config->status_many	= 
-	    "%10lli files read @ %'9.1f files/sec. [%i/%i busy/wait]";
-	end_dialog();
-	retval = dpv(config, dists);
-
-	dpv_free();
-	while ((dist = dists) != NULL) {
-		dists = dist->next;
-		if (dist->path != NULL)
-			free(dist->path);
-		free(dist);
+	conf.title = __DECONST(char *, "Archive Extraction");
+	pvconf.callback	= extract_files;
+	pvconf.refresh = 1;
+	pvconf.fmtbottomstr = __DECONST(char *, "%10lli files read @ %'9.1f files/sec.");
+	bsddialog_total_progview = 0;
+	bsddialog_interruptprogview = bsddialog_abortprogview = false;
+	retval = bsddialog_progressview(&conf,
+	    __DECONST(char *, "Extracting distribution files..."), 0, 0, &pvconf, nminibars, dists);
+
+	bsddialog_end();
+
+	for (i=0; i<nminibars; i++) {
+		if (dists[i].path != NULL)
+			free(dists[i].path);
 	}
+	if (dists != NULL)
+		free(dists);
 
 	return (retval);
 }
@@ -177,7 +167,7 @@ main(void)
 static void
 sig_int(int sig __unused)
 {
-	dpv_interrupt = TRUE;
+	bsddialog_interruptprogview = true;
 }
 
 /*
@@ -196,6 +186,7 @@ count_files(const char *file)
 	char line[512];
 	char path[PATH_MAX];
 	char errormsg[PATH_MAX + 512];
+	struct bsddialog_conf conf;
 
 	if (manifest == NULL) {
 		snprintf(path, sizeof(path), "%s/MANIFEST", distdir);
@@ -229,10 +220,12 @@ count_files(const char *file)
 	 * Either no manifest, or manifest didn't mention this archive.
 	 * Use archive(3) to read the archive, counting files within.
 	 */
+	bsddialog_initconf(&conf);
 	if ((archive = archive_read_new()) == NULL) {
 		snprintf(errormsg, sizeof(errormsg),
 		    "Error: %s\n", archive_error_string(NULL));
-		dialog_msgbox("Extract Error", errormsg, 0, 0, TRUE);
+		conf.title = __DECONST(char *, "Extract Error");
+		bsddialog_msgbox(&conf, errormsg, 0, 0);
 		return (-1);
 	}
 	archive_read_support_format_all(archive);
@@ -243,7 +236,8 @@ count_files(const char *file)
 		snprintf(errormsg, sizeof(errormsg),
 		    "Error while extracting %s: %s\n", file,
 		    archive_error_string(archive));
-		dialog_msgbox("Extract Error", errormsg, 0, 0, TRUE);
+		conf.title = __DECONST(char *, "Extract Error");
+		bsddialog_msgbox(&conf, errormsg, 0, 0);
 		archive = NULL;
 		return (-1);
 	}
@@ -258,20 +252,24 @@ count_files(const char *file)
 }
 
 static int
-extract_files(struct dpv_file_node *file, int out __unused)
+extract_files(struct bsddialog_fileminibar *file)
 {
 	int retval;
 	struct archive_entry *entry;
 	char path[PATH_MAX];
 	char errormsg[PATH_MAX + 512];
+	struct bsddialog_conf conf;
+
+	bsddialog_initconf(&conf);
 
 	/* Open the archive if necessary */
 	if (archive == NULL) {
 		if ((archive = archive_read_new()) == NULL) {
 			snprintf(errormsg, sizeof(errormsg),
 			    "Error: %s\n", archive_error_string(NULL));
-			dialog_msgbox("Extract Error", errormsg, 0, 0, TRUE);
-			dpv_abort = 1;
+			conf.title = __DECONST(char *, "Extract Error");
+			bsddialog_msgbox(&conf, errormsg, 0, 0);
+			bsddialog_abortprogview = true;
 			return (-1);
 		}
 		archive_read_support_format_all(archive);
@@ -280,11 +278,12 @@ extract_files(struct dpv_file_node *file, int out __unused)
 		retval = archive_read_open_filename(archive, path, 4096);
 		if (retval != 0) {
 			snprintf(errormsg, sizeof(errormsg),
-			    "Error opening %s: %s\n", file->name,
+			    "Error opening %s: %s\n", file->label,
 			    archive_error_string(archive));
-			dialog_msgbox("Extract Error", errormsg, 0, 0, TRUE);
-			file->status = DPV_STATUS_FAILED;
-			dpv_abort = 1;
+			conf.title = __DECONST(char *, "Extract Error");
+			bsddialog_msgbox(&conf, errormsg, 0, 0);
+			file->status = 1; /* Failed */
+			bsddialog_abortprogview = true;
 			return (-1);
 		}
 	}
@@ -303,7 +302,7 @@ extract_files(struct dpv_file_node *file, int out __unused)
 	if (retval == ARCHIVE_EOF) {
 		archive_read_free(archive);
 		archive = NULL;
-		file->status = DPV_STATUS_DONE;
+		file->status = 5; /*Done*/;
 		return (100);
 	} else if (retval != ARCHIVE_OK &&
 	    !(retval == ARCHIVE_WARN &&
@@ -315,20 +314,21 @@ extract_files(struct dpv_file_node *file, int out __unused)
 		 * option.
 		 */
 		snprintf(errormsg, sizeof(errormsg),
-		    "Error while extracting %s: %s\n", file->name,
+		    "Error while extracting %s: %s\n", file->label,
 		    archive_error_string(archive));
-		dialog_msgbox("Extract Error", errormsg, 0, 0, TRUE);
-		file->status = DPV_STATUS_FAILED;
-		dpv_abort = 1;
+		conf.title = __DECONST(char *, "Extract Error");
+		bsddialog_msgbox(&conf, errormsg, 0, 0);
+		file->status = 1; /* Failed */
+		bsddialog_abortprogview = true;
 		return (-1);
 	}
 
-	dpv_overall_read++;
+	bsddialog_total_progview++;
 	file->read++;
 
 	/* Calculate [overall] percentage of completion (if possible) */
-	if (file->length >= 0)
-		return (file->read * 100 / file->length);
+	if (file->size >= 0)
+		return (file->read * 100 / file->size);
 	else
 		return (-1);
 }