#include "gnunet_bio_lib.h"
#include "gnunet_disk_lib.h"
+#define LOG(kind,...) GNUNET_log_from (kind, "util",__VA_ARGS__)
+
#define BIO_BUFFER_SIZE 65536
#define MAX_META_DATA (1024 * 1024)
* @return GNUNET_OK on success, GNUNET_SYSERR on failure
*/
int
-GNUNET_BIO_read (struct GNUNET_BIO_ReadHandle *h,
- const char *what, void *result, size_t len)
+GNUNET_BIO_read (struct GNUNET_BIO_ReadHandle *h, const char *what,
+ void *result, size_t len)
{
char *dst = result;
size_t min;
ret = GNUNET_DISK_file_read (h->fd, h->buffer, h->size);
if (ret == -1)
{
- GNUNET_asprintf (&h->emsg,
- _("Error reading `%s': %s"), what, STRERROR (errno));
+ GNUNET_asprintf (&h->emsg, _("Error reading `%s': %s"), what,
+ STRERROR (errno));
return GNUNET_SYSERR;
}
if (ret == 0)
{
- GNUNET_asprintf (&h->emsg,
- _("Error reading `%s': %s"), what, _("End of file"));
+ GNUNET_asprintf (&h->emsg, _("Error reading `%s': %s"), what,
+ _("End of file"));
return GNUNET_SYSERR;
}
h->pos = 0;
* @return GNUNET_OK on success, GNUNET_SYSERR on failure
*/
int
-GNUNET_BIO_read_fn (struct GNUNET_BIO_ReadHandle *h,
- const char *file, int line, void *result, size_t len)
+GNUNET_BIO_read_fn (struct GNUNET_BIO_ReadHandle *h, const char *file, int line,
+ void *result, size_t len)
{
char what[1024];
* @return GNUNET_OK on success, GNUNET_SYSERR on failure
*/
int
-GNUNET_BIO_read_string (struct GNUNET_BIO_ReadHandle *h,
- const char *what, char **result, size_t maxLen)
+GNUNET_BIO_read_string (struct GNUNET_BIO_ReadHandle *h, const char *what,
+ char **result, size_t maxLen)
{
char *buf;
uint32_t big;
}
if (big > maxLen)
{
- GNUNET_asprintf (&h->emsg,
- _("String `%s' longer than allowed (%u > %u)"),
+ GNUNET_asprintf (&h->emsg, _("String `%s' longer than allowed (%u > %u)"),
what, big, maxLen);
return GNUNET_SYSERR;
}
* @return GNUNET_OK on success, GNUNET_SYSERR on failure
*/
int
-GNUNET_BIO_read_meta_data (struct GNUNET_BIO_ReadHandle *h,
- const char *what,
+GNUNET_BIO_read_meta_data (struct GNUNET_BIO_ReadHandle *h, const char *what,
struct GNUNET_CONTAINER_MetaData **result)
{
uint32_t size;
* @return GNUNET_OK on success, GNUNET_SYSERR on error
*/
int
-GNUNET_BIO_read_int32__ (struct GNUNET_BIO_ReadHandle *h,
- const char *file, int line, int32_t * i)
+GNUNET_BIO_read_int32__ (struct GNUNET_BIO_ReadHandle *h, const char *file,
+ int line, int32_t * i)
{
int32_t big;
* @return GNUNET_OK on success, GNUNET_SYSERR on error
*/
int
-GNUNET_BIO_read_int64__ (struct GNUNET_BIO_ReadHandle *h,
- const char *file, int line, int64_t * i)
+GNUNET_BIO_read_int64__ (struct GNUNET_BIO_ReadHandle *h, const char *file,
+ int line, int64_t * i)
{
int64_t big;
struct GNUNET_BIO_WriteHandle *h;
fd = GNUNET_DISK_file_open (fn,
- GNUNET_DISK_OPEN_WRITE |
- GNUNET_DISK_OPEN_TRUNCATE |
- GNUNET_DISK_OPEN_CREATE,
+ GNUNET_DISK_OPEN_WRITE | GNUNET_DISK_OPEN_TRUNCATE
+ | GNUNET_DISK_OPEN_CREATE,
GNUNET_DISK_PERM_USER_READ |
GNUNET_DISK_PERM_USER_WRITE);
if (NULL == fd)
h->buffer = (char *) &h[1];
h->size = BIO_BUFFER_SIZE;
h->fd = fd;
-
return h;
}
int
GNUNET_BIO_write_close (struct GNUNET_BIO_WriteHandle *h)
{
- ssize_t wrt;
int ret;
- if (NULL == h->fd)
- {
- ret = GNUNET_SYSERR;
- }
- else
- {
- wrt = GNUNET_DISK_file_write (h->fd, h->buffer, h->have);
- if (wrt == h->have)
- ret = GNUNET_OK;
- else
- ret = GNUNET_SYSERR;
+ ret = GNUNET_SYSERR;
+ if ( (NULL != h->fd) && (GNUNET_OK == (ret = GNUNET_BIO_flush (h))) )
GNUNET_DISK_file_close (h->fd);
- }
GNUNET_free (h);
return ret;
}
+/**
+ * Force a buffered writer to flush its buffer
+ *
+ * @param h the writer handle
+ * @return GNUNET_OK upon success. Upon failure GNUNET_SYSERR is returned and
+ * the file is closed
+ */
+int
+GNUNET_BIO_flush (struct GNUNET_BIO_WriteHandle *h)
+{
+ ssize_t ret;
+
+ ret = GNUNET_DISK_file_write (h->fd, h->buffer, h->have);
+ if (ret != h->have)
+ {
+ GNUNET_DISK_file_close (h->fd);
+ h->fd = NULL;
+ return GNUNET_SYSERR; /* error */
+ }
+ h->have = 0;
+ return GNUNET_OK;
+}
+
+
/**
* Write a buffer to a file.
*
* @return GNUNET_OK on success, GNUNET_SYSERR on error
*/
int
-GNUNET_BIO_write (struct GNUNET_BIO_WriteHandle *h,
- const void *buffer, size_t n)
+GNUNET_BIO_write (struct GNUNET_BIO_WriteHandle *h, const void *buffer,
+ size_t n)
{
const char *src = buffer;
size_t min;
size_t pos;
- ssize_t ret;
if (NULL == h->fd)
return GNUNET_SYSERR;
if (pos == n)
return GNUNET_OK; /* done */
GNUNET_assert (h->have == h->size);
- ret = GNUNET_DISK_file_write (h->fd, h->buffer, h->size);
- if (ret != h->size)
- {
- GNUNET_DISK_file_close (h->fd);
- h->fd = NULL;
+ if (GNUNET_OK != GNUNET_BIO_flush (h))
return GNUNET_SYSERR; /* error */
- }
- h->have = 0;
}
while (pos < n); /* should always be true */
GNUNET_break (0);
if (m == NULL)
return GNUNET_BIO_write_int32 (h, 0);
buf = NULL;
- size = GNUNET_CONTAINER_meta_data_serialize (m,
- &buf,
- MAX_META_DATA,
- GNUNET_CONTAINER_META_DATA_SERIALIZE_PART);
+ size =
+ GNUNET_CONTAINER_meta_data_serialize (m, &buf, MAX_META_DATA,
+ GNUNET_CONTAINER_META_DATA_SERIALIZE_PART);
if (size == -1)
{
GNUNET_free (buf);
* Write an (u)int32_t.
*
* @param h hande to open file
- * @param i address of 32-bit integer to write
+ * @param i 32-bit integer to write
* @return GNUNET_OK on success, GNUNET_SYSERR on error
*/
int
* Write an (u)int64_t.
*
* @param h hande to open file
- * @param i address of 64-bit integer to write
+ * @param i 64-bit integer to write
* @return GNUNET_OK on success, GNUNET_SYSERR on error
*/
int