aboutsummaryrefslogtreecommitdiff
path: root/src/hello/gnunet-hello.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/hello/gnunet-hello.c')
-rw-r--r--src/hello/gnunet-hello.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/src/hello/gnunet-hello.c b/src/hello/gnunet-hello.c
new file mode 100644
index 0000000..bc35cdd
--- /dev/null
+++ b/src/hello/gnunet-hello.c
@@ -0,0 +1,204 @@
+/*
+ This file is part of GNUnet
+ (C) 2012 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 3, 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 hello/gnunet-hello.c
+ * @brief change HELLO files to never expire
+ * @author Christian Grothoff
+ */
+#include "platform.h"
+#include "gnunet_hello_lib.h"
+
+#define DEBUG GNUNET_EXTRA_LOGGING
+
+#define VERBOSE GNUNET_NO
+
+/**
+ * Closure for 'add_to_buf'.
+ */
+struct AddContext
+{
+ /**
+ * Where to add.
+ */
+ char *buf;
+
+ /**
+ * Maximum number of bytes left
+ */
+ size_t max;
+
+ /**
+ * Number of bytes added so far.
+ */
+ size_t ret;
+};
+
+
+/**
+ * Add the given address with infinit expiration to the buffer.
+ *
+ * @param cls closure
+ * @param address address to add
+ * @param expiration old expiration
+ * @return GNUNET_OK keep iterating
+ */
+static int
+add_to_buf (void *cls, const struct GNUNET_HELLO_Address *address,
+ struct GNUNET_TIME_Absolute expiration)
+{
+ struct AddContext *ac = cls;
+ size_t ret;
+
+ ret = GNUNET_HELLO_add_address (address,
+ GNUNET_TIME_UNIT_FOREVER_ABS,
+ ac->buf,
+ ac->max);
+ ac->buf += ret;
+ ac->max -= ret;
+ ac->ret += ret;
+ return GNUNET_OK;
+}
+
+
+/**
+ * Add addresses from the address list to the HELLO.
+ *
+ * @param cls the HELLO with the addresses to add
+ * @param max maximum space available
+ * @param buf where to add the addresses
+ * @return number of bytes added, 0 to terminate
+ */
+static size_t
+add_from_hello (void *cls, size_t max, void *buf)
+{
+ struct GNUNET_HELLO_Message **orig = cls;
+ struct AddContext ac;
+
+ if (NULL == *orig)
+ return 0; /* already done */
+ ac.buf = buf;
+ ac.max = max;
+ ac.ret = 0;
+ GNUNET_assert (NULL ==
+ GNUNET_HELLO_iterate_addresses (*orig,
+ GNUNET_NO, &add_to_buf,
+ &ac));
+ *orig = NULL;
+ return ac.ret;
+}
+
+
+int
+main (int argc, char *argv[])
+{
+ struct GNUNET_DISK_FileHandle *fh;
+ struct GNUNET_HELLO_Message *orig;
+ struct GNUNET_HELLO_Message *result;
+ struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pk;
+ uint64_t fsize;
+
+ GNUNET_log_setup ("gnunet-hello", "INFO", NULL);
+ if (argc != 2)
+ {
+ FPRINTF (stderr,
+ "%s",
+ _("Call with name of HELLO file to modify.\n"));
+ return 1;
+ }
+ if (GNUNET_OK != GNUNET_DISK_file_size (argv[1], &fsize, GNUNET_YES, GNUNET_YES))
+ {
+ FPRINTF (stderr,
+ _("Error accessing file `%s': %s\n"),
+ argv[1],
+ STRERROR (errno));
+ return 1;
+ }
+ if (fsize > 65536)
+ {
+ FPRINTF (stderr,
+ _("File `%s' is too big to be a HELLO\n"),
+ argv[1]);
+ return 1;
+ }
+ if (fsize < sizeof (struct GNUNET_MessageHeader))
+ {
+ FPRINTF (stderr,
+ _("File `%s' is too small to be a HELLO\n"),
+ argv[1]);
+ return 1;
+ }
+ fh = GNUNET_DISK_file_open (argv[1],
+ GNUNET_DISK_OPEN_READ,
+ GNUNET_DISK_PERM_USER_READ);
+ if (NULL == fh)
+ {
+ FPRINTF (stderr,
+ _("Error opening file `%s': %s\n"),
+ argv[1],
+ STRERROR (errno));
+ return 1;
+ }
+ {
+ char buf[fsize] GNUNET_ALIGN;
+
+ GNUNET_assert (fsize ==
+ GNUNET_DISK_file_read (fh, buf, fsize));
+ GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fh));
+ orig = (struct GNUNET_HELLO_Message *) buf;
+ if ( (fsize != GNUNET_HELLO_size (orig)) ||
+ (GNUNET_OK != GNUNET_HELLO_get_key (orig, &pk)) )
+ {
+ FPRINTF (stderr,
+ _("Did not find well-formed HELLO in file `%s'\n"),
+ argv[1]);
+ return 1;
+ }
+ result = GNUNET_HELLO_create (&pk, &add_from_hello, &orig);
+ GNUNET_assert (NULL != result);
+ fh = GNUNET_DISK_file_open (argv[1],
+ GNUNET_DISK_OPEN_WRITE,
+ GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE);
+ if (NULL == fh)
+ {
+ FPRINTF (stderr,
+ _("Error opening file `%s': %s\n"),
+ argv[1],
+ STRERROR (errno));
+ GNUNET_free (result);
+ return 1;
+ }
+ fsize = GNUNET_HELLO_size (result);
+ if (fsize != GNUNET_DISK_file_write (fh,
+ result,
+ fsize))
+ {
+ FPRINTF (stderr,
+ _("Error writing HELLO to file `%s': %s\n"),
+ argv[1],
+ STRERROR (errno));
+ (void) GNUNET_DISK_file_close (fh);
+ return 1;
+ }
+ GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fh));
+ }
+ return 0;
+}
+
+/* end of gnunet-hello.c */