⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecrstest.c

📁 GNUnet是一个安全的点对点网络框架
💻 C
字号:
/*     This file is part of GNUnet.     (C) 2004, 2005, 2006 Christian Grothoff (and other contributing authors)     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     option) any later version.     GNUnet is distributed in the hope that it will be useful, but     WITHOUT ANY WARRANTY; without even the implied warranty of     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     General Public License for more details.     You should have received a copy of the GNU General Public License     along with GNUnet; see the file COPYING.  If not, write to the     Free Software Foundation, Inc., 59 Temple Place - Suite 330,     Boston, MA 02111-1307, USA.*//** * @file applications/fs/ecrs/ecrstest.c * @brief testcase for ecrs (upload-download) * @author Christian Grothoff */#include "platform.h"#include "gnunet_util.h"#include "gnunet_ecrs_lib.h"#include "fs.h"#include "tree.h"#define START_DAEMON 1#define CHECK(a) if (!(a)) { ok = GNUNET_NO; GNUNET_GE_BREAK(NULL, 0); goto FAILURE; }static inttestTerminate (void *unused){  return GNUNET_OK;}static inttestTerminateNC (void *ptr){  void **p = ptr;  if (NULL == (*p))    return GNUNET_OK;  return GNUNET_SYSERR;}static struct GNUNET_GC_Configuration *cfg;static struct GNUNET_ECRS_URI *want;static char *makeName (unsigned int i){  char *fn;  fn = GNUNET_malloc (strlen ("/tmp/gnunet-ecrstest/ECRSTEST") + 14);  GNUNET_snprintf (fn,                   strlen ("/tmp/gnunet-ecrstest/ECRSTEST") + 14,                   "/tmp/gnunet-ecrstest/ECRSTEST%u", i);  GNUNET_disk_directory_create_for_file (NULL, fn);  return fn;}static struct GNUNET_ECRS_URI *uploadFile (unsigned int size){  int ret;  char *name;  int fd;  char *buf;  struct GNUNET_ECRS_URI *uri;  int i;  name = makeName (size);  fd =    GNUNET_disk_file_open (NULL, name, O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR);  if (fd == -1)    {      GNUNET_free (name);      return NULL;    }  buf = GNUNET_malloc (size);  memset (buf, size + size / 253, size);  for (i = 0; i < (int) (size - 42 - 2 * sizeof (GNUNET_HashCode));       i += sizeof (GNUNET_HashCode))    GNUNET_hash (&buf[i], 42,                 (GNUNET_HashCode *) & buf[i + sizeof (GNUNET_HashCode)]);  WRITE (fd, buf, size);  GNUNET_free (buf);  CLOSE (fd);  ret = GNUNET_ECRS_file_upload (NULL, cfg, name, GNUNET_YES,   /* index */                                 0,     /* anon */                                 0,     /* priority */                                 GNUNET_get_time () + 10 * GNUNET_CRON_MINUTES, /* expire */                                 NULL,  /* progress */                                 NULL, &testTerminate, NULL, &uri);  if (ret != GNUNET_SYSERR)    {      struct GNUNET_MetaData *meta;      struct GNUNET_ECRS_URI *key;      meta = GNUNET_meta_data_create ();      key = GNUNET_ECRS_keyword_string_to_uri (NULL, name);      ret = GNUNET_ECRS_publish_under_keyword (NULL, cfg, key, 0, 0, GNUNET_get_time () + 10 * GNUNET_CRON_MINUTES,     /* expire */                                               uri, meta);      GNUNET_meta_data_destroy (meta);      want = uri;      GNUNET_free (name);      if (ret == GNUNET_OK)        {          return key;        }      else        {          GNUNET_ECRS_uri_destroy (key);          return NULL;        }    }  else    {      GNUNET_free (name);      return NULL;    }}static intsearchCB (const GNUNET_ECRS_FileInfo * fi,          const GNUNET_HashCode * key, int isRoot, void *closure){  struct GNUNET_ECRS_URI **my = closure;  char *tmp;  if (!GNUNET_ECRS_uri_test_equal (want, fi->uri))    return GNUNET_OK;  tmp = GNUNET_ECRS_uri_to_string (fi->uri);  GNUNET_GE_LOG (NULL,                 GNUNET_GE_DEBUG | GNUNET_GE_REQUEST | GNUNET_GE_USER,                 "Search found URI `%s'\n", tmp);  GNUNET_free (tmp);  GNUNET_GE_ASSERT (NULL, NULL == *my);  *my = want;  return GNUNET_SYSERR;         /* abort search */}/** * @param *uri In: keyword URI, out: file URI * @return GNUNET_OK on success */static intsearchFile (struct GNUNET_ECRS_URI **uri){  int ret;  struct GNUNET_ECRS_URI *myURI;  myURI = NULL;  ret = GNUNET_ECRS_search (NULL,                            cfg,                            *uri, 0, &searchCB, &myURI, &testTerminateNC,                            &myURI);  GNUNET_ECRS_uri_destroy (*uri);  *uri = myURI;  if ((ret != GNUNET_SYSERR) && (myURI != NULL))    return GNUNET_OK;  else    return GNUNET_SYSERR;}static intdownloadFile (unsigned int size, const struct GNUNET_ECRS_URI *uri){  int ret;  char *tmpName;  int fd;  char *buf;  char *in;  int i;  char *tmp;  tmp = GNUNET_ECRS_uri_to_string (uri);  GNUNET_GE_LOG (NULL,                 GNUNET_GE_DEBUG | GNUNET_GE_REQUEST | GNUNET_GE_USER,                 "Starting download of `%s'\n", tmp);  GNUNET_free (tmp);  tmpName = makeName (0);  ret = GNUNET_SYSERR;  if (GNUNET_OK == GNUNET_ECRS_file_download (NULL,                                              cfg,                                              uri,                                              tmpName, 0, NULL, NULL,                                              &testTerminate, NULL))    {      fd = GNUNET_disk_file_open (NULL, tmpName, O_RDONLY);      if (fd == -1)        {          GNUNET_free (tmpName);          return GNUNET_SYSERR;        }      buf = GNUNET_malloc (size);      in = GNUNET_malloc (size);      memset (buf, size + size / 253, size);      for (i = 0; i < (int) (size - 42 - 2 * sizeof (GNUNET_HashCode));           i += sizeof (GNUNET_HashCode))        GNUNET_hash (&buf[i], 42,                     (GNUNET_HashCode *) & buf[i + sizeof (GNUNET_HashCode)]);      if (size != READ (fd, in, size))        {          GNUNET_GE_BREAK (NULL, 0);          ret = GNUNET_SYSERR;        }      else if (0 == memcmp (buf, in, size))        ret = GNUNET_OK;      GNUNET_free (buf);      GNUNET_free (in);      CLOSE (fd);    }  else    {      fprintf (stderr, "? ");    }  UNLINK (tmpName);  GNUNET_free (tmpName);  return ret;}static intunindexFile (unsigned int size){  int ret;  char *name;  name = makeName (size);  ret =    GNUNET_ECRS_file_unindex (NULL, cfg, name, NULL, NULL, &testTerminate,                              NULL);  if (0 != UNLINK (name))    ret = GNUNET_SYSERR;  GNUNET_free (name);  return ret;}intmain (int argc, char *argv[]){  static unsigned int filesizes[] = {    GNUNET_ECRS_DBLOCK_SIZE - 1,    GNUNET_ECRS_DBLOCK_SIZE,    GNUNET_ECRS_DBLOCK_SIZE + 1,    GNUNET_ECRS_DBLOCK_SIZE * GNUNET_ECRS_CHK_PER_INODE - 1,    GNUNET_ECRS_DBLOCK_SIZE * GNUNET_ECRS_CHK_PER_INODE,    GNUNET_ECRS_DBLOCK_SIZE * GNUNET_ECRS_CHK_PER_INODE + 1,    1,    2,    4,    16,    32,    1024,    0  };#if START_DAEMON  pid_t daemon;#endif  int ok;  struct GNUNET_ClientServerConnection *sock = NULL;  struct GNUNET_ECRS_URI *uri;  int i;  cfg = GNUNET_GC_create ();  if (-1 == GNUNET_GC_parse_configuration (cfg, "check.conf"))    {      GNUNET_GC_free (cfg);      return -1;    }#if START_DAEMON  daemon = GNUNET_daemon_start (NULL, cfg, "peer.conf", GNUNET_NO);  GNUNET_GE_ASSERT (NULL, daemon > 0);  CHECK (GNUNET_OK ==         GNUNET_wait_for_daemon_running (NULL, cfg,                                         30 * GNUNET_CRON_SECONDS));  GNUNET_thread_sleep (5 * GNUNET_CRON_SECONDS);        /* give apps time to start */#endif  ok = GNUNET_YES;  sock = GNUNET_client_connection_create (NULL, cfg);  CHECK (sock != NULL);  /* ACTUAL TEST CODE */  i = 0;  while (filesizes[i] != 0)    {      fprintf (stderr, "Testing filesize %u ", filesizes[i]);      uri = uploadFile (filesizes[i]);      CHECK (NULL != uri);      CHECK (GNUNET_OK == searchFile (&uri));      CHECK (GNUNET_OK == downloadFile (filesizes[i], uri));      GNUNET_ECRS_uri_destroy (uri);      CHECK (GNUNET_OK == unindexFile (filesizes[i]));      fprintf (stderr, "Ok.\n");      i++;    }  /* END OF TEST CODE */FAILURE:  if (sock != NULL)    GNUNET_client_connection_destroy (sock);#if START_DAEMON  GNUNET_GE_ASSERT (NULL, GNUNET_OK == GNUNET_daemon_stop (NULL, daemon));#endif  GNUNET_GC_free (cfg);  return (ok == GNUNET_YES) ? 0 : 1;}/* end of ecrstest.c */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -