GNUnet  0.11.x
gnunet-hello.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet
3  Copyright (C) 2012 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your 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  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
25 #include "platform.h"
26 #include "gnunet_protocols.h"
27 #include "gnunet_hello_lib.h"
28 
32 struct AddContext
33 {
37  char *buf;
38 
42  size_t max;
43 
47  size_t ret;
48 };
49 
50 static int address_count;
51 
52 
61 static int
62 add_to_buf (void *cls,
63  const struct GNUNET_HELLO_Address *address,
65 {
66  struct AddContext *ac = cls;
67  size_t ret;
68 
69  ret = GNUNET_HELLO_add_address (address,
71  ac->buf,
72  ac->max);
73  ac->buf += ret;
74  ac->max -= ret;
75  ac->ret += ret;
76  address_count++;
77  return GNUNET_OK;
78 }
79 
80 
89 static ssize_t
90 add_from_hello (void *cls, size_t max, void *buf)
91 {
92  struct GNUNET_HELLO_Message **orig = cls;
93  struct AddContext ac;
94 
95  if (NULL == *orig)
96  return GNUNET_SYSERR; /* already done */
97  ac.buf = buf;
98  ac.max = max;
99  ac.ret = 0;
100  GNUNET_assert (
101  NULL ==
103  *orig = NULL;
104  return ac.ret;
105 }
106 
107 
108 int
109 main (int argc, char *argv[])
110 {
111  struct GNUNET_DISK_FileHandle *fh;
112  struct GNUNET_HELLO_Message *orig;
114  struct GNUNET_PeerIdentity pid;
115  uint64_t fsize;
116 
117  address_count = 0;
118 
119  GNUNET_log_setup ("gnunet-hello", "INFO", NULL);
120  if (argc != 2)
121  {
122  fprintf (stderr, "%s", _ ("Call with name of HELLO file to modify.\n"));
123  return 1;
124  }
125  if (GNUNET_OK !=
126  GNUNET_DISK_file_size (argv[1], &fsize, GNUNET_YES, GNUNET_YES))
127  {
128  fprintf (stderr,
129  _ ("Error accessing file `%s': %s\n"),
130  argv[1],
131  strerror (errno));
132  return 1;
133  }
134  if (fsize > 65536)
135  {
136  fprintf (stderr, _ ("File `%s' is too big to be a HELLO\n"), argv[1]);
137  return 1;
138  }
139  if (fsize < sizeof(struct GNUNET_MessageHeader))
140  {
141  fprintf (stderr, _ ("File `%s' is too small to be a HELLO\n"), argv[1]);
142  return 1;
143  }
144  fh = GNUNET_DISK_file_open (argv[1],
147  if (NULL == fh)
148  {
149  fprintf (stderr,
150  _ ("Error opening file `%s': %s\n"),
151  argv[1],
152  strerror (errno));
153  return 1;
154  }
155  {
156  char buf[fsize] GNUNET_ALIGN;
157 
158  GNUNET_assert (fsize == GNUNET_DISK_file_read (fh, buf, fsize));
160  orig = (struct GNUNET_HELLO_Message *) buf;
161  if ((fsize < GNUNET_HELLO_size (orig)) ||
162  (GNUNET_OK != GNUNET_HELLO_get_id (orig, &pid)))
163  {
164  fprintf (stderr,
165  _ ("Did not find well-formed HELLO in file `%s'\n"),
166  argv[1]);
167  return 1;
168  }
169  {
170  char *pids;
171 
173  fprintf (stdout, "Processing HELLO for peer `%s'\n", pids);
174  GNUNET_free (pids);
175  }
176  result = GNUNET_HELLO_create (&pid.public_key,
178  &orig,
180  GNUNET_assert (NULL != result);
181  fh =
182  GNUNET_DISK_file_open (argv[1],
186  if (NULL == fh)
187  {
188  fprintf (stderr,
189  _ ("Error opening file `%s': %s\n"),
190  argv[1],
191  strerror (errno));
192  GNUNET_free (result);
193  return 1;
194  }
195  fsize = GNUNET_HELLO_size (result);
196  if (fsize != GNUNET_DISK_file_write (fh, result, fsize))
197  {
198  fprintf (stderr,
199  _ ("Error writing HELLO to file `%s': %s\n"),
200  argv[1],
201  strerror (errno));
202  (void) GNUNET_DISK_file_close (fh);
203  return 1;
204  }
206  }
207  fprintf (stderr,
208  _ ("Modified %u addresses, wrote %u bytes\n"),
210  (unsigned int) fsize);
211  return 0;
212 }
213 
214 
215 /* end of gnunet-hello.c */
Open the file for reading.
int GNUNET_HELLO_get_id(const struct GNUNET_HELLO_Message *hello, struct GNUNET_PeerIdentity *peer)
Get the peer identity from a HELLO message.
Definition: hello.c:671
static ssize_t add_from_hello(void *cls, size_t max, void *buf)
Add addresses from the address list to the HELLO.
Definition: gnunet-hello.c:90
A HELLO message is used to exchange information about transports with other peers.
int GNUNET_DISK_file_close(struct GNUNET_DISK_FileHandle *h)
Close an open file.
Definition: disk.c:1345
struct GNUNET_HELLO_Message * GNUNET_HELLO_create(const struct GNUNET_CRYPTO_EddsaPublicKey *public_key, GNUNET_HELLO_GenerateAddressListCallback addrgen, void *addrgen_cls, int friend_only)
Construct a HELLO message given the public key, expiration time and an iterator that spews the transp...
Definition: hello.c:204
ssize_t GNUNET_DISK_file_read(const struct GNUNET_DISK_FileHandle *h, void *result, size_t len)
Read the contents of a binary file into a buffer.
Definition: disk.c:732
char * buf
Where to add.
Definition: gnunet-hello.c:37
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
size_t max
Maximum number of bytes left.
Definition: gnunet-hello.c:42
int main(int argc, char *argv[])
Definition: gnunet-hello.c:109
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_TIME_UNIT_FOREVER_ABS
Constant used to specify "forever".
static int add_to_buf(void *cls, const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration)
Add the given address with infinit expiration to the buffer.
Definition: gnunet-hello.c:62
#define _(String)
GNU gettext support macro.
Definition: platform.h:181
struct GNUNET_HELLO_Message * GNUNET_HELLO_iterate_addresses(const struct GNUNET_HELLO_Message *msg, int return_modified, GNUNET_HELLO_AddressIterator it, void *it_cls)
Iterate over all of the addresses in the HELLO.
Definition: hello.c:254
Truncate file if it exists.
char * GNUNET_CRYPTO_eddsa_public_key_to_string(const struct GNUNET_CRYPTO_EddsaPublicKey *pub)
Convert a public key to a string.
Definition: crypto_ecc.c:365
ssize_t GNUNET_DISK_file_write(const struct GNUNET_DISK_FileHandle *h, const void *buffer, size_t n)
Write a buffer to a file.
Definition: disk.c:820
static int result
Global testing status.
static int fh
Handle to the unique file.
static int address_count
Definition: gnunet-hello.c:50
static char * expiration
Credential TTL.
Definition: gnunet-abd.c:96
size_t GNUNET_HELLO_add_address(const struct GNUNET_HELLO_Address *address, struct GNUNET_TIME_Absolute expiration, char *target, size_t max)
Copy the given address information into the given buffer using the format of HELLOs.
Definition: hello.c:109
#define GNUNET_SYSERR
Definition: gnunet_common.h:76
Open the file for writing.
int GNUNET_HELLO_is_friend_only(const struct GNUNET_HELLO_Message *h)
Return HELLO type.
Definition: hello.c:89
static struct GNUNET_MQ_Envelope * ac
Handle to current GNUNET_PEERINFO_add_peer() operation.
int GNUNET_DISK_file_size(const char *filename, uint64_t *size, int include_symbolic_links, int single_file_mode)
Get the size of the file (or directory) of the given file (in bytes).
Definition: disk.c:257
The identity of the host (wraps the signing key of the peer).
#define GNUNET_ALIGN
gcc-ism to force alignment; we use this to align char-arrays that may then be cast to &#39;struct&#39;s...
An address for communicating with a peer.
uint16_t GNUNET_HELLO_size(const struct GNUNET_HELLO_Message *hello)
Return the size of the given HELLO message.
Definition: hello.c:652
Closure for add_to_buf().
Definition: gnunet-hello.c:32
Header for all communications.
Time for absolute times used by GNUnet, in microseconds.
#define GNUNET_YES
Definition: gnunet_common.h:77
int GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
struct GNUNET_DISK_FileHandle * GNUNET_DISK_file_open(const char *fn, enum GNUNET_DISK_OpenFlags flags, enum GNUNET_DISK_AccessPermissions perm)
Open a file.
Definition: disk.c:1268
static char * address
GNS address for this phone.
Handle used to access files (and pipes).
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_CRYPTO_EddsaPublicKey public_key
size_t ret
Number of bytes added so far.
Definition: gnunet-hello.c:47