diff --git a/src/server/ChangeLog b/src/server/ChangeLog index 09134ad0c506386829529665d3ee1125ab15fa37..9299e1a3d37be9627ad63a2c4c5b172d7fb25f05 100644 --- a/src/server/ChangeLog +++ b/src/server/ChangeLog @@ -1,3 +1,9 @@ +Tue Mar 24 18:05:18 1992 Per Cederqvist (ceder@robert) + + * simple-cache.c (save_one_text): Check that the entire file made + it to the disk (compare wath ftell() says after fclose() and + fopen()). + Mon Mar 23 08:51:13 1992 Per Cederqvist (ceder@robin) * dbck.c (truncated_texts): New variable. diff --git a/src/server/simple-cache.c b/src/server/simple-cache.c index f13208ead988cea7f39d3cc41dcb5c4b30655a52..9101ebbc70eac94a2d7b23e3f81b4364b8473e47 100644 --- a/src/server/simple-cache.c +++ b/src/server/simple-cache.c @@ -1,5 +1,5 @@ /* - * $Id: simple-cache.c,v 0.20 1992/02/26 18:44:58 ceder Exp $ + * $Id: simple-cache.c,v 0.21 1992/03/24 17:41:05 ceder Exp $ * Copyright (C) 1991 Lysator Academic Computer Association. * * This file is part of the LysKOM server. @@ -33,7 +33,7 @@ * New save algorithm by ceder. */ -static char *rcsid = "$Id: simple-cache.c,v 0.20 1992/02/26 18:44:58 ceder Exp $"; +static char *rcsid = "$Id: simple-cache.c,v 0.21 1992/03/24 17:41:05 ceder Exp $"; @@ -1506,6 +1506,8 @@ static void save_one_text(void) { Cache_node *cn; + long offset; + long offset2; if (sync_next < highest_text_no) { @@ -1550,6 +1552,18 @@ save_one_text(void) sync_state = sync_error; return; } + + offset = ftell(file_b); /* Make sure that the entire file resides + on disk. This test seems to be necessary. + The data file has been corrupted at least + once. */ + + if (offset == -1) + { + log ("save_one_text(): ftell returned -1.\n"); + sync_state = sync_error; + return; + } rewind(file_b); if ( ferror(file_b) != 0 ) @@ -1560,6 +1574,7 @@ save_one_text(void) } fprintf(file_b, "CLEAN"); + if ( ferror(file_b) != 0 ) { log ("save_one_text(): fprintf(CLEAN) failed.\n"); @@ -1567,6 +1582,20 @@ save_one_text(void) return; } + if (fflush(file_b) != 0) + { + log ("save_one_text(): fflush failed.\n"); + sync_state = sync_error; + return; + } + + if ( ferror(file_b) != 0 ) + { + log ("save_one_text(): ferror after fflush failed.\n"); + sync_state = sync_error; + return; + } + if ( fclose(file_b) != 0 ) { file_b = NULL; @@ -1578,6 +1607,32 @@ save_one_text(void) return; } + file_b = fopen(datafilename, "rb"); + if (file_b == NULL) + { + log("save_one_text(): failed to reopen file.\n"); + remove (datafilename); + sync_state = sync_wait; + return; + } + + if (fseek(file_b, 0, SEEK_END) != 0) + { + log("save_one_text(): fseek failed.\n"); + sync_state = sync_error; + return; + } + + offset2 = ftell (file_b); + if ( offset2 != offset ) + { + log ("save_one_text(): ftell returns different offsets" + "(%l and %l).\n", offset, offset2); + sync_state = sync_error; + return; + } + + fclose (file_b); file_b = NULL; sync_state = sync_ready;