diff options
author | jkh <jkh@FreeBSD.org> | 1997-01-17 15:58:58 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 1997-01-17 15:58:58 +0000 |
commit | 36e3910a7d4d2443addb87b2ec5a93aa0a3c0a5a (patch) | |
tree | c617ad8c4cac1b6a32599d587298596325e5b0f1 /usr.sbin/sysinstall/media.c | |
parent | b293f5b41ca45894135a41fd164567da1f639444 (diff) | |
download | FreeBSD-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.c | 22 |
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); |