From 336c0983364b2899e0f12c97d1eb1820656e7ea3 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 17 Dec 2011 18:29:09 +0000 Subject: -even better error handling --- src/util/container_bloomfilter.c | 60 ++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/src/util/container_bloomfilter.c b/src/util/container_bloomfilter.c index d44c33b0c..7be082f17 100644 --- a/src/util/container_bloomfilter.c +++ b/src/util/container_bloomfilter.c @@ -478,9 +478,43 @@ GNUNET_CONTAINER_bloomfilter_load (const char *filename, size_t size, GNUNET_DISK_OPEN_READWRITE, GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE); - if (NULL == bf->fh) + if (NULL != bf->fh) { - /* file did not exist, don't read */ + /* file existed, try to read it! */ + must_read = GNUNET_YES; + if (GNUNET_OK != + GNUNET_DISK_file_handle_size (bf->fh, &fsize)) + { + GNUNET_DISK_file_close (bf->fh); + GNUNET_free (bf); + return NULL; + } + if (fsize == 0) + { + /* found existing empty file, just overwrite */ + if (GNUNET_OK != make_empty_file (bf->fh, size * 4LL)) + { + GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, + "write"); + GNUNET_DISK_file_close (bf->fh); + GNUNET_free (bf); + return NULL; + } + } + else if (fsize != size * 4LL) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Size of file on disk is incorrect for this Bloom filter (want %llu, have %llu)\n"), + (unsigned long long) (size * 4LL), + (unsigned long long) fsize); + GNUNET_DISK_file_close (bf->fh); + GNUNET_free (bf); + return NULL; + } + } + else + { + /* file did not exist, don't read, just create */ must_read = GNUNET_NO; bf->fh = GNUNET_DISK_file_open (filename, @@ -502,28 +536,6 @@ GNUNET_CONTAINER_bloomfilter_load (const char *filename, size_t size, return NULL; } } - else - { - /* file existed, try to read it! */ - must_read = GNUNET_YES; - if (GNUNET_OK != - GNUNET_DISK_file_handle_size (bf->fh, &fsize)) - { - GNUNET_DISK_file_close (bf->fh); - GNUNET_free (bf); - return NULL; - } - if (fsize != size * 4LL) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Size of file on disk is incorrect for this Bloom filter (want %llu, have %llu)\n"), - (unsigned long long) (size * 4LL), - (unsigned long long) fsize); - GNUNET_DISK_file_close (bf->fh); - GNUNET_free (bf); - return NULL; - } - } bf->filename = GNUNET_strdup (filename); /* Alloc block */ bf->bitArray = GNUNET_malloc_large (size); -- cgit v1.2.3