GNUnet debian-0.24.3-24-gfea921bd2
messenger_api_contact_store.h File Reference
#include "gnunet_util_lib.h"
Include dependency graph for messenger_api_contact_store.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  GNUNET_MESSENGER_ContactStore
 

Functions

void init_contact_store (struct GNUNET_MESSENGER_ContactStore *store)
 Initializes a contact store as fully empty. More...
 
void clear_contact_store (struct GNUNET_MESSENGER_ContactStore *store)
 Clears a contact store, wipes its content and deallocates its memory. More...
 
struct GNUNET_MESSENGER_Contactget_store_contact_raw (struct GNUNET_MESSENGER_ContactStore *store, const struct GNUNET_HashCode *context, const struct GNUNET_HashCode *key_hash)
 Returns a contact using the hash of a specific public key. More...
 
struct GNUNET_MESSENGER_Contactget_store_contact (struct GNUNET_MESSENGER_ContactStore *store, const struct GNUNET_HashCode *context, const struct GNUNET_CRYPTO_PublicKey *pubkey)
 Returns a contact using a specific public key. More...
 
void update_store_contact (struct GNUNET_MESSENGER_ContactStore *store, struct GNUNET_MESSENGER_Contact *contact, const struct GNUNET_HashCode *context, const struct GNUNET_HashCode *next_context, const struct GNUNET_CRYPTO_PublicKey *pubkey)
 Moves a contact from the store to another location matching a given public key and member context. More...
 
void remove_store_contact (struct GNUNET_MESSENGER_ContactStore *store, struct GNUNET_MESSENGER_Contact *contact, const struct GNUNET_HashCode *context)
 Removes a contact from the store which uses a given member context. More...
 

Function Documentation

◆ init_contact_store()

void init_contact_store ( struct GNUNET_MESSENGER_ContactStore store)

Initializes a contact store as fully empty.

Parameters
[out]storeContact store

Definition at line 33 of file messenger_api_contact_store.c.

34{
35 GNUNET_assert (store);
36
39
40 store->counter = 0;
41}
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
@ GNUNET_NO
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
struct GNUNET_CONTAINER_MultiHashMap * contacts
struct GNUNET_CONTAINER_MultiHashMap * anonymous

References GNUNET_MESSENGER_ContactStore::anonymous, GNUNET_MESSENGER_ContactStore::contacts, GNUNET_MESSENGER_ContactStore::counter, GNUNET_assert, GNUNET_CONTAINER_multihashmap_create(), and GNUNET_NO.

Referenced by create_handle(), and create_service().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ clear_contact_store()

void clear_contact_store ( struct GNUNET_MESSENGER_ContactStore store)

Clears a contact store, wipes its content and deallocates its memory.

Parameters
[in,out]storeContact store

Definition at line 61 of file messenger_api_contact_store.c.

62{
63 GNUNET_assert ((store) && (store->contacts));
64
65 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Clear contact store\n");
66
71
74}
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
#define GNUNET_log(kind,...)
@ GNUNET_ERROR_TYPE_DEBUG
static enum GNUNET_GenericReturnValue iterate_destroy_contacts(void *cls, const struct GNUNET_HashCode *key, void *value)

References GNUNET_MESSENGER_ContactStore::anonymous, GNUNET_MESSENGER_ContactStore::contacts, GNUNET_assert, GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, and iterate_destroy_contacts().

Referenced by destroy_handle(), and destroy_service().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_store_contact_raw()

struct GNUNET_MESSENGER_Contact * get_store_contact_raw ( struct GNUNET_MESSENGER_ContactStore store,
const struct GNUNET_HashCode context,
const struct GNUNET_HashCode key_hash 
)

Returns a contact using the hash of a specific public key.

In case the anonymous key gets used by the requested contact, it will use its provided member context to select the matching contact from the store.

In case there is no contact stored which uses the given key or context, NULL gets returned.

Parameters
[in,out]storeContact store
[in]contextMember context
[in]key_hashHash of public key

Definition at line 102 of file messenger_api_contact_store.c.

105{
107 struct GNUNET_HashCode hash;
108
109 GNUNET_assert ((store) && (store->contacts) && (context) && (key_hash));
110
111 GNUNET_memcpy (&hash, key_hash, sizeof(*key_hash));
112
113 map = select_store_contact_map (store, context, &hash);
114
116}
static pa_context * context
Pulseaudio context.
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
static struct GNUNET_CONTAINER_MultiHashMap * select_store_contact_map(struct GNUNET_MESSENGER_ContactStore *store, const struct GNUNET_HashCode *context, struct GNUNET_HashCode *hash)
static struct GNUNET_CONTAINER_MultiPeerMap * map
Peermap of PeerIdentities to "struct PeerEntry" (for fast lookup).
Definition: peer.c:63
Internal representation of the hash map.
A 512-bit hashcode.

References GNUNET_MESSENGER_ContactStore::contacts, context, GNUNET_assert, GNUNET_CONTAINER_multihashmap_get(), GNUNET_memcpy, map, and select_store_contact_map().

Referenced by process_message_control(), and task_message_control().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_store_contact()

struct GNUNET_MESSENGER_Contact * get_store_contact ( struct GNUNET_MESSENGER_ContactStore store,
const struct GNUNET_HashCode context,
const struct GNUNET_CRYPTO_PublicKey pubkey 
)

Returns a contact using a specific public key.

In case the anonymous key gets used by the requested contact, it will use its provided member context to select the matching contact from the store.

In case there is no contact stored which uses the given key or context, a new contact will be created automatically.

The function returns NULL if an error occurs during allocation or validation of the contacts key.

Parameters
[in,out]storeContact store
[in]contextMember context
[in]pubkeyPublic key

Definition at line 120 of file messenger_api_contact_store.c.

123{
125 struct GNUNET_MESSENGER_Contact *contact;
126 struct GNUNET_HashCode hash;
127
128 GNUNET_assert ((store) && (store->contacts) && (pubkey));
129
130 GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &hash);
131
132 map = select_store_contact_map (store, context, &hash);
133 contact = GNUNET_CONTAINER_multihashmap_get (map, &hash);
134
135 if (contact)
136 {
137 if (0 != GNUNET_memcmp (pubkey, get_contact_key (contact)))
138 {
139 char *str;
141
143 "Contact in store uses wrong key: %s\n", str);
144 GNUNET_free (str);
145 return NULL;
146 }
147
148 return contact;
149 }
150
151 contact = create_contact (pubkey, ++(store->counter));
152
153 if (GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (map, &hash, contact,
155
156
157
158 return contact;
159
160 destroy_contact (contact);
161 return NULL;
162}
static struct GNUNET_CRYPTO_PublicKey pubkey
Public key of the zone to look in.
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:41
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST
, ' bother checking if a value already exists (faster than GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE...
char * GNUNET_CRYPTO_public_key_to_string(const struct GNUNET_CRYPTO_PublicKey *key)
Creates a (Base32) string representation of the public key.
Definition: crypto_pkey.c:379
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
@ GNUNET_OK
@ GNUNET_ERROR_TYPE_INVALID
#define GNUNET_free(ptr)
Wrapper around free.
const struct GNUNET_CRYPTO_PublicKey * get_contact_key(const struct GNUNET_MESSENGER_Contact *contact)
Returns the public key of a given contact.
void destroy_contact(struct GNUNET_MESSENGER_Contact *contact)
Destroys a contact and frees its memory fully.
struct GNUNET_MESSENGER_Contact * create_contact(const struct GNUNET_CRYPTO_PublicKey *key, size_t unique_id)
Creates and allocates a new contact with a given public key.

References GNUNET_MESSENGER_ContactStore::contacts, context, GNUNET_MESSENGER_ContactStore::counter, create_contact(), destroy_contact(), get_contact_key(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_get(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_CRYPTO_hash(), GNUNET_CRYPTO_public_key_to_string(), GNUNET_ERROR_TYPE_INVALID, GNUNET_free, GNUNET_log, GNUNET_memcmp, GNUNET_OK, map, pubkey, and select_store_contact_map().

Referenced by create_member_session(), get_handle_contact(), handle_join_message(), handle_transcript_message(), and reset_member_session().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_store_contact()

void update_store_contact ( struct GNUNET_MESSENGER_ContactStore store,
struct GNUNET_MESSENGER_Contact contact,
const struct GNUNET_HashCode context,
const struct GNUNET_HashCode next_context,
const struct GNUNET_CRYPTO_PublicKey pubkey 
)

Moves a contact from the store to another location matching a given public key and member context.

This function allows changes of keys or changes of member contexts!

Parameters
[in,out]storeContact store
[in,out]contactContact
[in]contextMember context
[in]next_contextMember context
[in]pubkeyPublic key

Definition at line 166 of file messenger_api_contact_store.c.

171{
172 const struct GNUNET_CRYPTO_PublicKey *oldkey;
174 struct GNUNET_HashCode hash;
175
176 GNUNET_assert ((store) && (store->contacts) && (contact) && (pubkey));
177
178 oldkey = get_contact_key (contact);
179 GNUNET_CRYPTO_hash (oldkey, sizeof(*oldkey), &hash);
180
181 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Update contact store entry: %s\n",
182 GNUNET_h2s (&hash));
183
184 map = select_store_contact_map (store, context, &hash);
185
186 if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_remove (map, &hash, contact))
187 {
188 GNUNET_memcpy (&(contact->public_key), pubkey, sizeof(*pubkey));
189
190 GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &hash);
191
192 map = select_store_contact_map (store, next_context, &hash);
193
194 if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (map, &hash, contact,
196
197
198
199 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Updating a contact failed: %s\n",
200 GNUNET_h2s (&hash));
201 }
202}
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_remove(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, const void *value)
Remove the given key-value pair from the map.
@ GNUNET_YES
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_WARNING
An identity key as per LSD0001.
struct GNUNET_CRYPTO_PublicKey public_key

References GNUNET_MESSENGER_ContactStore::contacts, context, get_contact_key(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_multihashmap_remove(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_OK, GNUNET_YES, map, pubkey, GNUNET_MESSENGER_Contact::public_key, and select_store_contact_map().

Referenced by handle_id_message(), handle_key_message(), and switch_member_session().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ remove_store_contact()

void remove_store_contact ( struct GNUNET_MESSENGER_ContactStore store,
struct GNUNET_MESSENGER_Contact contact,
const struct GNUNET_HashCode context 
)

Removes a contact from the store which uses a given member context.

Parameters
[in,out]storeContact store
[in,out]contactContact
[in]contextMember context

Definition at line 206 of file messenger_api_contact_store.c.

209{
210 const struct GNUNET_CRYPTO_PublicKey *pubkey;
212 struct GNUNET_HashCode hash;
213
214 GNUNET_assert ((store) && (store->contacts) && (contact));
215
216 pubkey = get_contact_key (contact);
217 GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &hash);
218
219 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Remove contact store entry: %s\n",
220 GNUNET_h2s (&hash));
221
222 map = select_store_contact_map (store, context, &hash);
223
224 if (GNUNET_YES != GNUNET_CONTAINER_multihashmap_remove (map, &hash, contact))
225 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Removing a contact failed: %s\n",
226 GNUNET_h2s (&hash));
227
228 destroy_contact (contact);
229}

References GNUNET_MESSENGER_ContactStore::contacts, context, destroy_contact(), get_contact_key(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_remove(), GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_h2s(), GNUNET_log, GNUNET_YES, map, pubkey, and select_store_contact_map().

Referenced by check_member_session_completion(), and destroy_member_session().

Here is the call graph for this function:
Here is the caller graph for this function: