git: f27c6a3e872c - main - bsdinstall/distfetch: Replace libdialog with libbsddialog
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 15 Mar 2022 23:29:48 UTC
The branch main has been updated by asiciliano: URL: https://cgit.FreeBSD.org/src/commit/?id=f27c6a3e872c0ee658fa12b40f5b24a85c1f66cc commit f27c6a3e872c0ee658fa12b40f5b24a85c1f66cc Author: Alfonso S. Siciliano <asiciliano@FreeBSD.org> AuthorDate: 2022-03-15 23:27:36 +0000 Commit: Alfonso S. Siciliano <asiciliano@FreeBSD.org> CommitDate: 2022-03-15 23:27:36 +0000 bsdinstall/distfetch: Replace libdialog with libbsddialog Replace (LGPL) libdialog with (BSD-2-Clause) libbsddialog, while here diversify error messages to find quickly the exact point of failure. Approved by: bapt (mentor) Differential Revision: https://reviews.freebsd.org/D34464 --- usr.sbin/bsdinstall/distfetch/Makefile | 3 +- usr.sbin/bsdinstall/distfetch/distfetch.c | 117 +++++++++++++++++------------- 2 files changed, 69 insertions(+), 51 deletions(-) diff --git a/usr.sbin/bsdinstall/distfetch/Makefile b/usr.sbin/bsdinstall/distfetch/Makefile index 70ecb381d485..f4ae37edf1a5 100644 --- a/usr.sbin/bsdinstall/distfetch/Makefile +++ b/usr.sbin/bsdinstall/distfetch/Makefile @@ -2,7 +2,8 @@ BINDIR= ${LIBEXECDIR}/bsdinstall PROG= distfetch -LIBADD= fetch dialog m +CFLAGS+= -I${SRCTOP}/contrib/bsddialog/lib +LIBADD= fetch bsddialog MAN= diff --git a/usr.sbin/bsdinstall/distfetch/distfetch.c b/usr.sbin/bsdinstall/distfetch/distfetch.c index 0510965dd4e7..440a708c285f 100644 --- a/usr.sbin/bsdinstall/distfetch/distfetch.c +++ b/usr.sbin/bsdinstall/distfetch/distfetch.c @@ -31,10 +31,12 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> + +#include <bsddialog.h> #include <ctype.h> #include <err.h> -#include <dialog.h> #include <errno.h> +#include <stdio.h> #include <fetch.h> #include <stdio.h> #include <stdlib.h> @@ -52,6 +54,7 @@ main(void) int ndists = 0; int nfetched; char error[PATH_MAX + 512]; + struct bsddialog_conf conf; if (getenv("DISTRIBUTIONS") == NULL) errx(EXIT_FAILURE, "DISTRIBUTIONS variable is not set"); @@ -65,12 +68,16 @@ main(void) urls = calloc(ndists, sizeof(const char *)); if (urls == NULL) { free(diststring); - errx(EXIT_FAILURE, "Out of memory!"); + errx(EXIT_FAILURE, "Error: distfetch URLs out of memory!"); } - init_dialog(stdin, stdout); - dialog_vars.backtitle = __DECONST(char *, "FreeBSD Installer"); - dlg_put_backtitle(); + if (bsddialog_init() == BSDDIALOG_ERROR) { + free(diststring); + errx(EXIT_FAILURE, "Error libbsddialog: %s\n", + bsddialog_geterror()); + } + bsddialog_initconf(&conf); + bsddialog_backtitle(&conf, "FreeBSD Installer"); for (i = 0; i < ndists; i++) { urls[i] = malloc(PATH_MAX); @@ -82,14 +89,15 @@ main(void) snprintf(error, sizeof(error), "Could not change to directory %s: %s\n", getenv("BSDINSTALL_DISTDIR"), strerror(errno)); - dialog_msgbox("Error", error, 0, 0, TRUE); - end_dialog(); + conf.title = "Error"; + bsddialog_msgbox(&conf, error, 0, 0); + bsddialog_end(); return (EXIT_FAILURE); } nfetched = fetch_files(ndists, urls); - end_dialog(); + bsddialog_end(); free(diststring); for (i = 0; i < ndists; i++) @@ -104,7 +112,9 @@ fetch_files(int nfiles, char **urls) { FILE *fetch_out; FILE *file_out; - const char **items; + const char **minilabel; + int *miniperc; + int perc; int i; int last_progress; int nsuccess = 0; /* Number of files successfully downloaded */ @@ -115,26 +125,30 @@ fetch_files(int nfiles, char **urls) off_t total_bytes; float file_perc; float mainperc_file; - char status[8]; struct url_stat ustat; char errormsg[PATH_MAX + 512]; uint8_t block[4096]; + struct bsddialog_conf errconf; + struct bsddialog_conf mgconf; - /* Make the transfer list for dialog */ - items = calloc(sizeof(char *), nfiles * 2); - if (items == NULL) - errx(EXIT_FAILURE, "Out of memory!"); + /* Make the transfer list for mixedgauge */ + minilabel = calloc(sizeof(char *), nfiles); + miniperc = calloc(sizeof(int), nfiles); + if (minilabel == NULL || miniperc == NULL) + errx(EXIT_FAILURE, "Error: distfetch minibars out of memory!"); for (i = 0; i < nfiles; i++) { - items[i*2] = strrchr(urls[i], '/'); - if (items[i*2] != NULL) - items[i*2]++; + minilabel[i] = strrchr(urls[i], '/'); + if (minilabel[i] != NULL) + minilabel[i]++; else - items[i*2] = urls[i]; - items[i*2 + 1] = "Pending"; + minilabel[i] = urls[i]; + miniperc[i] = BSDDIALOG_MG_PENDING; } - dialog_msgbox("", "Connecting to server.\nPlease wait...", 0, 0, FALSE); + bsddialog_initconf(&errconf); + bsddialog_infobox(&errconf, "Connecting to server.\nPlease wait...", + 0, 0); /* Try to stat all the files */ total_bytes = 0; @@ -147,6 +161,12 @@ fetch_files(int nfiles, char **urls) } } + errconf.title = "Fetch Error"; + errconf.clear = true; + bsddialog_initconf(&mgconf); + mgconf.title = "Fetching Distribution"; + mgconf.auto_minwidth = 40; + mainperc_file = 100.0 / nfiles; current_bytes = 0; for (i = 0; i < nfiles; i++) { @@ -154,25 +174,23 @@ fetch_files(int nfiles, char **urls) fetch_out = fetchXGetURL(urls[i], &ustat, ""); if (fetch_out == NULL) { snprintf(errormsg, sizeof(errormsg), - "Error while fetching %s: %s\n", urls[i], + "Error (URL) while fetching %s: %s\n", urls[i], fetchLastErrString); - items[i*2 + 1] = "Failed"; - dialog_msgbox("Fetch Error", errormsg, 0, 0, - TRUE); + miniperc[2] = BSDDIALOG_MG_FAILED; + bsddialog_msgbox(&errconf, errormsg, 0, 0); total_bytes = 0; continue; } - items[i*2 + 1] = "In Progress"; + miniperc[i] = BSDDIALOG_MG_INPROGRESS; fsize = 0; - file_out = fopen(items[i*2], "w+"); + file_out = fopen(minilabel[i], "w+"); if (file_out == NULL) { snprintf(errormsg, sizeof(errormsg), - "Error while fetching %s: %s\n", + "Error (fopen) while fetching %s: %s\n", urls[i], strerror(errno)); - items[i*2 + 1] = "Failed"; - dialog_msgbox("Fetch Error", errormsg, 0, 0, - TRUE); + miniperc[i] = BSDDIALOG_MG_FAILED; + bsddialog_msgbox(&errconf, errormsg, 0, 0); fclose(fetch_out); total_bytes = 0; continue; @@ -188,42 +206,41 @@ fetch_files(int nfiles, char **urls) last_progress = progress; if (total_bytes > 0) { - progress = (current_bytes*100)/total_bytes; + progress = (current_bytes * 100) / total_bytes; } else { file_perc = ustat.size > 0 ? - (fsize*100)/ustat.size : 0; + (fsize * 100) / ustat.size : 0; progress = (i * mainperc_file) + ((file_perc * mainperc_file) / 100); } if (ustat.size > 0) { - snprintf(status, sizeof(status), "-%jd", - (fsize*100)/ustat.size); - items[i*2 + 1] = status; + perc = (fsize * 100) / ustat.size; + miniperc[i] = perc; } - if (progress > last_progress) - dialog_mixedgauge("Fetching Distribution", - "Fetching distribution files...", 0, 0, - progress, nfiles, - __DECONST(char **, items)); + if (progress > last_progress) { + bsddialog_mixedgauge(&mgconf, + "\nFetching distribution files...\n", + 0, 0, progress, nfiles, minilabel, + miniperc); + } } if (ustat.size > 0 && fsize < ustat.size) { if (fetchLastErrCode == 0) snprintf(errormsg, sizeof(errormsg), - "Error while fetching %s: %s\n", + "Error (undone) while fetching %s: %s\n", urls[i], strerror(errno)); else snprintf(errormsg, sizeof(errormsg), - "Error while fetching %s: %s\n", + "Error (libfetch) while fetching %s: %s\n", urls[i], fetchLastErrString); - items[i*2 + 1] = "Failed"; - dialog_msgbox("Fetch Error", errormsg, 0, 0, - TRUE); + miniperc[i] = BSDDIALOG_MG_FAILED; + bsddialog_msgbox(&errconf, errormsg, 0, 0); total_bytes = 0; } else { - items[i*2 + 1] = "Done"; + miniperc[i] = BSDDIALOG_MG_DONE; nsuccess++; } @@ -231,10 +248,10 @@ fetch_files(int nfiles, char **urls) fclose(file_out); } - dialog_mixedgauge("Fetching Distribution", - "Fetching distribution completed", 0, 0, progress, nfiles, - __DECONST(char **, items)); + bsddialog_mixedgauge(&mgconf, "\nFetching distribution completed\n", + 0, 0, progress, nfiles, minilabel, miniperc); - free(items); + free(minilabel); + free(miniperc); return (nsuccess); }