summaryrefslogtreecommitdiffstats
path: root/usr.sbin/sysinstall/media.c
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1997-01-17 15:58:58 +0000
committerjkh <jkh@FreeBSD.org>1997-01-17 15:58:58 +0000
commit36e3910a7d4d2443addb87b2ec5a93aa0a3c0a5a (patch)
treec617ad8c4cac1b6a32599d587298596325e5b0f1 /usr.sbin/sysinstall/media.c
parentb293f5b41ca45894135a41fd164567da1f639444 (diff)
downloadFreeBSD-src-36e3910a7d4d2443addb87b2ec5a93aa0a3c0a5a.zip
FreeBSD-src-36e3910a7d4d2443addb87b2ec5a93aa0a3c0a5a.tar.gz
Add timeout support to sysinstall's general media handling,
allow SIGINT to stand for "time out now!" in certain cases.
Diffstat (limited to 'usr.sbin/sysinstall/media.c')
-rw-r--r--usr.sbin/sysinstall/media.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/usr.sbin/sysinstall/media.c b/usr.sbin/sysinstall/media.c
index 8bade8a..cc8e2aa 100644
--- a/usr.sbin/sysinstall/media.c
+++ b/usr.sbin/sysinstall/media.c
@@ -35,6 +35,7 @@
*/
#include "sysinstall.h"
+#include <signal.h>
#include <netdb.h>
#include <sys/socket.h>
#include <sys/param.h>
@@ -515,6 +516,11 @@ mediaExtractDistEnd(int zpid, int cpid)
return TRUE;
}
+static void
+media_timeout(int sig)
+{
+ AlarmWentOff = TRUE;
+}
Boolean
mediaExtractDist(char *dir, char *dist, FILE *fp)
@@ -522,6 +528,7 @@ mediaExtractDist(char *dir, char *dist, FILE *fp)
int i, j, total, seconds, zpid, cpid, pfd[2], qfd[2];
char buf[BUFSIZ];
struct timeval start, stop;
+ struct sigaction new, old;
if (!dir)
dir = "/";
@@ -582,7 +589,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;
+ new.sa_flags = 0;
+ new.sa_mask = 0;
+ sigaction(SIGINT, &new, &old);
+
+ alarm_set(MEDIA_TIMEOUT, media_timeout);
while ((i = fread(buf, 1, BUFSIZ, fp)) > 0) {
+ alarm_clear();
+ if (AlarmWentOff) {
+ msgDebug("Failure to read from media - timeout or user abort.\n");
+ break;
+ }
if (write(qfd[1], buf, i) != i) {
msgDebug("Write error on transfer to cpio process, try of %d bytes\n", i);
break;
@@ -600,7 +619,10 @@ 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(MEDIA_TIMEOUT, media_timeout);
}
+ alarm_clear();
+ sigaction(SIGINT, &old, NULL); /* restore sigint */
close(qfd[1]);
i = waitpid(zpid, &j, 0);
OpenPOWER on IntegriCloud