| 192 |
|
sprintf(errmsg, "cannot open ambient file \"%s\"", ambfile); |
| 193 |
|
error(SYSTEM, errmsg); |
| 194 |
|
} |
| 195 |
< |
nunflshed++; /* lie */ |
| 196 |
< |
ambsync(); |
| 195 |
> |
ambsync(); /* load previous values */ |
| 196 |
|
} |
| 197 |
|
|
| 198 |
|
|
| 876 |
|
AMBVAL avs; |
| 877 |
|
register int n; |
| 878 |
|
|
| 880 |
– |
if (nunflshed == 0) |
| 881 |
– |
return(0); |
| 879 |
|
if (lastpos < 0) /* initializing (locked in initambfile) */ |
| 880 |
|
goto syncend; |
| 881 |
< |
/* gain exclusive access */ |
| 882 |
< |
aflock(F_WRLCK); |
| 881 |
> |
/* gain appropriate access */ |
| 882 |
> |
aflock(nunflshed ? F_WRLCK : F_RDLCK); |
| 883 |
|
/* see if file has grown */ |
| 884 |
|
if ((flen = lseek(fileno(ambfp), (off_t)0, SEEK_END)) < 0) |
| 885 |
|
goto seekerr; |
| 902 |
|
avinsert(avstore(&avs)); |
| 903 |
|
n -= AMBVALSIZ; |
| 904 |
|
} |
| 905 |
+ |
lastpos = flen - n; |
| 906 |
|
/*** seek always as safety measure |
| 907 |
|
if (n) ***/ /* alignment */ |
| 908 |
< |
if (lseek(fileno(ambfp), (off_t)(flen-n), SEEK_SET) < 0) |
| 908 |
> |
if (lseek(fileno(ambfp), (off_t)lastpos, SEEK_SET) < 0) |
| 909 |
|
goto seekerr; |
| 910 |
|
} |
| 911 |
|
#ifdef DEBUG |
| 918 |
|
#endif |
| 919 |
|
syncend: |
| 920 |
|
n = fflush(ambfp); /* calls write() at last */ |
| 921 |
< |
if ((lastpos = lseek(fileno(ambfp), (off_t)0, SEEK_CUR)) < 0) |
| 922 |
< |
goto seekerr; |
| 921 |
> |
if (n == EOF) { |
| 922 |
> |
if ((lastpos = lseek(fileno(ambfp), (off_t)0, SEEK_CUR)) < 0) |
| 923 |
> |
goto seekerr; |
| 924 |
> |
} else |
| 925 |
> |
lastpos += (long)nunflshed*AMBVALSIZ; |
| 926 |
|
aflock(F_UNLCK); /* release file */ |
| 927 |
|
nunflshed = 0; |
| 928 |
|
return(n); |
| 936 |
|
extern int |
| 937 |
|
ambsync(void) /* flush ambient file */ |
| 938 |
|
{ |
| 938 |
– |
if (nunflshed == 0) |
| 939 |
– |
return(0); |
| 939 |
|
nunflshed = 0; |
| 940 |
|
return(fflush(ambfp)); |
| 941 |
|
} |