[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r20751 - gnunet/src/fs
From: |
gnunet |
Subject: |
[GNUnet-SVN] r20751 - gnunet/src/fs |
Date: |
Sat, 24 Mar 2012 20:13:25 +0100 |
Author: grothoff
Date: 2012-03-24 20:13:25 +0100 (Sat, 24 Mar 2012)
New Revision: 20751
Modified:
gnunet/src/fs/fs_api.c
gnunet/src/fs/fs_publish.c
gnunet/src/fs/fs_tree.c
Log:
fixing issue with gnunet-publish not closing files early enough when publishing
directories with more than FD_MAX files (#2239)
Modified: gnunet/src/fs/fs_api.c
===================================================================
--- gnunet/src/fs/fs_api.c 2012-03-24 18:54:40 UTC (rev 20750)
+++ gnunet/src/fs/fs_api.c 2012-03-24 19:13:25 UTC (rev 20751)
@@ -291,7 +291,11 @@
* @param cls closure (points to the file information)
* @param offset offset to read from; it is possible
* that the caller might need to go backwards
- * a bit at times
+ * a bit at times; set to UINT64_MAX to tell
+ * the reader that we won't be reading for a while
+ * (used to close the file descriptor but NOT fully
+ * clean up the reader's state); in this case,
+ * a value of '0' for max should be ignored
* @param max maximum number of bytes that should be
* copied to buf; readers are not allowed
* to provide less data unless there is an error;
@@ -308,20 +312,29 @@
struct FileInfo *fi = cls;
ssize_t ret;
- if (max == 0)
+ if (UINT64_MAX == offset)
{
- if (fi->fd != NULL)
+ if (NULL != fi->fd)
+ {
GNUNET_DISK_file_close (fi->fd);
+ fi->fd = NULL;
+ }
+ return 0;
+ }
+ if (0 == max)
+ {
+ if (NULL != fi->fd)
+ GNUNET_DISK_file_close (fi->fd);
GNUNET_free (fi->filename);
GNUNET_free (fi);
return 0;
}
- if (fi->fd == NULL)
+ if (NULL == fi->fd)
{
fi->fd =
GNUNET_DISK_file_open (fi->filename, GNUNET_DISK_OPEN_READ,
GNUNET_DISK_PERM_NONE);
- if (fi->fd == NULL)
+ if (NULL == fi->fd)
{
GNUNET_asprintf (emsg, _("Could not open file `%s': %s"), fi->filename,
STRERROR (errno));
@@ -330,7 +343,7 @@
}
GNUNET_DISK_file_seek (fi->fd, offset, GNUNET_DISK_SEEK_SET);
ret = GNUNET_DISK_file_read (fi->fd, buf, max);
- if (ret == -1)
+ if (-1 == ret)
{
GNUNET_asprintf (emsg, _("Could not read file `%s': %s"), fi->filename,
STRERROR (errno));
@@ -374,7 +387,11 @@
* @param cls closure (points to the buffer)
* @param offset offset to read from; it is possible
* that the caller might need to go backwards
- * a bit at times
+ * a bit at times; set to UINT64_MAX to tell
+ * the reader that we won't be reading for a while
+ * (used to close the file descriptor but NOT fully
+ * clean up the reader's state); in this case,
+ * a value of '0' for max should be ignored
* @param max maximum number of bytes that should be
* copied to buf; readers are not allowed
* to provide less data unless there is an error;
@@ -390,6 +407,8 @@
{
char *data = cls;
+ if (UINT64_MAX == offset)
+ return 0;
if (max == 0)
{
GNUNET_free_non_null (data);
Modified: gnunet/src/fs/fs_publish.c
===================================================================
--- gnunet/src/fs/fs_publish.c 2012-03-24 18:54:40 UTC (rev 20750)
+++ gnunet/src/fs/fs_publish.c 2012-03-24 19:13:25 UTC (rev 20751)
@@ -355,6 +355,8 @@
}
else
{
+ if (UINT64_MAX == offset)
+ return p->data.file.reader (p->data.file.reader_cls, offset, 0, NULL,
NULL);
pt_size = GNUNET_MIN (max, p->data.file.file_size - offset);
if (pt_size == 0)
return 0; /* calling reader with pt_size==0
Modified: gnunet/src/fs/fs_tree.c
===================================================================
--- gnunet/src/fs/fs_tree.c 2012-03-24 18:54:40 UTC (rev 20750)
+++ gnunet/src/fs/fs_tree.c 2012-03-24 19:13:25 UTC (rev 20751)
@@ -429,6 +429,7 @@
GNUNET_FS_tree_encoder_finish (struct GNUNET_FS_TreeEncoder *te,
struct GNUNET_FS_Uri **uri, char **emsg)
{
+ (void) te->reader (te->cls, UINT64_MAX, 0, 0, NULL);
GNUNET_assert (GNUNET_NO == te->in_next);
if (uri != NULL)
*uri = te->uri;
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r20751 - gnunet/src/fs,
gnunet <=