Use alarm's return status to more properly denote timeout rather than keeping
an icky global around.
This commit is contained in:
parent
86c07de1d7
commit
0ebf0addab
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
Loading…
x
Reference in New Issue
Block a user