summaryrefslogtreecommitdiffstats
path: root/usr.sbin/sysinstall
diff options
context:
space:
mode:
authorbrucec <brucec@FreeBSD.org>2010-06-23 14:19:19 +0000
committerbrucec <brucec@FreeBSD.org>2010-06-23 14:19:19 +0000
commit181e38ac992eec26ae4c3979a2201eaa74d27bd5 (patch)
tree807f54c65cb1f866a761ddd974f80eaafe74fead /usr.sbin/sysinstall
parentb2337fe9dd8bd759c1535c5e805731500ca30878 (diff)
downloadFreeBSD-src-181e38ac992eec26ae4c3979a2201eaa74d27bd5.zip
FreeBSD-src-181e38ac992eec26ae4c3979a2201eaa74d27bd5.tar.gz
Make it easier to cancel a failing installation by only attempting to
extract distributions once. If a distribution fails to fetch/extract and the user doesn't want to retry, abort the installation. Reviewed by: randi Approved by: rrs (mentor) MFC after: 1 month
Diffstat (limited to 'usr.sbin/sysinstall')
-rw-r--r--usr.sbin/sysinstall/dist.c22
-rw-r--r--usr.sbin/sysinstall/install.c6
2 files changed, 19 insertions, 9 deletions
diff --git a/usr.sbin/sysinstall/dist.c b/usr.sbin/sysinstall/dist.c
index 1a2dd5b..8bd62d1 100644
--- a/usr.sbin/sysinstall/dist.c
+++ b/usr.sbin/sysinstall/dist.c
@@ -605,7 +605,7 @@ getinfo:
if (fp == NULL)
msgConfirm("Failed to find %s on this media. Reinitializing media.", fname);
else
- msgConfirm("Failed to retreive piece file %s.\n"
+ msgConfirm("Failed to retrieve piece file %s.\n"
"%s: Reinitializing media.",
fname, !intr ? "I/O error" : "User interrupt");
DEVICE_SHUTDOWN(mediaDevice);
@@ -701,6 +701,7 @@ distExtract(char *parent, Distribution *me)
char *path, *dist;
WINDOW *w = savescr();
struct sigaction old, new;
+ int canceled = 0;
status = TRUE;
if (isDebug())
@@ -715,7 +716,7 @@ distExtract(char *parent, Distribution *me)
sigaction(SIGINT, &new, &old);
/* Loop through to see if we're in our parent's plans */
- for (i = 0; me[i].my_name; i++) {
+ for (i = 0; me[i].my_name && canceled == 0; i++) {
dist = me[i].my_name;
path = parent ? parent : dist;
@@ -750,8 +751,11 @@ distExtract(char *parent, Distribution *me)
status = msgYesNo("Unable to transfer the %s distribution from\n%s.\n\n"
"Do you want to try to retrieve it again?",
me[i].my_name, mediaDevice->name);
- if (!status)
+ if (status == 0)
--i;
+ else
+ canceled = 1;
+
status = FALSE;
}
}
@@ -765,6 +769,7 @@ distExtract(char *parent, Distribution *me)
if (status)
*(me[i].my_mask) &= ~(me[i].my_bit);
}
+
sigaction(SIGINT, &old, NULL); /* Restore signal handler */
restorescr(w);
return status;
@@ -857,8 +862,9 @@ printSelected(char *buf, int selected, Distribution *me, int *col)
int
distExtractAll(dialogMenuItem *self)
{
- int old_dists, old_kernel, retries = 0, status = DITEM_SUCCESS;
+ int old_dists, old_kernel, status = DITEM_SUCCESS;
char buf[512];
+ int extract_status = TRUE;
WINDOW *w;
/* paranoia */
@@ -878,9 +884,7 @@ distExtractAll(dialogMenuItem *self)
w = savescr();
msgNotify("Attempting to install all selected distributions..");
- /* Try for 3 times around the loop, then give up. */
- while (Dists && ++retries < 3)
- distExtract(NULL, DistTable);
+ extract_status = distExtract(NULL, DistTable);
dialog_clear_norefresh();
/* Only do base fixup if base dist was successfully extracted */
@@ -907,5 +911,9 @@ distExtractAll(dialogMenuItem *self)
}
}
restorescr(w);
+
+ if (extract_status == FALSE)
+ status = DITEM_FAILURE;
+
return status;
}
diff --git a/usr.sbin/sysinstall/install.c b/usr.sbin/sysinstall/install.c
index 4e7de1a..2a6a95b 100644
--- a/usr.sbin/sysinstall/install.c
+++ b/usr.sbin/sysinstall/install.c
@@ -678,8 +678,7 @@ nodisks:
msgConfirm("Installation completed with some errors. You may wish to\n"
"scroll through the debugging messages on VTY1 with the\n"
"scroll-lock feature. You can also choose \"No\" at the next\n"
- "prompt and go back into the installation menus to retry\n"
- "whichever operations have failed.");
+ "prompt and reboot and try the installation again.");
return i;
}
@@ -855,6 +854,9 @@ try_media:
/* Now go get it all */
i = distExtractAll(self);
+ if (i == FALSE)
+ return FALSE;
+
/* When running as init, *now* it's safe to grab the rc.foo vars */
installEnvironment();
OpenPOWER on IntegriCloud