"Todd C. Miller" <todd.mil...@courtesan.com> writes: > On Tue, 29 Dec 2015 13:25:16 +0100, > =?utf-8?Q?J=C3=A9r=C3=A9mie_Courr=C3=A8ges- > Anglas?= wrote: > >> I think it makes sense to try to recover, so calling clearerr() is >> needed. But as said by millert you can't rely on fprintf to set the >> error indicator; the write might not be committed to disk, and the >> ftruncate and fsync calls below won't magically update the FILE's error >> indicator. >> >> What about using "r = fflush(freqfp);" instead of ferror? > > How does this look? > > - todd > > Index: ntpd.c > =================================================================== > RCS file: /cvs/src/usr.sbin/ntpd/ntpd.c,v > retrieving revision 1.101 > diff -u -p -u -r1.101 ntpd.c > --- ntpd.c 19 Dec 2015 17:55:29 -0000 1.101 > +++ ntpd.c 29 Dec 2015 17:51:56 -0000 > @@ -552,12 +552,12 @@ writefreq(double d) > if (freqfp == NULL) > return 0; > rewind(freqfp); > - fprintf(freqfp, "%.3f\n", d * 1e6); /* scale to ppm */ > - r = ferror(freqfp); > - if (r != 0) { > + r = fprintf(freqfp, "%.3f\n", d * 1e6); /* scale to ppm */ > + if (r < 0 || fflush(freqfp) != 0) {
Fine with me. > if (warnonce) { > log_warnx("can't write %s", DRIFTFILE); > warnonce = 0; > + clearerr(freqfp); > } Looking closer, the clearerr() call should probably be out of the conditional. With that fixed, ok jca@ > return 0; > } > -- jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE