* @return GNUNET_OK if created ok, GNUNET_SYSERR otherwise
*/
static int
-makeEmptyFile (const struct GNUNET_DISK_FileHandle *fh, size_t size)
+make_empty_file (const struct GNUNET_DISK_FileHandle *fh, size_t size)
{
- char *buffer;
+ char buffer[BUFFSIZE];
size_t bytesleft = size;
int res = 0;
if (GNUNET_DISK_handle_invalid (fh))
return GNUNET_SYSERR;
- buffer = GNUNET_malloc (BUFFSIZE);
- memset (buffer, 0, BUFFSIZE);
+ memset (buffer, 0, sizeof (buffer));
GNUNET_DISK_file_seek (fh, 0, GNUNET_DISK_SEEK_SET);
-
while (bytesleft > 0)
{
- if (bytesleft > BUFFSIZE)
+ if (bytesleft > sizeof (buffer))
{
- res = GNUNET_DISK_file_write (fh, buffer, BUFFSIZE);
- bytesleft -= BUFFSIZE;
+ res = GNUNET_DISK_file_write (fh, buffer, sizeof (buffer));
+ if (res >= 0)
+ bytesleft -= res;
}
else
{
res = GNUNET_DISK_file_write (fh, buffer, bytesleft);
- bytesleft = 0;
+ if (res >= 0)
+ bytesleft -= res;
}
- GNUNET_assert (res != GNUNET_SYSERR);
+ if (GNUNET_SYSERR == res)
+ return GNUNET_SYSERR;
}
- GNUNET_free (buffer);
return GNUNET_OK;
}
bf = GNUNET_malloc (sizeof (struct GNUNET_CONTAINER_BloomFilter));
/* Try to open a bloomfilter file */
- bf->fh =
+ if (GNUNET_YES == GNUNET_DISK_file_test (filename))
+ bf->fh =
GNUNET_DISK_file_open (filename,
GNUNET_DISK_OPEN_READWRITE,
GNUNET_DISK_PERM_USER_READ |
GNUNET_free (bf);
return NULL;
}
+ 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
{
GNUNET_free (bf);
return NULL;
}
- if (fsize != size * 8LL)
+ if (fsize != size * 4LL)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _("Size of file on disk is incorrect for this Bloom filter\n"));
+ _("Size of file on disk is incorrect for this Bloom filter (want %llu, have %llu)\n"),
+ (unsigned long long) fsize,
+ (unsigned long long) (size * 4LL));
GNUNET_DISK_file_close (bf->fh);
GNUNET_free (bf);
return NULL;
bf->addressesPerElement = k;
memset (bf->bitArray, 0, bf->bitArraySize);
- if (GNUNET_YES != must_read)
- return bf; /* already done! */
+ if (GNUNET_YES != must_read)
+ return bf; /* already done! */
/* Read from the file what bits we can */
rbuff = GNUNET_malloc (BUFFSIZE);
pos = 0;
memset (bf->bitArray, 0, bf->bitArraySize);
if (bf->filename != NULL)
- makeEmptyFile (bf->fh, bf->bitArraySize * 4);
+ make_empty_file (bf->fh, bf->bitArraySize * 4LL);
}
bf->bitArray = GNUNET_malloc (size);
memset (bf->bitArray, 0, bf->bitArraySize);
if (bf->filename != NULL)
- makeEmptyFile (bf->fh, bf->bitArraySize * 4);
+ make_empty_file (bf->fh, bf->bitArraySize * 4LL);
while (GNUNET_YES == iterator (iterator_cls, &hc))
GNUNET_CONTAINER_bloomfilter_add (bf, &hc);
}