GNUnet  0.11.x
gnunet-service-rps_custommap.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet.
3  Copyright (C)
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  */
20 
26 #include "platform.h"
27 #include "gnunet_util_lib.h"
29 #include <inttypes.h>
30 
31 #define LOG(kind, ...) GNUNET_log_from (kind, "rps-peers", __VA_ARGS__)
32 
33 
58 {
63 
68 };
69 
70 
78 struct CustomPeerMap *
79 CustomPeerMap_create (unsigned int len)
80 {
81  struct CustomPeerMap *c_peer_map;
82 
83  c_peer_map = GNUNET_new (struct CustomPeerMap);
86  GNUNET_NO);
87  return c_peer_map;
88 }
89 
90 
98 unsigned int
99 CustomPeerMap_size (const struct CustomPeerMap *c_peer_map)
100 {
103  return GNUNET_CONTAINER_multipeermap_size (c_peer_map->peer_map);
104 }
105 
106 
116 int
117 CustomPeerMap_put (const struct CustomPeerMap *c_peer_map,
118  const struct GNUNET_PeerIdentity *peer)
119 {
120  uint32_t *index;
121  struct GNUNET_PeerIdentity *p;
122 
126  peer))
127  {
128  /* Need to store the index of the peer in the peermap to be able to remove
129  * it properly */
130  index = GNUNET_new (uint32_t);
131  *index = CustomPeerMap_size (c_peer_map);
132  p = GNUNET_new (struct GNUNET_PeerIdentity);
133  *p = *peer;
134  GNUNET_assert (p != peer);
135  GNUNET_assert (0 == memcmp (p,
136  peer,
137  sizeof(struct GNUNET_PeerIdentity)));
139  p,
140  index,
143  *index,
144  p,
147  c_peer_map->hash_map) ==
149  return GNUNET_OK;
150  }
151  return GNUNET_NO;
152 }
153 
154 
164 int
165 CustomPeerMap_contains_peer (const struct CustomPeerMap *c_peer_map,
166  const struct GNUNET_PeerIdentity *peer)
167 {
168  return GNUNET_CONTAINER_multipeermap_contains (c_peer_map->peer_map, peer);
169 }
170 
171 
180 static uint32_t *
182  const struct GNUNET_PeerIdentity *peer)
183 {
184  uint32_t *index;
185 
186  GNUNET_assert (GNUNET_YES == CustomPeerMap_contains_peer (c_peer_map, peer));
187  index = GNUNET_CONTAINER_multipeermap_get (c_peer_map->peer_map, peer);
188  return index;
189 }
190 
191 
201 int
202 CustomPeerMap_remove_peer (const struct CustomPeerMap *c_peer_map,
203  const struct GNUNET_PeerIdentity *peer)
204 {
205  uint32_t *index;
206  struct GNUNET_PeerIdentity *p;
207  uint32_t *last_index;
208  struct GNUNET_PeerIdentity *last_p;
209 
210  if (GNUNET_NO == CustomPeerMap_contains_peer (c_peer_map,
211  peer))
212  {
213  return GNUNET_NO;
214  }
215  index = CustomPeerMap_get_index_pointer (c_peer_map,
216  peer);
217  GNUNET_assert (*index < CustomPeerMap_size (c_peer_map));
218  /* Need to get the pointer stored in the hashmap to free it */
220  *index);
221  GNUNET_assert (NULL != p);
223  *index);
224  // TODO wrong peerid?
226  peer);
227  if (*index != CustomPeerMap_size (c_peer_map))
228  { /* fill 'gap' with peer at last index */
229  last_p =
231  CustomPeerMap_size (c_peer_map));
232  GNUNET_assert (NULL != last_p);
233  last_index = GNUNET_CONTAINER_multipeermap_get (c_peer_map->peer_map,
234  last_p);
235  GNUNET_assert (NULL != last_index);
236  GNUNET_assert (CustomPeerMap_size (c_peer_map) == *last_index);
238  *index, last_p,
241  *last_index);
242  *last_index = *index;
243  }
244  GNUNET_free (index);
247  GNUNET_free (p);
248  return GNUNET_OK;
249 }
250 
251 
261 struct GNUNET_PeerIdentity *
263  uint32_t index)
264 {
265  if (GNUNET_YES ==
267  {
268  return GNUNET_CONTAINER_multihashmap32_get (c_peer_map->hash_map, index);
269  }
270  return NULL;
271 }
272 
273 
283 int
285  uint32_t index)
286 {
287  uint32_t *index_p;
288  struct GNUNET_PeerIdentity *peer;
289 
290  if (index >= CustomPeerMap_size (c_peer_map))
291  {
292  return GNUNET_NO;
293  }
296  if (GNUNET_NO ==
298  {
299  return GNUNET_NO;
300  }
301  peer = CustomPeerMap_get_peer_by_index (c_peer_map, index);
302  GNUNET_assert (NULL != peer);
303  index_p = CustomPeerMap_get_index_pointer (c_peer_map, peer);
304  GNUNET_assert (index == *index_p);
305  CustomPeerMap_remove_peer (c_peer_map, peer);
308  return GNUNET_OK;
309 }
310 
311 
319 void
320 CustomPeerMap_clear (const struct CustomPeerMap *c_peer_map)
321 {
322  while (0 < CustomPeerMap_size (c_peer_map))
323  {
326  c_peer_map->hash_map,
328  c_peer_map) - 1));
332  c_peer_map) - 1));
333  }
334  GNUNET_assert (0 == CustomPeerMap_size (c_peer_map));
335 }
336 
337 
343 void
345 {
346  CustomPeerMap_clear (c_peer_map);
349  GNUNET_free (c_peer_map);
350 }
351 
352 
353 /* end of gnunet-service-rps_custommap.c */
static uint32_t * CustomPeerMap_get_index_pointer(const struct CustomPeerMap *c_peer_map, const struct GNUNET_PeerIdentity *peer)
Get index of peer in custom peer map.
struct GNUNET_PeerIdentity * CustomPeerMap_get_peer_by_index(const struct CustomPeerMap *c_peer_map, uint32_t index)
Get a peer by index.
int GNUNET_CONTAINER_multipeermap_remove_all(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key)
Remove all entries for the given key from the map.
utilities for managing (information about) peers
Peer map to store peers with specialised use-cases (push_list, pull_list, view, ...)
int CustomPeerMap_contains_peer(const struct CustomPeerMap *c_peer_map, const struct GNUNET_PeerIdentity *peer)
Check whether custom peer map contains a peer.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_CONTAINER_MultiPeerMap * peer_map
Peermap to quickly check whether a peer is contained.
#define GNUNET_NO
Definition: gnunet_common.h:78
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:75
#define GNUNET_new(type)
Allocate a struct or union of the given type.
int CustomPeerMap_remove_peer_by_index(const struct CustomPeerMap *c_peer_map, uint32_t index)
Remove peer from custom peer map by index.
void CustomPeerMap_destroy(struct CustomPeerMap *c_peer_map)
Destroy peermap.
struct GNUNET_CONTAINER_MultiPeerMap * GNUNET_CONTAINER_multipeermap_create(unsigned int len, int do_not_copy_keys)
Create a multi peer map (hash map for public keys of peers).
int GNUNET_CONTAINER_multihashmap32_put(struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
int GNUNET_CONTAINER_multihashmap32_remove_all(struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key)
Remove all entries for the given key from the map.
int CustomPeerMap_remove_peer(const struct CustomPeerMap *c_peer_map, const struct GNUNET_PeerIdentity *peer)
Remove peer from custom peer map.
void GNUNET_CONTAINER_multipeermap_destroy(struct GNUNET_CONTAINER_MultiPeerMap *map)
Destroy a hash map.
struct CustomPeerMap * CustomPeerMap_create(unsigned int len)
Create an empty peermap.
int CustomPeerMap_put(const struct CustomPeerMap *c_peer_map, const struct GNUNET_PeerIdentity *peer)
Insert peer into the custom peer map.
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-qr.c:59
, &#39; bother checking if a value already exists (faster than GNUNET_CONTAINER_MULTIHASHMAPOPTION_...
int GNUNET_CONTAINER_multihashmap32_contains(const struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key)
Check if the map contains any value under the given key (including values that are NULL)...
void * GNUNET_CONTAINER_multihashmap32_get(const struct GNUNET_CONTAINER_MultiHashMap32 *map, uint32_t key)
Given a key find a value in the map matching the key.
void CustomPeerMap_clear(const struct CustomPeerMap *c_peer_map)
Clear the custom peer map.
unsigned int GNUNET_CONTAINER_multihashmap32_size(const struct GNUNET_CONTAINER_MultiHashMap32 *map)
Get the number of key-value pairs in the map.
Internal representation of the hash map.
Internal representation of the hash map.
struct GNUNET_CONTAINER_MultiHashMap32 * GNUNET_CONTAINER_multihashmap32_create(unsigned int len)
Create a 32-bit key multi hash map.
void GNUNET_CONTAINER_multihashmap32_destroy(struct GNUNET_CONTAINER_MultiHashMap32 *map)
Destroy a 32-bit key hash map.
There must only be one value per key; storing a value should fail if a value under the same key alrea...
struct GNUNET_TESTBED_Peer * peer
The peer associated with this model.
unsigned int CustomPeerMap_size(const struct CustomPeerMap *c_peer_map)
Get the size of the custom peer map.
int GNUNET_CONTAINER_multipeermap_put(struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
The identity of the host (wraps the signing key of the peer).
struct GNUNET_CONTAINER_MultiHashMap32 * hash_map
Multihashmap to be able to access a random index.
void * GNUNET_CONTAINER_multipeermap_get(const struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key)
Given a key find a value in the map matching the key.
#define GNUNET_YES
Definition: gnunet_common.h:77
unsigned int GNUNET_CONTAINER_multipeermap_size(const struct GNUNET_CONTAINER_MultiPeerMap *map)
Get the number of key-value pairs in the map.
int GNUNET_CONTAINER_multipeermap_contains(const struct GNUNET_CONTAINER_MultiPeerMap *map, const struct GNUNET_PeerIdentity *key)
Check if the map contains any value under the given key (including values that are NULL)...
#define GNUNET_free(ptr)
Wrapper around free.
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...