diff options
author | jkh <jkh@FreeBSD.org> | 1997-01-19 09:55:37 +0000 |
---|---|---|
committer | jkh <jkh@FreeBSD.org> | 1997-01-19 09:55:37 +0000 |
commit | 1d0095968bbcdd83e153873f85d70bd88bf7f314 (patch) | |
tree | fe9faa87675730a426625b5c6186afd3ad62b7de /release | |
parent | 45f24bb16eb909ab1f7566fbf4a770f73f6543b5 (diff) | |
download | FreeBSD-src-1d0095968bbcdd83e153873f85d70bd88bf7f314.zip FreeBSD-src-1d0095968bbcdd83e153873f85d70bd88bf7f314.tar.gz |
Use alarm's return status to more properly denote timeout rather than keeping
an icky global around.
Diffstat (limited to 'release')
-rw-r--r-- | release/sysinstall/dist.c | 32 | ||||
-rw-r--r-- | release/sysinstall/media.c | 5 | ||||
-rw-r--r-- | release/sysinstall/sysinstall.h | 3 | ||||
-rw-r--r-- | release/sysinstall/system.c | 9 |
4 files changed, 25 insertions, 24 deletions
diff --git a/release/sysinstall/dist.c b/release/sysinstall/dist.c index 7d05dc5..491a106 100644 --- a/release/sysinstall/dist.c +++ b/release/sysinstall/dist.c @@ -344,11 +344,11 @@ distSetXF86(dialogMenuItem *self) static void media_timeout(int sig) { - AlarmWentOff = TRUE; if (sig != SIGINT) msgDebug("A media timeout occurred.\n"); else msgDebug("User generated interrupt.\n"); + alarm(0); } static Boolean @@ -415,9 +415,8 @@ distExtract(char *parent, Distribution *me) alarm_set(mediaTimeout(), media_timeout); status = attr_parse(dist_attr, fp); - alarm_clear(); sigaction(SIGINT, &old, NULL); /* Restore signal handler */ - if (DITEM_STATUS(status) == DITEM_FAILURE) + if (!alarm_clear() || DITEM_STATUS(status) == DITEM_FAILURE) msgConfirm("Cannot parse information file for the %s distribution!\n" "Please verify that your media is valid and try again.", dist); else { @@ -469,8 +468,16 @@ distExtract(char *parent, Distribution *me) total = 0; (void)gettimeofday(&start, (struct timezone *)0); - /* We have one or more chunks, go pick them up */ + /* We have one or more chunks, initialize unpackers... */ mediaExtractDistBegin(root_bias(me[i].my_dir), &fd2, &zpid, &cpid); + + /* Make ^C fake a sudden timeout */ + new.sa_handler = media_timeout; + new.sa_flags = 0; + new.sa_mask = 0; + sigaction(SIGINT, &new, &old); + + /* And go for all the chunks */ for (chunk = 0; chunk < numchunks; chunk++) { int n, retval, last_msg; char prompt[80]; @@ -489,22 +496,18 @@ distExtract(char *parent, Distribution *me) snprintf(prompt, sizeof prompt, "Extracting %s into %s directory...", dist, root_bias(me[i].my_dir)); dialog_gauge("Progress", prompt, 8, 15, 6, 50, (int)((float)(chunk + 1) / numchunks * 100)); - /* Make ^C fake a sudden timeout */ - new.sa_handler = media_timeout; - new.sa_flags = 0; - new.sa_mask = 0; - sigaction(SIGINT, &new, &old); while (1) { int seconds; alarm_set(mediaTimeout(), media_timeout); n = fread(buf, 1, BUFSIZ, fp); - alarm_clear(); - if (n <= 0 || AlarmWentOff) { - msgConfirm("Read error on media (timeout or user abort).\n"); + if (!alarm_clear()) { + msgConfirm("Media read error: Timeout or user abort."); break; } + else if (n <= 0) + break; total += n; /* Print statistics about how we're doing */ @@ -530,9 +533,9 @@ distExtract(char *parent, Distribution *me) goto punt; } } - sigaction(SIGINT, &old, NULL); /* Restore signal handler */ fclose(fp); } + sigaction(SIGINT, &old, NULL); /* Restore signal handler */ close(fd2); status = mediaExtractDistEnd(zpid, cpid); goto done; @@ -558,12 +561,15 @@ 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); + dialog_clear(); } } } /* Extract was successful, remove ourselves from further consideration */ if (status) *(me[i].my_mask) &= ~(me[i].my_bit); + else + continue; } restorescr(w); return status; diff --git a/release/sysinstall/media.c b/release/sysinstall/media.c index 288508a..64a0d48 100644 --- a/release/sysinstall/media.c +++ b/release/sysinstall/media.c @@ -521,7 +521,7 @@ mediaExtractDistEnd(int zpid, int cpid) static void media_timeout(int sig) { - AlarmWentOff = TRUE; + alarm(0); } /* Return the timeout interval */ @@ -612,8 +612,7 @@ mediaExtractDist(char *dir, char *dist, FILE *fp) alarm_set(mediaTimeout(), media_timeout); while ((i = fread(buf, 1, BUFSIZ, fp)) > 0) { - alarm_clear(); - if (AlarmWentOff) { + if (!alarm_clear()) { msgConfirm("Failure to read from media - timeout or user abort.\n"); break; } diff --git a/release/sysinstall/sysinstall.h b/release/sysinstall/sysinstall.h index 1494a8c..3fb3f60 100644 --- a/release/sysinstall/sysinstall.h +++ b/release/sysinstall/sysinstall.h @@ -305,7 +305,6 @@ typedef struct _devPriv { /*** Externs ***/ -extern Boolean AlarmWentOff; /* Convenience variable for alarm_foo() stuff */ extern int DebugFD; /* Where diagnostic output goes */ extern Boolean Fake; /* Don't actually modify anything - testing */ extern Boolean SystemWasInstalled; /* Did we install it? */ @@ -633,7 +632,7 @@ extern int package_extract(Device *dev, char *name, Boolean depended); extern Boolean package_exists(char *name); /* system.c */ -extern void alarm_clear(void); +extern int alarm_clear(void); extern void alarm_set(int delay, void (*handler)(int sig)); extern void systemInitialize(int argc, char **argv); extern void systemShutdown(int status); diff --git a/release/sysinstall/system.c b/release/sysinstall/system.c index 1fc4696..0854cca 100644 --- a/release/sysinstall/system.c +++ b/release/sysinstall/system.c @@ -47,9 +47,6 @@ handle_intr(int sig) restorescr(save); } -/* Public variable for ease of use - handler should set it if interested */ -Boolean AlarmWentOff; - /* Simple alarm interface */ void alarm_set(int delay, void (*handler)(int sig)) @@ -60,20 +57,20 @@ alarm_set(int delay, void (*handler)(int sig)) act.sa_flags = 0; act.sa_mask = 0; sigaction(SIGALRM, &act, NULL); - AlarmWentOff = FALSE; alarm(delay); } -void +int alarm_clear(void) { struct sigaction act; + int i = alarm(0); - alarm(0); act.sa_handler = SIG_DFL; act.sa_flags = 0; act.sa_mask = 0; sigaction(SIGALRM, &act, NULL); + return i; } /* Expand a file into a convenient location, nuking it each time */ |