GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your
+ by the Free Software Foundation; either version 3, or (at your
option) any later version.
GNUnet is distributed in the hope that it will be useful, but
* @param offset offset of data in the directory
* @param dep function to call on each entry
* @param dep_cls closure for dep
+ * @return GNUNET_OK if this could be a block in a directory,
+ * GNUNET_NO if this could be part of a directory (but not 100% OK)
+ * GNUNET_SYSERR if 'data' does not represent a directory
*/
-void
+int
GNUNET_FS_directory_list_contents (size_t size,
const void *data,
uint64_t offset,
struct GNUNET_CONTAINER_MetaData *md;
char *filename;
+ if ( (offset == 0) &&
+ ( (size < 8 + sizeof (uint32_t)) ||
+ (0 != memcmp (cdata, GNUNET_FS_DIRECTORY_MAGIC, 8)) ) )
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+ _("MAGIC mismatch. This is not a GNUnet directory.\n"));
+ return GNUNET_SYSERR;
+ }
pos = offset;
- if ( (pos == 0) &&
- (size >= 8 + sizeof (uint32_t)) &&
- (0 == memcmp (cdata, GNUNET_FS_DIRECTORY_MAGIC, 8)) )
+ if (offset == 0)
{
memcpy (&mdSize, &cdata[8], sizeof (uint32_t));
mdSize = ntohl (mdSize);
{
/* invalid size */
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
- _("Not a GNUnet directory.\n"));
- return;
+ _("MAGIC mismatch. This is not a GNUnet directory.\n"));
+ return GNUNET_SYSERR;
}
md = GNUNET_CONTAINER_meta_data_deserialize (&cdata[8 +
sizeof (uint32_t)],
mdSize);
if (md == NULL)
{
- GNUNET_break (0);
- return; /* malformed ! */
+ GNUNET_break (0);
+ return GNUNET_SYSERR; /* malformed ! */
}
dep (dep_cls,
NULL,
while ((epos < size) && (cdata[epos] != '\0'))
epos++;
if (epos >= size)
- return; /* malformed - or partial download */
+ return GNUNET_NO; /* malformed - or partial download */
uri = GNUNET_FS_uri_parse (&cdata[pos], &emsg);
pos = epos + 1;
{
GNUNET_FS_uri_destroy (uri);
GNUNET_break (0);
- return; /* illegal in directory! */
+ return GNUNET_NO; /* illegal in directory! */
}
memcpy (&mdSize, &cdata[pos], sizeof (uint32_t));
if (pos + mdSize > size)
{
GNUNET_FS_uri_destroy (uri);
- return; /* malformed - or partial download */
+ return GNUNET_NO; /* malformed - or partial download */
}
md = GNUNET_CONTAINER_meta_data_deserialize (&cdata[pos], mdSize);
{
GNUNET_FS_uri_destroy (uri);
GNUNET_break (0);
- return; /* malformed ! */
+ return GNUNET_NO; /* malformed ! */
}
pos += mdSize;
filename = GNUNET_CONTAINER_meta_data_get_by_type (md,
GNUNET_CONTAINER_meta_data_destroy (md);
GNUNET_FS_uri_destroy (uri);
}
+ return GNUNET_OK;
}
/**