GNUnet  0.10.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 
57 struct CustomPeerMap {
62 
67 };
68 
69 
77 struct CustomPeerMap *
79 {
80  struct CustomPeerMap *c_peer_map;
81 
82  c_peer_map = GNUNET_new(struct CustomPeerMap);
85  GNUNET_NO);
86  return c_peer_map;
87 }
88 
96 unsigned int
97 CustomPeerMap_size(const struct CustomPeerMap *c_peer_map)
98 {
101  return GNUNET_CONTAINER_multipeermap_size(c_peer_map->peer_map);
102 }
103 
113 int
114 CustomPeerMap_put(const struct CustomPeerMap *c_peer_map,
115  const struct GNUNET_PeerIdentity *peer)
116 {
117  uint32_t *index;
118  struct GNUNET_PeerIdentity *p;
119 
123  peer))
124  {
125  /* Need to store the index of the peer in the peermap to be able to remove
126  * it properly */
127  index = GNUNET_new(uint32_t);
128  *index = CustomPeerMap_size(c_peer_map);
129  p = GNUNET_new(struct GNUNET_PeerIdentity);
130  *p = *peer;
131  GNUNET_assert(p != peer);
132  GNUNET_assert(0 == memcmp(p,
133  peer,
134  sizeof(struct GNUNET_PeerIdentity)));
136  p,
137  index,
140  *index,
141  p,
145  return GNUNET_OK;
146  }
147  return GNUNET_NO;
148 }
149 
159 int
161  const struct GNUNET_PeerIdentity *peer)
162 {
163  return GNUNET_CONTAINER_multipeermap_contains(c_peer_map->peer_map, peer);
164 }
165 
174 static uint32_t *
176  const struct GNUNET_PeerIdentity *peer)
177 {
178  uint32_t *index;
179 
181  index = GNUNET_CONTAINER_multipeermap_get(c_peer_map->peer_map, peer);
182  return index;
183 }
184 
194 int
195 CustomPeerMap_remove_peer(const struct CustomPeerMap *c_peer_map,
196  const struct GNUNET_PeerIdentity *peer)
197 {
198  uint32_t *index;
199  struct GNUNET_PeerIdentity *p;
200  uint32_t *last_index;
201  struct GNUNET_PeerIdentity *last_p;
202 
203  if (GNUNET_NO == CustomPeerMap_contains_peer(c_peer_map,
204  peer))
205  {
206  return GNUNET_NO;
207  }
208  index = CustomPeerMap_get_index_pointer(c_peer_map,
209  peer);
210  GNUNET_assert(*index < CustomPeerMap_size(c_peer_map));
211  /* Need to get the pointer stored in the hashmap to free it */
213  *index);
214  GNUNET_assert(NULL != p);
216  *index);
217  // TODO wrong peerid?
219  peer);
220  if (*index != CustomPeerMap_size(c_peer_map))
221  { /* fill 'gap' with peer at last index */
222  last_p =
224  CustomPeerMap_size(c_peer_map));
225  GNUNET_assert(NULL != last_p);
226  last_index = GNUNET_CONTAINER_multipeermap_get(c_peer_map->peer_map,
227  last_p);
228  GNUNET_assert(NULL != last_index);
229  GNUNET_assert(CustomPeerMap_size(c_peer_map) == *last_index);
231  *index, last_p,
234  *last_index);
235  *last_index = *index;
236  }
237  GNUNET_free(index);
240  GNUNET_free(p);
241  return GNUNET_OK;
242 }
243 
253 struct GNUNET_PeerIdentity *
255  uint32_t index)
256 {
257  if (GNUNET_YES ==
259  {
260  return GNUNET_CONTAINER_multihashmap32_get(c_peer_map->hash_map, index);
261  }
262  return NULL;
263 }
264 
274 int
276  uint32_t index)
277 {
278  uint32_t *index_p;
279  struct GNUNET_PeerIdentity *peer;
280 
281  if (index >= CustomPeerMap_size(c_peer_map))
282  {
283  return GNUNET_NO;
284  }
287  if (GNUNET_NO ==
289  {
290  return GNUNET_NO;
291  }
292  peer = CustomPeerMap_get_peer_by_index(c_peer_map, index);
293  GNUNET_assert(NULL != peer);
294  index_p = CustomPeerMap_get_index_pointer(c_peer_map, peer);
295  GNUNET_assert(index == *index_p);
296  CustomPeerMap_remove_peer(c_peer_map, peer);
299  return GNUNET_OK;
300 }
301 
309 void
310 CustomPeerMap_clear(const struct CustomPeerMap *c_peer_map)
311 {
312  while (0 < CustomPeerMap_size(c_peer_map))
313  {
316  CustomPeerMap_size(c_peer_map) - 1));
319  CustomPeerMap_size(c_peer_map) - 1));
320  }
321  GNUNET_assert(0 == CustomPeerMap_size(c_peer_map));
322 }
323 
329 void
331 {
332  CustomPeerMap_clear(c_peer_map);
335  GNUNET_free(c_peer_map);
336 }
337 
338 /* 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...