Use alarm's return status to more properly denote timeout rather than keeping

an icky global around.
This commit is contained in:
Jordan K. Hubbard 1997-01-19 09:55:37 +00:00
parent 86c07de1d7
commit 0ebf0addab
10 changed files with 54 additions and 56 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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);

View File

@ -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 */

View File

@ -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);

View File

@ -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 */

View File

@ -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;

View File

@ -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;
}

View File

@ -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);

View File

@ -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 */