Pull up the following revisions(s) (requested by martin in ticket #1121):

usr.sbin/sysinst/menus.mi:	revision 1.22-1.23
	usr.sbin/sysinst/msg.mi.de:	revision 1.25-1.26
	usr.sbin/sysinst/msg.mi.en:	revision 1.33-1.34
	usr.sbin/sysinst/msg.mi.pl:	revision 1.33-1.34
	usr.sbin/sysinst/msg.mi.es:	revision 1.27-1.28
	usr.sbin/sysinst/msg.mi.fr:	revision 1.32-1.33
	usr.sbin/sysinst/util.c:	revision 1.49-1.52

- When looking for available CD media, skip those that are already mounted.
- When no medium with sets is found, show a new error message and return
  to the source selection menu.
- Rearrange all source option menus to have the proper set suffix available
  (either .tgz or .tar.xz).
- Relax an assertion, the first getvfsstat() call may overestimate the file
  systems visible to us. Fixes PR 55752
- When we did not magically find any CD medium with sets, offer a manual
  override (so ISO images on USB sticks or Xen's xbd(4) work).
This commit is contained in:
sborrill 2020-11-05 08:10:21 +00:00
parent 80acdfdb10
commit 451dcb6db4
7 changed files with 205 additions and 48 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: menus.mi,v 1.19.2.1 2020/01/28 10:17:58 msaitoh Exp $ */
/* $NetBSD: menus.mi,v 1.19.2.2 2020/11/05 08:10:21 sborrill Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
@ -362,8 +362,10 @@ menu distset, title MSG_Select_your_distribution, exit,
menu ftpsource, y=-4, x=0, w=70, no box, no clear,
exitstring MSG_Get_Distribution;
display action { msg_fmt_display(MSG_ftpsource, "%s",
url_proto((uintptr_t)((arg_rv*)arg)->arg)); };
display action {
msg_display_subst(MSG_ftpsource, 2, "." SETS_TAR_SUFF,
url_proto((uintptr_t)((arg_rv*)arg)->arg));
};
option {src_legend(menu, MSG_Host, ftp.xfer_host[(uintptr_t)((arg_rv*)arg)->arg]);},
action { src_prompt(MSG_Host, ftp.xfer_host[(uintptr_t)((arg_rv*)arg)->arg], sizeof ftp.xfer_host[(uintptr_t)((arg_rv*)arg)->arg]); };
option {src_legend(menu, MSG_Base_dir, ftp.dir);},
@ -412,7 +414,8 @@ menu ftpsource, y=-4, x=0, w=70, no box, no clear,
menu nfssource, y=-4, x=0, w=70, no box, no clear,
exitstring MSG_Get_Distribution;
display action { msg_display(MSG_nfssource); };
display action { const char suff[] = "." SETS_TAR_SUFF;
msg_display_subst(MSG_nfssource, 1, &suff); };
option {src_legend(menu, MSG_Host, nfs_host);},
action { src_prompt(MSG_Host, nfs_host, sizeof nfs_host); };
option {src_legend(menu, MSG_Base_dir, nfs_dir);},
@ -459,17 +462,20 @@ menu floppysource, y=-4, x=0, w=70, no box, no clear, exitstring MSG_Continue;
option MSG_exit_menu_generic, exit, action { *((int*)arg) = SET_RETRY; };
menu cdromsource, y=-4, x=0, w=70, no box, no clear, exitstring MSG_Continue;
display action { msg_display(MSG_cdromsource); };
display action { const char suff[] = "." SETS_TAR_SUFF;
msg_display_add_subst(MSG_cdromsource, 1, &suff); };
option {src_legend(menu, MSG_Device, cdrom_dev);},
action { src_prompt(MSG_dev, cdrom_dev, sizeof cdrom_dev); };
option {src_legend(menu, MSG_Set_dir_bin, set_dir_bin);},
action { src_prompt(MSG_Set_dir_bin, set_dir_bin, sizeof set_dir_bin); };
option {src_legend(menu, MSG_Set_dir_src, set_dir_src);},
action { src_prompt(MSG_Set_dir_src, set_dir_src, sizeof set_dir_src); };
option MSG_exit_menu_generic, exit, action { *((int*)arg) = SET_RETRY; };
option MSG_abort_install, exit, action { *((int*)arg) = SET_ABANDON; };
option MSG_source_sel_retry, exit, action { *((int*)arg) = SET_RETRY; };
menu localfssource, y=-4, x=0, w=70, no box, no clear, exitstring MSG_Continue;
display action { msg_display(MSG_localfssource); };
display action { const char suff[] = "." SETS_TAR_SUFF;
msg_display_subst(MSG_localfssource, 1, &suff); };
option {src_legend(menu, MSG_Device, localfs_dev);},
action { src_prompt(MSG_dev, localfs_dev, sizeof localfs_dev);};
option {src_legend(menu, MSG_File_system, localfs_fs);},
@ -483,7 +489,8 @@ menu localfssource, y=-4, x=0, w=70, no box, no clear, exitstring MSG_Continue;
option MSG_exit_menu_generic, exit, action { *((int*)arg) = SET_RETRY; };
menu localdirsource, y=-4, x=0, w=70, no box, no clear, exitstring MSG_Continue;
display action { msg_display(MSG_localdir); };
display action { const char suff[] = "." SETS_TAR_SUFF;
msg_display_subst(MSG_localdir, 1, &suff); };
option {src_legend(menu, MSG_Base_dir, localfs_dir);},
action { src_prompt(MSG_Base_dir, localfs_dir, 60); };
option {src_legend(menu, MSG_Set_dir_bin, set_dir_bin);},

View File

@ -1,4 +1,4 @@
/* $NetBSD: msg.mi.de,v 1.13.2.8 2020/10/15 19:36:50 bouyer Exp $ */
/* $NetBSD: msg.mi.de,v 1.13.2.9 2020/11/05 08:10:21 sborrill Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -507,8 +507,12 @@ alle Pakete (volle Installation) zu installieren bzw. einen benutzer-
definierten Satz auszuwählen.
}
/* Called with: Example
* $0 = sets suffix .tgz
* $1 = URL protocol used ftp
*/
message ftpsource
{Dies sind die Daten zum Aufbau einer %s-Verbindung.
{Dies sind die Daten zum Aufbau einer $1-Verbindung.
Falls der Benutzer "ftp" ist, benötigen Sie kein Passwort.
}
@ -519,10 +523,13 @@ message email
message dev
{Laufwerk}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message nfssource
{Geben Sie den NFS-Server samt Verzeichnis an, auf dem die Distribution zu
finden ist.
(Das Verzeichnis muss .tgz Dateien enthalten und über NFS mountbar sein.)
(Das Verzeichnis muss $0 Dateien enthalten und über NFS mountbar sein.)
}
@ -533,13 +540,28 @@ Verzeichnis der Diskette liegen.
}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message cdromsource
{Geben Sie das CD-Laufwerk und das entsprechende Verzeichnis an, in dem
die Distribution zu finden ist.
(Das Verzeichnis muss .tgz Dateien enthalten.)
(Das Verzeichnis muss $0 Dateien enthalten.)
}
message No_cd_found
{Kein CD Laufwerk enthält eine CD mit den Distributions-Dateien!
Geben Sie die korrekten Daten manuel ein, oder legen Sie eine CD
ein und versuchen Sie es erneut.
}
message abort_install
{Installation abbrechen}
message source_sel_retry
{Zurück zur Quellauswahl}
message Available_cds
{Verfügbare CDs}
@ -550,17 +572,23 @@ message cd_path_not_found
{Die Installationsdateien wurden auf der ausgewählten CD nicht gefunden. Bitte
prüfen Sie den Gerätenamen und Pfad der Installationsdateien.}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message localfssource
{Geben Sie das noch nicht gemountete lokale Gerät und dessen entsprechendes
Verzeichnis an, in dem die Distribution zu finden ist.
(Das Verzeichnis muss .tgz Dateien enthalten.)
(Das Verzeichnis muss $0 Dateien enthalten.)
}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message localdir
{Geben Sie das Verzeichnis des bereits gemounteten lokalen Geräts an, in dem
die Distribution zu finden ist.
(Das Verzeichnis muss .tgz Dateien enthalten.)
(Das Verzeichnis muss $0 Dateien enthalten.)
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: msg.mi.en,v 1.19.2.9 2020/10/15 19:36:51 bouyer Exp $ */
/* $NetBSD: msg.mi.en,v 1.19.2.10 2020/11/05 08:10:21 sborrill Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -487,8 +487,12 @@ a core set (Minimal installation), all of them (Full installation), or a custom
group of sets (Custom installation).
}
/* Called with: Example
* $0 = sets suffix .tgz
* $1 = URL protocol used ftp
*/
message ftpsource
{The following are the %s site, directory, user, and password that
{The following are the $1 site, directory, user, and password that
will be used. If "user" is "ftp", then the password is not needed.
}
@ -499,9 +503,12 @@ message email
message dev
{device}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message nfssource
{Enter the nfs host and server directory where the distribution is located.
Remember, the directory should contain the .tgz files and
Remember, the directory should contain the $0 files and
must be nfs mountable.
}
@ -512,13 +519,27 @@ file system. The set files must be in the root directory of the floppies.
}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message cdromsource
{Enter the CDROM device to be used and directory on the CDROM where
the distribution is located.
Remember, the directory should contain the .tgz files.
Remember, the directory should contain the $0 files.
}
message No_cd_found
{Could not locate a CD medium in any drive with the distribution sets!
Enter the correct data manually, or insert a disk and retry.
}
message abort_install
{Cancel installation}
message source_sel_retry
{Back to source selection & retry}
message Available_cds
{Available CDs }
@ -529,16 +550,22 @@ message cd_path_not_found
{The installation sets have not been found at the default location on this
CD. Please check the device and path name.}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message localfssource
{Enter the unmounted local device and directory on that device where
the distribution is located.
Remember, the directory should contain the .tgz files.
Remember, the directory should contain the $0 files.
}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message localdir
{Enter the already-mounted local directory where the distribution is located.
Remember, the directory should contain the .tgz files.
Remember, the directory should contain the $0 files.
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: msg.mi.es,v 1.14.2.8 2020/10/15 19:36:51 bouyer Exp $ */
/* $NetBSD: msg.mi.es,v 1.14.2.9 2020/11/05 08:10:21 sborrill Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -502,8 +502,12 @@ instalaciones. Puede escoger para instalar s
seleccionar de entre los conjuntos de distribución opcionales.
}
/* Called with: Example
* $0 = sets suffix .tgz
* $1 = URL protocol used ftp
*/
message ftpsource
{Lo siguiente son el sitio %s, directorio, usuario y contraseña que se
{Lo siguiente son el sitio $1, directorio, usuario y contraseña que se
usarán. Si «usuario» es «ftp», no se necesita contraseña..
}
@ -514,9 +518,12 @@ message email
message dev
{dispositivo}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message nfssource
{Introduzca el servidor nfs y el directorio del servidor donde se encuentre
la distribución. Recuerde: el directorio debe contener los archivos .tgz y
la distribución. Recuerde: el directorio debe contener los archivos $0 y
debe ser montable por nfs.
}
@ -528,13 +535,27 @@ en el directorio ra
}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message cdromsource
{Introduzca el dispositivo de CDROM a usar y el directorio del CDROM
donde se encuentre la distribución.
Recuerde, el directorio debe contener los archivos .tgz.
Recuerde, el directorio debe contener los archivos $0.
}
message No_cd_found
{Could not locate a CD medium in any drive with the distribution sets!
Enter the correct data manually, or insert a disk and retry.
}
message abort_install
{Cancel installation}
message source_sel_retry
{Back to source selection & retry}
message Available_cds
{Available CDs}
@ -545,16 +566,22 @@ message cd_path_not_found
{The installation sets have not been found at the default location on this
CD. Please check device and path name.}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message localfssource
{Introduzca el dispositivo local desmontado y el directorio de ese
dispositivo donde se encuentre la distribución.
Recuerde, el directorio debe contener los archivos .tgz.
Recuerde, el directorio debe contener los archivos $0.
}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message localdir
{Introduzca el directorio local ya montado donde se encuentre la distribución.
Recuerde, el directorio debe contener los archivos .tgz.
Recuerde, el directorio debe contener los archivos $0.
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: msg.mi.fr,v 1.17.2.9 2020/10/15 19:36:50 bouyer Exp $ */
/* $NetBSD: msg.mi.fr,v 1.17.2.10 2020/11/05 08:10:21 sborrill Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -498,13 +498,17 @@ Trois types d'installations vous sont propos
personnalisée.
}
/* Called with: Example
* $0 = sets suffix .tgz
* $1 = URL protocol used ftp
*/
message ftpsource
{Voici la configuration actuelle pour : nom du site (%s), répertoire, nom
{Voici la configuration actuelle pour : nom du site ($1), répertoire, nom
d'utilisateur et mot de passe.
Si vous utilisez le mode FTP, le mot de passe n'est pas requis.
Le répertoire contenant les composants doit être défini par
rapport au répertoire de base, et contenir chaque composant sous
la forme de fichiers .tgz
la forme de fichiers $0
}
@ -537,6 +541,16 @@ tgz.
}
message No_cd_found
{Could not locate a CD medium in any drive with the distribution sets!
Enter the correct data manually, or insert a disk and retry.
}
message abort_install
{Cancel installation}
message source_sel_retry
{Back to source selection & retry}
message Available_cds
{CD-ROM disponibles}

View File

@ -1,4 +1,4 @@
/* $NetBSD: msg.mi.pl,v 1.20.2.9 2020/10/15 19:36:51 bouyer Exp $ */
/* $NetBSD: msg.mi.pl,v 1.20.2.10 2020/11/05 08:10:21 sborrill Exp $ */
/* Based on english version: */
/* NetBSD: msg.mi.pl,v 1.36 2004/04/17 18:55:35 atatat Exp */
@ -480,10 +480,12 @@ takze zainstalowac tylko podstawowy zestaw (minimalna instalacja), lub
wybrac te, ktore chcesz (Inna instalacja)
}
/* Called with: Example
* $0 = sets suffix .tgz
* $1 = URL protocol used ftp
*/
message ftpsource
{Ponizej masz site %s, katalog, uzytkownika, oraz haslo gotowe do uzycia.
{Ponizej masz site $1, katalog, uzytkownika, oraz haslo gotowe do uzycia.
Jesli "uzytkownik" to "ftp", wtedy haslo nie jest wymagane.
}
@ -494,9 +496,12 @@ message email
message dev
{urzadzenie}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message nfssource
{Wprowadz hosta NFS oraz katalog gdzie znajduje sie dystrybucja.
Pamietaj, ze katalog musi zawierac pliki .tgz, oraz musi byc
Pamietaj, ze katalog musi zawierac pliki $0, oraz musi byc
dostepny przez NFS.
}
@ -508,13 +513,27 @@ znajdowac sie w glownym katalogu dyskietki.
}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message cdromsource
{Podaj urzadzenie CDROM oraz katalog na CDROMie, w ktorym znajduje sie
dystrybucja.
Pamietaj, ze katalog musi zawierac pliki .tgz.
Pamietaj, ze katalog musi zawierac pliki $0.
}
message No_cd_found
{Could not locate a CD medium in any drive with the distribution sets!
Enter the correct data manually, or insert a disk and retry.
}
message abort_install
{Cancel installation}
message source_sel_retry
{Back to source selection & retry}
message Available_cds
{Dostepne napedy CD}
@ -526,16 +545,22 @@ message cd_path_not_found
{Zbiory instalacyjne nie zostaly znalezione w domyslnym polozeniu na tym
CD. Prosze sprawdzic urzadzenie i sciezke.}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message localfssource
{Podaj niezamontowane lokalne urzadzenie oraz katalog na nim, gdzie
znajduje sie dystrybucja.
Pamietaj, ze katalog musi zawierac pliki .tgz.
Pamietaj, ze katalog musi zawierac pliki $0.
}
/* Called with: Example
* $0 = sets suffix .tgz
*/
message localdir
{Podaj aktualnie zamontowany lokalny katalog, gdzie znajduje sie dystrybucja.
Pamietaj, ze katalog musi zawierac pliki .tgz.
Pamietaj, ze katalog musi zawierac pliki $0.
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: util.c,v 1.29.2.7 2020/10/15 19:36:50 bouyer Exp $ */
/* $NetBSD: util.c,v 1.29.2.8 2020/11/05 08:10:21 sborrill Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -414,6 +414,8 @@ get_iso9660_volname(int dev, int sess, char *volname)
* Local state while iterating CDs and collecting volumes
*/
struct get_available_cds_state {
size_t num_mounted;
struct statvfs *mounted;
struct cd_info *info;
size_t count;
};
@ -425,14 +427,26 @@ static bool
get_available_cds_helper(void *arg, const char *device)
{
struct get_available_cds_state *state = arg;
char dname[16], volname[80];
char dname[16], tname[16], volname[80], *t;
struct disklabel label;
int part, dev, error, sess, ready;
int part, dev, error, sess, ready, tlen;
if (!is_cdrom_device(device, false))
return true;
sprintf(dname, "/dev/r%s%c", device, 'a'+RAW_PART);
tlen = sprintf(tname, "/dev/%s", device);
/* check if this is mounted already */
for (size_t i = 0; i < state->num_mounted; i++) {
if (strncmp(state->mounted[i].f_mntfromname, tname, tlen)
== 0) {
t = state->mounted[i].f_mntfromname + tlen;
if (t[0] >= 'a' && t[0] <= 'z' && t[1] == 0)
return true;
}
}
dev = open(dname, O_RDONLY, 0);
if (dev == -1)
return true;
@ -495,18 +509,35 @@ static int
get_available_cds(void)
{
struct get_available_cds_state data;
int n, m;
memset(&data, 0, sizeof data);
data.info = cds;
data.count = 0;
n = getvfsstat(NULL, 0, ST_NOWAIT);
if (n > 0) {
data.mounted = calloc(n, sizeof(*data.mounted));
m = getvfsstat(data.mounted, n*sizeof(*data.mounted),
ST_NOWAIT);
assert(m >= 0 && m <= n);
data.num_mounted = m;
}
enumerate_disks(&data, get_available_cds_helper);
free(data.mounted);
return data.count;
}
static int
cd_has_sets(void)
{
/* sanity check */
if (cdrom_dev[0] == 0)
return 0;
/* Mount it */
if (run_program(RUN_SILENT, "/sbin/mount -rt cd9660 /dev/%s /mnt2",
cdrom_dev) != 0)
@ -564,7 +595,6 @@ get_via_cdrom(void)
menu_ent cd_menu[MAX_CD_INFOS];
struct stat sb;
int rv, num_cds, menu_cd, i, selected_cd = 0;
bool silent = false;
int mib[2];
char rootdev[SSTRSIZE] = "";
size_t varlen;
@ -584,7 +614,8 @@ get_via_cdrom(void)
memset(cd_menu, 0, sizeof(cd_menu));
num_cds = get_available_cds();
if (num_cds <= 0) {
silent = true;
msg_display(MSG_No_cd_found);
cdrom_dev[0] = 0;
} else if (num_cds == 1) {
/* single CD found, check for sets on it */
strcpy(cdrom_dev, cds[0].device_name);
@ -611,9 +642,7 @@ get_via_cdrom(void)
return SET_OK;
}
if (silent)
msg_display("");
else {
if (num_cds >= 1 && mnt2_mounted) {
umount_mnt2();
hit_enter_to_continue(MSG_cd_path_not_found, NULL);
}
@ -621,8 +650,8 @@ get_via_cdrom(void)
/* ask for paths on the CD */
rv = -1;
process_menu(MENU_cdromsource, &rv);
if (rv == SET_RETRY)
return SET_RETRY;
if (rv == SET_RETRY || rv == SET_ABANDON)
return rv;
if (cd_has_sets())
return SET_OK;