small addition to mg2a BSD fileio.c
Paul Placeway
paul at dulcimer.cis.ohio-state.edu
Sun Jun 19 03:30:24 AEST 1988
At Ohio State, we run a lot of Suns out here, and soft mount most of
the file systems. When a server goes down, the only way the programs
can tell is by the return values on the system calls and libraries.
Mg 1b didn't check the return values enough, so I ruggedized mg2a when
I installed it; the only change is to ffclose() of fileio.c. If a
small (< BUFSIZ) file is written, write errors will only be discovered
by ffwopen() and ffclose(). ffwopen() already checked things enough,
but ffclose() didn't. Also, some routines ignoreed the return value
of ffclose when they should't have. The diffs follow...
- Paul Placeway
paul at tut.cis.ohio-state.edu
...!osu-cis!cis.ohio-state.edu!paul
=======================CUT HERE==================
Index: extend.c
*** extend.c.2a Sat Jun 18 11:45:41 1988
--- extend.c Sat Jun 18 13:19:37 1988
***************
*** 529,534
load(fname) char *fname; {
int s = TRUE;
int nbytes;
char excbuf[128];
if ((fname = adjustname(fname)) == NULL)
--- 529,535 -----
load(fname) char *fname; {
int s = TRUE;
int nbytes;
+ int z;
char excbuf[128];
if ((fname = adjustname(fname)) == NULL)
***************
*** 543,549
break;
}
}
! (VOID) ffclose();
excbuf[nbytes] = '\0';
if(s!=FIOEOF || (nbytes && excline(excbuf)!=TRUE))
return FALSE;
--- 544,550 -----
break;
}
}
! z = ffclose(); /* save the return value, test in a bit */
excbuf[nbytes] = '\0';
if(s!=FIOEOF || (nbytes && excline(excbuf)!=TRUE) || (z != FIOSUC))
return FALSE;
***************
*** 545,551
}
(VOID) ffclose();
excbuf[nbytes] = '\0';
! if(s!=FIOEOF || (nbytes && excline(excbuf)!=TRUE))
return FALSE;
return TRUE;
}
--- 546,552 -----
}
z = ffclose(); /* save the return value, test in a bit */
excbuf[nbytes] = '\0';
! if(s!=FIOEOF || (nbytes && excline(excbuf)!=TRUE) || (z != FIOSUC))
return FALSE;
return TRUE;
}
Index: file.c
*** file.c.2a Sat Jun 18 13:23:54 1988
--- file.c Sat Jun 18 13:24:31 1988
***************
*** 249,255
}
}
endoffile:
! (VOID) ffclose(); /* Ignore errors. */
if (s==FIOEOF) { /* Don't zap an error. */
if (nline == 1) ewprintf("(Read 1 line)");
else ewprintf("(Read %d lines)", nline);
--- 249,256 -----
}
}
endoffile:
! if (ffclose() != FIOSUC) /* PWP: DON'T Ignore errors. */
! s = FIOERR;
if (s==FIOEOF) { /* Don't zap an error. */
if (nline == 1) ewprintf("(Read 1 line)");
else ewprintf("(Read %d lines)", nline);
Index: sys/bsd/fileio.c
*** sys/bsd/fileio.c.2a Sat Jun 18 12:50:33 1988
--- sys/bsd/fileio.c Sat Jun 18 13:16:37 1988
***************
*** 31,37
/*
* Close a file.
! * Should look at the status.
*/
ffclose() {
(VOID) fclose(ffp);
--- 31,37 -----
/*
* Close a file.
! * Should look at the status. PWP: it does now.
*/
ffclose() {
if (fclose(ffp) != 0) {
***************
*** 34,40
* Should look at the status.
*/
ffclose() {
! (VOID) fclose(ffp);
return (FIOSUC);
}
--- 34,43 -----
* Should look at the status. PWP: it does now.
*/
ffclose() {
! if (fclose(ffp) != 0) {
! ewprintf("Error closing file");
! return (FIOERR);
! }
return (FIOSUC);
}
More information about the Comp.sources.bugs
mailing list