summaryrefslogtreecommitdiffstats
path: root/usr.sbin/sysinstall/media.c
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1997-01-24 19:24:51 +0000
committerjkh <jkh@FreeBSD.org>1997-01-24 19:24:51 +0000
commitea4f82e353a9946587bb951abdf055807de19e85 (patch)
treedd1c8a0c2facff37bca8e7cce5cbf8da441b17ba /usr.sbin/sysinstall/media.c
parent04cbebd0add1fa8f9192b002813594194b3b35e8 (diff)
downloadFreeBSD-src-ea4f82e353a9946587bb951abdf055807de19e85.zip
FreeBSD-src-ea4f82e353a9946587bb951abdf055807de19e85.tar.gz
OK, I've got two ideas to file in the "really seemed like a good idea
at the time, but on further reflection..." bucket with these changes. 1. Checking the media before frobbing the disks was a fine idea, and I wish it could have worked, but that leads to a rather difficult situation when you need to mount the media someplace and you're about to: a) Chroot away from your present root. b) Newfs the root to be. You're basically screwed since there's no place to stick the mount point where it will be found following the newfs/chroot (and eliminating the chroot in favor of just using the "root bias" feature would work great for the distributions but not the pkg_add calls done by the package installer). 2. Automatic timeout handling. I don't know why, but alarm() frequently returns no residual even when the alarm didn't go off, which defies the man page but hey, since when was that so unusual? Take out timeouts but retain the code which temporarily replaces the SIGINT handler in favor of a more media-specific handler. This way, at least, if it's hanging you can at least whap it. I think the timeout code would have been losing over *really slow* links anyway, so it's probably best that it go. This should fix NFS, tape & CDROM installs again (serves me right for getting complacent and using just the FTP installs in my testing).
Diffstat (limited to 'usr.sbin/sysinstall/media.c')
-rw-r--r--usr.sbin/sysinstall/media.c52
1 files changed, 25 insertions, 27 deletions
diff --git a/usr.sbin/sysinstall/media.c b/usr.sbin/sysinstall/media.c
index 64a0d48..af7ab98 100644
--- a/usr.sbin/sysinstall/media.c
+++ b/usr.sbin/sysinstall/media.c
@@ -47,6 +47,26 @@
#include <netinet/in.h>
#include <arpa/inet.h>
+static Boolean got_intr = FALSE;
+
+/* timeout handler */
+static void
+handle_intr(int sig)
+{
+ msgDebug("User generated interrupt.\n");
+ got_intr = TRUE;
+}
+
+static int
+check_for_interrupt(void)
+{
+ if (got_intr) {
+ got_intr = FALSE;
+ return TRUE;
+ }
+ return FALSE;
+}
+
static int
genericHook(dialogMenuItem *self, DeviceType type)
{
@@ -518,25 +538,6 @@ mediaExtractDistEnd(int zpid, int cpid)
return TRUE;
}
-static void
-media_timeout(int sig)
-{
- alarm(0);
-}
-
-/* Return the timeout interval */
-int
-mediaTimeout(void)
-{
- char *cp;
- int t;
-
- cp = getenv(VAR_MEDIA_TIMEOUT);
- if (!cp || !(t = atoi(cp)))
- t = MEDIA_TIMEOUT;
- return t;
-}
-
Boolean
mediaExtractDist(char *dir, char *dist, FILE *fp)
{
@@ -604,20 +605,19 @@ mediaExtractDist(char *dir, char *dist, FILE *fp)
total = 0;
(void)gettimeofday(&start, (struct timezone *)0);
- /* Make ^C fake a sudden timeout */
- new.sa_handler = media_timeout;
+ /* Make ^C abort the current transfer rather than the whole show */
+ new.sa_handler = handle_intr;
new.sa_flags = 0;
new.sa_mask = 0;
sigaction(SIGINT, &new, &old);
- alarm_set(mediaTimeout(), media_timeout);
while ((i = fread(buf, 1, BUFSIZ, fp)) > 0) {
- if (!alarm_clear()) {
- msgConfirm("Failure to read from media - timeout or user abort.\n");
+ if (check_for_interrupt()) {
+ msgConfirm("Failure to read from media: User interrupt.");
break;
}
if (write(qfd[1], buf, i) != i) {
- msgConfirm("Write error on transfer to cpio process, try of %d bytes\n", i);
+ msgConfirm("Write error on transfer to cpio process, try of %d bytes.", i);
break;
}
else {
@@ -633,9 +633,7 @@ mediaExtractDist(char *dir, char *dist, FILE *fp)
msgInfo("%10d bytes read from %s dist @ %.1f KB/sec.",
total, dist, (total / seconds) / 1024.0);
}
- alarm_set(mediaTimeout(), media_timeout);
}
- alarm_clear();
sigaction(SIGINT, &old, NULL); /* restore sigint */
close(qfd[1]);
OpenPOWER on IntegriCloud