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) {
if (warnonce) {
log_warnx("can't write %s", DRIFTFILE);
warnonce = 0;
+ clearerr(freqfp);
}
return 0;
}