aboutsummaryrefslogtreecommitdiff
path: root/src/hello/gnunet-hello.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2012-03-13 14:24:35 +0000
committerChristian Grothoff <christian@grothoff.org>2012-03-13 14:24:35 +0000
commit1bf2b49b14f9058cd2d4223752c74ef59bbf3435 (patch)
tree04c9022fd2160f3ca33eba7013f9df0b5c365f69 /src/hello/gnunet-hello.c
parentc8e04709c3941b832261c4eff9dbee058a46c841 (diff)
downloadgnunet-1bf2b49b14f9058cd2d4223752c74ef59bbf3435.tar.gz
gnunet-1bf2b49b14f9058cd2d4223752c74ef59bbf3435.zip
-adding gnunet-hello tool to bump expiration times
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 000000000..be7719e94
--- /dev/null
+++ b/src/hello/gnunet-hello.c
@@ -0,0 +1,204 @@
1/*
2 This file is part of GNUnet
3 (C) 2012 Christian Grothoff (and other contributing authors)
4
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.
19*/
20/**
21 * @file hello/gnunet-hello.c
22 * @brief change HELLO files to never expire
23 * @author Christian Grothoff
24 */
25#include "platform.h"
26#include "gnunet_hello_lib.h"
27
28#define DEBUG GNUNET_EXTRA_LOGGING
29
30#define VERBOSE GNUNET_NO
31
32/**
33 * Closure for 'add_to_buf'.
34 */
35struct AddContext
36{
37 /**
38 * Where to add.
39 */
40 char *buf;
41
42 /**
43 * Maximum number of bytes left
44 */
45 size_t max;
46
47 /**
48 * Number of bytes added so far.
49 */
50 size_t ret;
51};
52
53
54/**
55 * Add the given address with infinit expiration to the buffer.
56 *
57 * @param ac add context
58 * @param address address to add
59 * @param expiration old expiration
60 * @return GNUNET_OK keep iterating
61 */
62static int
63add_to_buf (void *cls, const struct GNUNET_HELLO_Address *address,
64 struct GNUNET_TIME_Absolute expiration)
65{
66 struct AddContext *ac = cls;
67 size_t ret;
68
69 ret = GNUNET_HELLO_add_address (address,
70 GNUNET_TIME_UNIT_FOREVER_ABS,
71 ac->buf,
72 ac->max);
73 ac->buf += ret;
74 ac->max -= ret;
75 ac->ret += ret;
76 return GNUNET_OK;
77}
78
79
80/**
81 * Add addresses from the address list to the HELLO.
82 *
83 * @param cls the HELLO with the addresses to add
84 * @param max maximum space available
85 * @param buf where to add the addresses
86 * @return number of bytes added, 0 to terminate
87 */
88static size_t
89add_from_hello (void *cls, size_t max, void *buf)
90{
91 struct GNUNET_HELLO_Message **orig = cls;
92 struct AddContext ac;
93
94 if (NULL == *orig)
95 return 0; /* already done */
96 ac.buf = buf;
97 ac.max = max;
98 ac.ret = 0;
99 GNUNET_assert (NULL ==
100 GNUNET_HELLO_iterate_addresses (*orig,
101 GNUNET_NO, &add_to_buf,
102 &ac));
103 *orig = NULL;
104 return ac.ret;
105}
106
107
108int
109main (int argc, char *argv[])
110{
111 struct GNUNET_DISK_FileHandle *fh;
112 struct GNUNET_HELLO_Message *orig;
113 struct GNUNET_HELLO_Message *result;
114 struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pk;
115 uint64_t fsize;
116
117 GNUNET_log_setup ("gnunet-hello", "INFO", NULL);
118 if (argc != 2)
119 {
120 FPRINTF (stderr,
121 "%s",
122 _("Call with name of HELLO file to modify.\n"));
123 return 1;
124 }
125 if (GNUNET_OK != GNUNET_DISK_file_size (argv[1], &fsize, GNUNET_YES))
126 {
127 FPRINTF (stderr,
128 _("Error accessing file `%s': %s\n"),
129 argv[1],
130 STRERROR (errno));
131 return 1;
132 }
133 if (fsize > 65536)
134 {
135 FPRINTF (stderr,
136 _("File `%s' is too big to be a HELLO\n"),
137 argv[1]);
138 return 1;
139 }
140 if (fsize < sizeof (struct GNUNET_MessageHeader))
141 {
142 FPRINTF (stderr,
143 _("File `%s' is too small to be a HELLO\n"),
144 argv[1]);
145 return 1;
146 }
147 fh = GNUNET_DISK_file_open (argv[1],
148 GNUNET_DISK_OPEN_READ,
149 GNUNET_DISK_PERM_USER_READ);
150 if (NULL == fh)
151 {
152 FPRINTF (stderr,
153 _("Error opening file `%s': %s\n"),
154 argv[1],
155 STRERROR (errno));
156 return 1;
157 }
158 {
159 char buf[fsize];
160
161 GNUNET_assert (fsize ==
162 GNUNET_DISK_file_read (fh, buf, fsize));
163 GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fh));
164 orig = (struct GNUNET_HELLO_Message *) buf;
165 if ( (fsize != GNUNET_HELLO_size (orig)) ||
166 (GNUNET_OK != GNUNET_HELLO_get_key (orig, &pk)) )
167 {
168 FPRINTF (stderr,
169 _("Did not find well-formed HELLO in file `%s'\n"),
170 argv[1]);
171 return 1;
172 }
173 result = GNUNET_HELLO_create (&pk, &add_from_hello, &orig);
174 GNUNET_assert (NULL != result);
175 fh = GNUNET_DISK_file_open (argv[1],
176 GNUNET_DISK_OPEN_WRITE,
177 GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE);
178 if (NULL == fh)
179 {
180 FPRINTF (stderr,
181 _("Error opening file `%s': %s\n"),
182 argv[1],
183 STRERROR (errno));
184 GNUNET_free (result);
185 return 1;
186 }
187 fsize = GNUNET_HELLO_size (result);
188 if (fsize != GNUNET_DISK_file_write (fh,
189 result,
190 fsize))
191 {
192 FPRINTF (stderr,
193 _("Error writing HELLO to file `%s': %s\n"),
194 argv[1],
195 STRERROR (errno));
196 (void) GNUNET_DISK_file_close (fh);
197 return 1;
198 }
199 GNUNET_assert (GNUNET_OK == GNUNET_DISK_file_close (fh));
200 }
201 return 0;
202}
203
204/* end of gnunet-hello.c */