GNUnet 0.29.1-7-g14698f198
 
Loading...
Searching...
No Matches
gnunet-service-messenger_handle.c File Reference
Include dependency graph for gnunet-service-messenger_handle.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_MESSENGER_NextMemberId
 

Functions

struct GNUNET_MESSENGER_SrvHandle * create_srv_handle (struct GNUNET_MESSENGER_Service *service, struct GNUNET_MQ_Handle *mq)
 Creates and allocates a new handle related to a service and using a given mq (message queue).
 
static enum GNUNET_GenericReturnValue iterate_close_rooms (void *cls, const struct GNUNET_HashCode *key, void *value)
 
static enum GNUNET_GenericReturnValue iterate_free_values (void *cls, const struct GNUNET_HashCode *key, void *value)
 
void destroy_srv_handle (struct GNUNET_MESSENGER_SrvHandle *handle)
 Destroys a handle and frees its memory fully.
 
void set_srv_handle_key (struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_CRYPTO_BlindablePublicKey *key)
 Sets the public key of a given handle.
 
const struct GNUNET_CRYPTO_BlindablePublicKey * get_srv_handle_key (const struct GNUNET_MESSENGER_SrvHandle *handle)
 Returns the public key of a given handle.
 
void get_srv_handle_data_subdir (const struct GNUNET_MESSENGER_SrvHandle *handle, const char *name, char **dir)
 Writes the path of the directory for a given handle using a specific name to the parameter dir.
 
static enum GNUNET_GenericReturnValue create_handle_member_id (const struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key)
 
const struct GNUNET_ShortHashCode * get_srv_handle_member_id (const struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key)
 Returns the member id of a given handle in a specific room.
 
enum GNUNET_GenericReturnValue change_srv_handle_member_id (struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key, const struct GNUNET_ShortHashCode *unique_id)
 Changes the member id of a given handle in a specific room to match a unique_id and returns GNUNET_OK on success.
 
enum GNUNET_GenericReturnValue open_srv_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key)
 Makes a given handle a member of the room using a specific key and opens the room from the handles service.
 
enum GNUNET_GenericReturnValue entry_srv_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_PeerIdentity *door, const struct GNUNET_HashCode *key)
 Makes a given handle a member of the room using a specific key and enters the room through a tunnel to a peer identified by a given door (peer identity).
 
enum GNUNET_GenericReturnValue close_srv_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key)
 Removes the membership of the room using a specific key and closes it if no other handle from this service is still a member of it.
 
enum GNUNET_GenericReturnValue is_srv_handle_routing (const struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key)
 Returns whether a given handle has enabled routing for a room using a specific key by opening that room.
 
static enum GNUNET_GenericReturnValue iterate_srv_handle_sync_finished (void *cls, const struct GNUNET_HashCode *key, void *value)
 
void merge_srv_handle_room_to_sync (struct GNUNET_MESSENGER_SrvHandle *handle, struct GNUNET_MESSENGER_SrvRoom *room)
 Merges the latest hash from a specific room by a given handle until the message graph of the room is fully synced.
 
void sync_srv_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle, uint16_t response_type, const struct GNUNET_HashCode *key, const struct GNUNET_HashCode *previous, const struct GNUNET_HashCode *epoch, const struct GNUNET_PeerIdentity *door)
 Starts merging message hashes until the state from a room of a given handle using a specific key is fully synced to then send a response using a specified response_type to the handles client with the latest known hash and epoch of a message in that room.
 
enum GNUNET_GenericReturnValue send_srv_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key, const struct GNUNET_MESSENGER_Message *message)
 Sends a message from a given handle to the room using a specific key.
 
static const struct GNUNET_HashCode * get_next_member_session_context (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 
static const struct GNUNET_MESSENGER_SrvMemberSession * get_handle_member_session (struct GNUNET_MESSENGER_SrvHandle *handle, struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_HashCode *key)
 
void notify_srv_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_MESSENGER_SenderSession *session, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash, const struct GNUNET_HashCode *epoch, enum GNUNET_GenericReturnValue recent)
 Notifies the handle that a new message was received or sent.
 
static enum GNUNET_GenericReturnValue iterate_next_member_ids (void *cls, const struct GNUNET_HashCode *key, void *value)
 
static void task_notify_srv_handle_member_id (void *cls)
 
void notify_srv_handle_member_id (struct GNUNET_MESSENGER_SrvHandle *handle, struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_ShortHashCode *member_id, enum GNUNET_GenericReturnValue reset)
 Notifies the handle that a new member id needs to be used.
 

Function Documentation

◆ create_srv_handle()

struct GNUNET_MESSENGER_SrvHandle * create_srv_handle ( struct GNUNET_MESSENGER_Service *  service,
struct GNUNET_MQ_Handle *  mq 
)

Creates and allocates a new handle related to a service and using a given mq (message queue).

Parameters
[in,out]serviceMESSENGER Service
[in,out]mqMessage queue
Returns
New handle

Definition at line 46 of file gnunet-service-messenger_handle.c.

48{
50
51 GNUNET_assert ((service) && (mq));
52
54
55 handle->service = service;
56 handle->mq = mq;
57
58 handle->key = NULL;
59
64
65 handle->notify = NULL;
66
67 return handle;
68}
static struct GNUNET_SERVICE_Handle * service
Handle to our service instance.
static struct GNUNET_VPN_Handle * handle
Handle to vpn service.
Definition gnunet-vpn.c:35
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.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static struct GNUNET_MQ_Handle * mq
Our connection to the resolver service, created on-demand, but then persists until error or shutdown.
struct GNUNET_MQ_Handle * mq
Connection to VPN service.
Definition vpn_api.c:44

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_create(), GNUNET_new, GNUNET_NO, handle, mq, GNUNET_VPN_Handle::mq, and service.

Referenced by add_service_handle().

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

◆ iterate_close_rooms()

static enum GNUNET_GenericReturnValue iterate_close_rooms ( void *  cls,
const struct GNUNET_HashCode *  key,
void *  value 
)
static

Definition at line 72 of file gnunet-service-messenger_handle.c.

75{
77
78 GNUNET_assert ((cls) && (key));
79
80 handle = cls;
81
83 return GNUNET_YES;
84}
struct GNUNET_HashCode key
The key used in the DHT.
enum GNUNET_GenericReturnValue close_service_room(struct GNUNET_MESSENGER_Service *service, struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key, enum GNUNET_GenericReturnValue deletion)
Tries to close a room using a given key for a service by a specific handle.
@ GNUNET_YES

References close_service_room(), GNUNET_assert, GNUNET_NO, GNUNET_YES, handle, and key.

Referenced by destroy_srv_handle().

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

◆ iterate_free_values()

static enum GNUNET_GenericReturnValue iterate_free_values ( void *  cls,
const struct GNUNET_HashCode *  key,
void *  value 
)
static

Definition at line 88 of file gnunet-service-messenger_handle.c.

91{
93
95 return GNUNET_YES;
96}
static char * value
Value of the record to add/remove.
#define GNUNET_free(ptr)
Wrapper around free.

References GNUNET_assert, GNUNET_free, GNUNET_YES, and value.

Referenced by close_srv_handle_room(), and destroy_srv_handle().

Here is the caller graph for this function:

◆ destroy_srv_handle()

void destroy_srv_handle ( struct GNUNET_MESSENGER_SrvHandle *  handle)

Destroys a handle and frees its memory fully.

Parameters
[in,out]handleHandle

Definition at line 100 of file gnunet-service-messenger_handle.c.

101{
103
106
107 if (handle->notify)
109
111 iterate_free_values, NULL);
113 iterate_free_values, NULL);
115 iterate_free_values, NULL);
116
121
122 if (handle->key)
123 GNUNET_free (handle->key);
124
126}
static enum GNUNET_GenericReturnValue iterate_free_values(void *cls, const struct GNUNET_HashCode *key, void *value)
static enum GNUNET_GenericReturnValue iterate_close_rooms(void *cls, const struct GNUNET_HashCode *key, void *value)
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.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition scheduler.c:986

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_free, GNUNET_SCHEDULER_cancel(), handle, iterate_close_rooms(), and iterate_free_values().

Referenced by clear_list_handles(), and remove_service_handle().

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

◆ set_srv_handle_key()

void set_srv_handle_key ( struct GNUNET_MESSENGER_SrvHandle *  handle,
const struct GNUNET_CRYPTO_BlindablePublicKey *  key 
)

Sets the public key of a given handle.

Parameters
[out]handleHandle
[in]keyPublic key

Definition at line 130 of file gnunet-service-messenger_handle.c.

132{
134
135 if ((handle->key) && (! key))
136 {
137 GNUNET_free (handle->key);
138 handle->key = NULL;
139 }
140 else if (! handle->key)
142
143 if (key)
144 memcpy (handle->key, key, sizeof(struct GNUNET_CRYPTO_BlindablePublicKey));
145}
An identity key as per LSD0001.

References GNUNET_assert, GNUNET_free, GNUNET_new, handle, and key.

Referenced by initialize_handle_via_key(), send_message_join(), and send_message_key().

Here is the caller graph for this function:

◆ get_srv_handle_key()

const struct GNUNET_CRYPTO_BlindablePublicKey * get_srv_handle_key ( const struct GNUNET_MESSENGER_SrvHandle *  handle)

Returns the public key of a given handle.

Parameters
[in]handleHandle
Returns
Public key of handle

Definition at line 149 of file gnunet-service-messenger_handle.c.

150{
152
153 return handle->key;
154}

References GNUNET_assert, and handle.

Referenced by find_member_session_in_room(), get_handle_member_session(), handle_get_message(), initialize_service_handle(), and solve_srv_room_member_collisions().

Here is the caller graph for this function:

◆ get_srv_handle_data_subdir()

void get_srv_handle_data_subdir ( const struct GNUNET_MESSENGER_SrvHandle *  handle,
const char *  name,
char **  dir 
)

Writes the path of the directory for a given handle using a specific name to the parameter dir.

This directory will be used to store data regarding the handle and its messages.

Parameters
[in]handleHandle
[in]namePotential name of the handle
[out]dirPath to store data

Definition at line 158 of file gnunet-service-messenger_handle.c.

161{
162 GNUNET_assert ((handle) && (dir));
163
164 if (name)
165 GNUNET_asprintf (dir, "%s%s%c%s%c", handle->service->dir, "identities",
167 else
168 GNUNET_asprintf (dir, "%s%s%c", handle->service->dir, "anonymous",
170}
static char * dir
Set to the directory where runtime files are stored.
Definition gnunet-arm.c:88
static char * name
Name (label) of the records to list.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define DIR_SEPARATOR
Definition platform.h:166

References dir, DIR_SEPARATOR, GNUNET_asprintf(), GNUNET_assert, handle, and name.

Here is the call graph for this function:

◆ create_handle_member_id()

static enum GNUNET_GenericReturnValue create_handle_member_id ( const struct GNUNET_MESSENGER_SrvHandle *  handle,
const struct GNUNET_HashCode *  key 
)
static

Definition at line 174 of file gnunet-service-messenger_handle.c.

176{
177 struct GNUNET_ShortHashCode *random_id;
178
179 GNUNET_assert ((handle) && (key));
180
181 random_id = GNUNET_new (struct GNUNET_ShortHashCode);
182
183 if (! random_id)
184 return GNUNET_NO;
185
186 generate_free_member_id (random_id, NULL);
187
189 random_id,
191 {
192 GNUNET_free (random_id);
193 return GNUNET_NO;
194 }
195
197 "Created a new member id (%s) for room: %s\n", GNUNET_sh2s (
198 random_id),
199 GNUNET_h2s (key));
200
201 return GNUNET_YES;
202}
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...
#define GNUNET_log(kind,...)
@ GNUNET_OK
const char * GNUNET_sh2s(const struct GNUNET_ShortHashCode *shc)
Convert a short hash value to a string (for printing debug messages).
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
enum GNUNET_GenericReturnValue generate_free_member_id(struct GNUNET_ShortHashCode *id, const struct GNUNET_CONTAINER_MultiShortmap *members)
Tries to generate an unused member id and store it into the id parameter.
A 256-bit hashcode.

References generate_free_member_id(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_log, GNUNET_new, GNUNET_NO, GNUNET_OK, GNUNET_sh2s(), GNUNET_YES, handle, and key.

Referenced by entry_srv_handle_room(), and open_srv_handle_room().

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

◆ get_srv_handle_member_id()

const struct GNUNET_ShortHashCode * get_srv_handle_member_id ( const struct GNUNET_MESSENGER_SrvHandle *  handle,
const struct GNUNET_HashCode *  key 
)

Returns the member id of a given handle in a specific room.

If the handle is not a member of the specific room, NULL gets returned.

Parameters
[in]handleHandle
[in]keyKey of a room
Returns
Member id or NULL

Definition at line 206 of file gnunet-service-messenger_handle.c.

208{
209 GNUNET_assert ((handle) && (key));
210
211 return GNUNET_CONTAINER_multihashmap_get (handle->member_ids, key);
212}
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.

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_get(), handle, and key.

Referenced by close_srv_handle_room(), entry_srv_handle_room(), find_list_handle_by_member(), get_handle_member_session(), handle_get_message(), handle_service_message(), iterate_srv_handle_sync_finished(), join_room_locally(), notify_srv_handle_message(), open_srv_handle_room(), open_srv_room(), send_srv_handle_message(), solve_srv_room_member_collisions(), and sync_srv_handle_room().

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

◆ change_srv_handle_member_id()

enum GNUNET_GenericReturnValue change_srv_handle_member_id ( struct GNUNET_MESSENGER_SrvHandle *  handle,
const struct GNUNET_HashCode *  key,
const struct GNUNET_ShortHashCode *  unique_id 
)

Changes the member id of a given handle in a specific room to match a unique_id and returns GNUNET_OK on success.

The client connected to the handle will be informed afterwards automatically.

Parameters
[in,out]handleHandle
[in]keyKey of a room
[in]unique_idUnique member id
Returns
GNUNET_OK on success, otherwise GNUNET_SYSERR

Definition at line 216 of file gnunet-service-messenger_handle.c.

219{
220 struct GNUNET_ShortHashCode *member_id;
221
222 GNUNET_assert ((handle) && (key) && (unique_id));
223
224 member_id = GNUNET_CONTAINER_multihashmap_get (handle->member_ids, key);
225
226 if (! member_id)
227 {
228 member_id = GNUNET_new (struct GNUNET_ShortHashCode);
229 GNUNET_memcpy (member_id, unique_id, sizeof(*member_id));
230
232 member_id,
234 {
235 GNUNET_free (member_id);
236 return GNUNET_SYSERR;
237 }
238 }
239
240 if (0 == GNUNET_memcmp (unique_id, member_id))
241 return GNUNET_OK;
242
244 "Change a member id (%s) for room (%s).\n", GNUNET_sh2s (
245 member_id),
246 GNUNET_h2s (key));
247
248 GNUNET_memcpy (member_id, unique_id, sizeof(*unique_id));
249
250 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Member id changed to (%s).\n",
251 GNUNET_sh2s (unique_id));
252 return GNUNET_OK;
253}
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
@ GNUNET_SYSERR

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_get(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_log, GNUNET_memcmp, GNUNET_memcpy, GNUNET_new, GNUNET_OK, GNUNET_sh2s(), GNUNET_SYSERR, handle, and key.

Referenced by find_member_session_in_room(), join_room(), and send_message_id().

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

◆ open_srv_handle_room()

enum GNUNET_GenericReturnValue open_srv_handle_room ( struct GNUNET_MESSENGER_SrvHandle *  handle,
const struct GNUNET_HashCode *  key 
)

Makes a given handle a member of the room using a specific key and opens the room from the handles service.

Parameters
[in,out]handleHandle
[in]keyKey of a room
Returns
GNUNET_YES on success, otherwise GNUNET_NO

Definition at line 257 of file gnunet-service-messenger_handle.c.

259{
260 GNUNET_assert ((handle) && (key));
261
263 handle->routing, key, NULL,
265 return GNUNET_NO;
266
269 key)))
270 return GNUNET_NO;
271
272 return open_service_room (handle->service, handle, key);
273}
const struct GNUNET_ShortHashCode * get_srv_handle_member_id(const struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key)
Returns the member id of a given handle in a specific room.
static enum GNUNET_GenericReturnValue create_handle_member_id(const struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key)
enum GNUNET_GenericReturnValue open_service_room(struct GNUNET_MESSENGER_Service *service, struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key)
Tries to open a room using a given key for a service by a specific handle.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE
If a value with the given key exists, replace it.

References create_handle_member_id(), get_srv_handle_member_id(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE, GNUNET_NO, GNUNET_OK, GNUNET_YES, handle, key, and open_service_room().

Referenced by handle_room_open().

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

◆ entry_srv_handle_room()

enum GNUNET_GenericReturnValue entry_srv_handle_room ( struct GNUNET_MESSENGER_SrvHandle *  handle,
const struct GNUNET_PeerIdentity *  door,
const struct GNUNET_HashCode *  key 
)

Makes a given handle a member of the room using a specific key and enters the room through a tunnel to a peer identified by a given door (peer identity).

Parameters
[in,out]handleHandle
[in]doorPeer identity
[in]keyKey of a room
Returns
GNUNET_YES on success, otherwise GNUNET_NO

Definition at line 277 of file gnunet-service-messenger_handle.c.

280{
281 GNUNET_assert ((handle) && (door) && (key));
282
285 return GNUNET_NO;
286
287 return entry_service_room (handle->service, handle, door, key);
288}
enum GNUNET_GenericReturnValue entry_service_room(struct GNUNET_MESSENGER_Service *service, struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_PeerIdentity *door, const struct GNUNET_HashCode *key)
Tries to enter a room using a given key for a service by a specific handle.

References create_handle_member_id(), entry_service_room(), get_srv_handle_member_id(), GNUNET_assert, GNUNET_NO, GNUNET_YES, handle, and key.

Referenced by handle_room_entry().

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

◆ close_srv_handle_room()

enum GNUNET_GenericReturnValue close_srv_handle_room ( struct GNUNET_MESSENGER_SrvHandle *  handle,
const struct GNUNET_HashCode *  key 
)

Removes the membership of the room using a specific key and closes it if no other handle from this service is still a member of it.

Parameters
[in,out]handleHandle
[in]keyKey of a room
Returns
GNUNET_YES on success, otherwise GNUNET_NO

Definition at line 292 of file gnunet-service-messenger_handle.c.

294{
295 GNUNET_assert ((handle) && (key));
296
298 iterate_free_values, NULL);
300
301 if ((handle->notify) && (0 == GNUNET_CONTAINER_multihashmap_size (
302 handle->next_ids)))
303 {
305 handle->notify = NULL;
306 }
307
309 return GNUNET_NO;
310
311 {
314
315 if (GNUNET_YES != result)
316 return result;
317
319 return result;
320 }
321}
static int result
Global testing status.
int GNUNET_CONTAINER_multihashmap_remove_all(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Remove all entries for the given key from the map.
unsigned int GNUNET_CONTAINER_multihashmap_size(const struct GNUNET_CONTAINER_MultiHashMap *map)
Get the number of key-value pairs in the map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_get_multiple(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map that match a particular key.
GNUNET_GenericReturnValue
Named constants for return values.

References close_service_room(), get_srv_handle_member_id(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_get_multiple(), GNUNET_CONTAINER_multihashmap_remove_all(), GNUNET_CONTAINER_multihashmap_size(), GNUNET_NO, GNUNET_SCHEDULER_cancel(), GNUNET_YES, handle, iterate_free_values(), key, and result.

Referenced by handle_room_close().

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

◆ is_srv_handle_routing()

enum GNUNET_GenericReturnValue is_srv_handle_routing ( const struct GNUNET_MESSENGER_SrvHandle *  handle,
const struct GNUNET_HashCode *  key 
)

Returns whether a given handle has enabled routing for a room using a specific key by opening that room.

Parameters
[in]handleHandle
[in]keyKey of a room
Returns
GNUNET_YES is routing is enabled, otherwise GNUNET_NO

Definition at line 325 of file gnunet-service-messenger_handle.c.

327{
328 GNUNET_assert ((handle) && (key));
329
331}
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_contains(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Check if the map contains any value under the given key (including values that are NULL).

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_contains(), handle, and key.

Referenced by find_list_handle_by_member(), and rebuild_srv_room_basement_structure().

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

◆ iterate_srv_handle_sync_finished()

static enum GNUNET_GenericReturnValue iterate_srv_handle_sync_finished ( void *  cls,
const struct GNUNET_HashCode *  key,
void *  value 
)
static

Definition at line 335 of file gnunet-service-messenger_handle.c.

338{
341 struct GNUNET_MESSENGER_SrvRoom *room;
342 const struct GNUNET_ShortHashCode *member_id;
343 struct GNUNET_MESSENGER_MessageStore *store;
344
345 GNUNET_assert ((cls) && (key) && (value));
346
347 handle = cls;
348 sync = value;
349
350 room = get_service_room (handle->service, key);
351 member_id = get_srv_handle_member_id (handle, key);
352
353 if ((! room) || (! member_id))
354 goto sync_epoch;
355
356 get_message_state_chain_hash (&(room->state), &(sync->hash));
357
358sync_epoch:
359 if (! room)
360 {
361 GNUNET_memcpy (&(sync->epoch), &(sync->hash),
362 sizeof(sync->epoch));
363 goto send_response;
364 }
365
366 store = get_srv_room_message_store (room);
367
368 if (! store)
369 goto send_response;
370
371 GNUNET_memcpy (&(sync->epoch),
372 get_store_message_epoch (store, &(sync->hash)),
373 sizeof(sync->epoch));
374
376 {
378 struct GNUNET_MQ_Envelope *envelope;
379
380 switch (sync->response_type)
381 {
383 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Opening room with member id: %s\n",
384 GNUNET_sh2s (member_id));
385 break;
387 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Entering room with member id: %s\n",
388 GNUNET_sh2s (member_id));
389 break;
391 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Closing room succeeded: %s\n",
392 GNUNET_h2s (key));
393 break;
395 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Synced room: %s\n",
396 GNUNET_h2s (key));
397 break;
398 default:
399 break;
400 }
401
402 envelope = GNUNET_MQ_msg (response, sync->response_type);
403
404 GNUNET_memcpy (&(response->door), &(sync->door), sizeof(response->door));
405 GNUNET_memcpy (&(response->key), key, sizeof(response->key));
406 GNUNET_memcpy (&(response->previous), &(sync->hash), sizeof(response->
407 previous));
408 GNUNET_memcpy (&(response->epoch), &(sync->epoch), sizeof(response->epoch));
409
410 GNUNET_MQ_send (handle->mq, envelope);
411 }
412
413 GNUNET_free (sync);
414 return GNUNET_YES;
415}
static struct MHD_Response * response
Our canonical response.
static void send_response(struct Request *request)
Send the response for the given request and clean up.
void get_message_state_chain_hash(const struct GNUNET_MESSENGER_MessageState *state, struct GNUNET_HashCode *hash)
const struct GNUNET_HashCode * get_store_message_epoch(const struct GNUNET_MESSENGER_MessageStore *store, const struct GNUNET_HashCode *hash)
Returns the epoch hash of a message from a message store matching a given hash.
struct GNUNET_MESSENGER_MessageStore * get_srv_room_message_store(struct GNUNET_MESSENGER_SrvRoom *room)
Returns the used message store of a given room.
struct GNUNET_MESSENGER_SrvRoom * get_service_room(const struct GNUNET_MESSENGER_Service *service, const struct GNUNET_HashCode *key)
Returns the room identified by a given key for a service.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition mq.c:337
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN
#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SYNC
#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE
#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY
General message to confirm interaction with a room.
struct GNUNET_MESSENGER_MessageState state

References GNUNET_MESSENGER_SrvHandleSync::door, GNUNET_MESSENGER_SrvHandleSync::epoch, get_message_state_chain_hash(), get_service_room(), get_srv_handle_member_id(), get_srv_room_message_store(), get_store_message_epoch(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SYNC, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_sh2s(), GNUNET_YES, handle, GNUNET_MESSENGER_SrvHandleSync::hash, key, GNUNET_VPN_Handle::mq, response, GNUNET_MESSENGER_SrvHandleSync::response_type, send_response(), GNUNET_MESSENGER_SrvRoom::state, and value.

Referenced by merge_srv_handle_room_to_sync(), and sync_srv_handle_room().

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

◆ merge_srv_handle_room_to_sync()

void merge_srv_handle_room_to_sync ( struct GNUNET_MESSENGER_SrvHandle *  handle,
struct GNUNET_MESSENGER_SrvRoom *  room 
)

Merges the latest hash from a specific room by a given handle until the message graph of the room is fully synced.

The function will be called automatically in case the given handle is actively syncing.

Parameters
[in,out]handleHandle
[in,out]roomRoom

Definition at line 419 of file gnunet-service-messenger_handle.c.

421{
423
424 GNUNET_assert ((handle) && (room));
425
427 syncing,
428 &(room->
429 key)));
430
432
433 if (GNUNET_NO == result)
434 {
436 "Finish syncing room: %s\n",
437 GNUNET_h2s (&(room->key)));
438
440 &(room->key),
441 &
443 handle);
445 room->sync = NULL;
446 }
447 else if (GNUNET_YES != result)
448 {
450 "Merging messages failed while syncing: %s\n",
451 GNUNET_h2s (&(room->key)));
452 room->sync = NULL;
453 }
454 else if (NULL == room->sync)
455 room->sync = handle;
456}
static enum GNUNET_GenericReturnValue iterate_srv_handle_sync_finished(void *cls, const struct GNUNET_HashCode *key, void *value)
enum GNUNET_GenericReturnValue merge_srv_room_last_messages(struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvHandle *handle)
Reduces all current forks inside of the message history of a room to one remaining last message by me...
@ GNUNET_ERROR_TYPE_ERROR
struct GNUNET_MESSENGER_SrvHandle * sync

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_contains(), GNUNET_CONTAINER_multihashmap_get_multiple(), GNUNET_CONTAINER_multihashmap_remove_all(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_h2s(), GNUNET_log, GNUNET_NO, GNUNET_YES, handle, iterate_srv_handle_sync_finished(), key, GNUNET_MESSENGER_SrvRoom::key, merge_srv_room_last_messages(), result, and GNUNET_MESSENGER_SrvRoom::sync.

Referenced by callback_srv_room_message_signed(), notify_srv_handle_message(), and sync_srv_handle_room().

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

◆ sync_srv_handle_room()

void sync_srv_handle_room ( struct GNUNET_MESSENGER_SrvHandle *  handle,
uint16_t  response_type,
const struct GNUNET_HashCode *  key,
const struct GNUNET_HashCode *  hash,
const struct GNUNET_HashCode *  epoch,
const struct GNUNET_PeerIdentity *  door 
)

Starts merging message hashes until the state from a room of a given handle using a specific key is fully synced to then send a response using a specified response_type to the handles client with the latest known hash and epoch of a message in that room.

If the room does not contain other messages being accessible to the handle and older than the provided hash, the function returns the originally provided hash as fallback. Similar goes for the provided epoch and door identifier.

Parameters
[in,out]handleHandle
[in]response_typeType of response
[in]keyKey of a room
[in]prevKnown hash of a message
[in]epochKnown epoch in a room
[in]doorKnown door identity or NULL

Definition at line 460 of file gnunet-service-messenger_handle.c.

466{
467 struct GNUNET_MESSENGER_SrvRoom *room;
469
470 GNUNET_assert ((handle) && (key) && (previous));
471
472 room = get_service_room (handle->service, key);
473
475 "%s syncing room: %s\n",
476 (room) && (room->sync)? "Continue" : "Start",
477 GNUNET_h2s (key));
478
480
481 GNUNET_assert (sync);
483
484 if (door)
485 GNUNET_memcpy (&(sync->door), door, sizeof(sync->door));
486 else if (GNUNET_OK != get_service_peer_identity (handle->service, &(sync->door
487 )))
488 memset (&(sync->door), 0, sizeof(sync->door));
489
490 GNUNET_memcpy (&(sync->hash), previous, sizeof(sync->hash));
491 GNUNET_memcpy (&(sync->epoch), epoch, sizeof(sync->epoch));
492
493 if ((! room) || (! get_srv_handle_member_id (handle, key)) ||
494 (NULL == get_message_state_merge_hash (&(room->state))))
495 {
497 "Finish syncing room quickly: %s\n",
498 GNUNET_h2s (key));
499
501 return;
502 }
503
505 key, sync,
507 {
509 "Could not wait for syncing room: %s\n",
510 GNUNET_h2s (key));
511 GNUNET_free (sync);
512 }
513
514 if (NULL != room->sync)
516 "Wait for syncing: %s\n",
517 GNUNET_h2s (&(room->key)));
518 else
520}
void merge_srv_handle_room_to_sync(struct GNUNET_MESSENGER_SrvHandle *handle, struct GNUNET_MESSENGER_SrvRoom *room)
Merges the latest hash from a specific room by a given handle until the message graph of the room is ...
const struct GNUNET_HashCode * get_message_state_merge_hash(const struct GNUNET_MESSENGER_MessageState *state)
enum GNUNET_GenericReturnValue get_service_peer_identity(struct GNUNET_MESSENGER_Service *service, struct GNUNET_PeerIdentity *peer)
Tries to write the peer identity of the peer running a service on to the peer parameter.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE
Allow multiple values with the same key.

References GNUNET_MESSENGER_SrvHandleSync::door, GNUNET_MESSENGER_SrvHandleSync::epoch, get_message_state_merge_hash(), get_service_peer_identity(), get_service_room(), get_srv_handle_member_id(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_new, GNUNET_OK, handle, GNUNET_MESSENGER_SrvHandleSync::hash, iterate_srv_handle_sync_finished(), key, GNUNET_MESSENGER_SrvRoom::key, merge_srv_handle_room_to_sync(), GNUNET_MESSENGER_SrvHandleSync::response_type, GNUNET_MESSENGER_SrvRoom::state, and GNUNET_MESSENGER_SrvRoom::sync.

Referenced by handle_room_close(), handle_room_entry(), handle_room_open(), and handle_room_sync().

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

◆ send_srv_handle_message()

enum GNUNET_GenericReturnValue send_srv_handle_message ( struct GNUNET_MESSENGER_SrvHandle *  handle,
const struct GNUNET_HashCode *  key,
const struct GNUNET_MESSENGER_Message *  message 
)

Sends a message from a given handle to the room using a specific key.

Parameters
[in,out]handleHandle
[in]keyKey of a room
[in]messageMessage
Returns
GNUNET_YES on success, GNUNET_NO or GNUNET_SYSERR otherwise.

Definition at line 524 of file gnunet-service-messenger_handle.c.

527{
528 const struct GNUNET_ShortHashCode *id;
529 struct GNUNET_MESSENGER_SrvRoom *room;
530
531 GNUNET_assert ((handle) && (key) && (message));
532
534
535 if (! id)
536 {
538 "It is required to be a member of a room to send messages!\n");
539 return GNUNET_NO;
540 }
541
542 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending message with member id: %s\n",
543 GNUNET_sh2s (id));
544
545 if (0 != GNUNET_memcmp (id, &(message->header.sender_id)))
546 {
548 "Member id does not match with handle!\n");
549 return GNUNET_NO;
550 }
551
552 room = get_service_room (handle->service, key);
553
554 if (! room)
555 {
556 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "The room (%s) is unknown!\n",
557 GNUNET_h2s (key));
558 return GNUNET_NO;
559 }
560
561 {
563 msg = copy_message (message);
564
565 if (! msg)
566 {
567 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Copying message failed!\n");
568 return GNUNET_NO;
569 }
570
571 return send_srv_room_message (room, handle, msg);
572 }
573}
struct GNUNET_MessageHeader * msg
Definition 005.c:2
static struct GNUNET_IDENTITY_Handle * id
Handle to IDENTITY.
enum GNUNET_GenericReturnValue send_srv_room_message(struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvHandle *handle, struct GNUNET_MESSENGER_Message *message)
Sends a message from a given handle into a room.
@ GNUNET_ERROR_TYPE_WARNING
struct GNUNET_MESSENGER_Message * copy_message(const struct GNUNET_MESSENGER_Message *message)
Creates and allocates a copy of a given message.
struct GNUNET_ShortHashCode sender_id
The senders id inside of the room the message was sent in.
struct GNUNET_MESSENGER_MessageHeader header
Header.

References copy_message(), get_service_room(), get_srv_handle_member_id(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_h2s(), GNUNET_log, GNUNET_memcmp, GNUNET_NO, GNUNET_sh2s(), handle, GNUNET_MESSENGER_Message::header, id, key, msg, send_srv_room_message(), and GNUNET_MESSENGER_MessageHeader::sender_id.

Referenced by handle_send_message().

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

◆ get_next_member_session_context()

static const struct GNUNET_HashCode * get_next_member_session_context ( const struct GNUNET_MESSENGER_SrvMemberSession *  session)
static

Definition at line 577 of file gnunet-service-messenger_handle.c.

579{
580 GNUNET_assert (session);
581
582 if (session->next)
583 return get_next_member_session_context (session->next);
584 else
585 return get_member_session_context (session);
586}
static const struct GNUNET_HashCode * get_next_member_session_context(const struct GNUNET_MESSENGER_SrvMemberSession *session)
const struct GNUNET_HashCode * get_member_session_context(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the member context of a given member session.
struct GNUNET_MESSENGER_SrvMemberSession * next

References get_member_session_context(), get_next_member_session_context(), GNUNET_assert, and GNUNET_MESSENGER_SrvMemberSession::next.

Referenced by get_next_member_session_context(), and notify_srv_handle_message().

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

◆ get_handle_member_session()

static const struct GNUNET_MESSENGER_SrvMemberSession * get_handle_member_session ( struct GNUNET_MESSENGER_SrvHandle *  handle,
struct GNUNET_MESSENGER_SrvRoom *  room,
const struct GNUNET_HashCode *  key 
)
static

Definition at line 590 of file gnunet-service-messenger_handle.c.

593{
594 const struct GNUNET_ShortHashCode *id;
596
597 GNUNET_assert ((handle) && (room) && (key) && (handle->service));
598
600
601 if (! id)
602 {
604 "Handle is missing a member id for its member session! (%s)\n",
605 GNUNET_h2s (key));
606 return NULL;
607 }
608
610
611 if (! pubkey)
612 {
614 "Handle is missing a public key for its member session! (%s)\n",
615 GNUNET_h2s (key));
616 return NULL;
617 }
618
619 {
620 struct GNUNET_MESSENGER_MemberStore *store;
621 struct GNUNET_MESSENGER_Member *member;
622
624 member = get_store_member (store, id);
625
626 return get_member_session (member, pubkey);
627 }
628}
static struct GNUNET_CRYPTO_BlindablePublicKey pubkey
Public key of the zone to look in.
const struct GNUNET_CRYPTO_BlindablePublicKey * get_srv_handle_key(const struct GNUNET_MESSENGER_SrvHandle *handle)
Returns the public key of a given handle.
struct GNUNET_MESSENGER_SrvMemberSession * get_member_session(const struct GNUNET_MESSENGER_Member *member, const struct GNUNET_CRYPTO_BlindablePublicKey *public_key)
Returns the member session of a member identified by a given public key.
struct GNUNET_MESSENGER_Member * get_store_member(const struct GNUNET_MESSENGER_MemberStore *store, const struct GNUNET_ShortHashCode *id)
Returns the member in a store identified by a given id.
struct GNUNET_MESSENGER_MemberStore * get_srv_room_member_store(struct GNUNET_MESSENGER_SrvRoom *room)
Returns the used member store of a given room.
struct GNUNET_MESSENGER_MemberStore * store

References get_member_session(), get_srv_handle_key(), get_srv_handle_member_id(), get_srv_room_member_store(), get_store_member(), GNUNET_assert, GNUNET_ERROR_TYPE_WARNING, GNUNET_h2s(), GNUNET_log, handle, id, key, pubkey, and GNUNET_MESSENGER_Member::store.

Referenced by notify_srv_handle_message().

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

◆ notify_srv_handle_message()

void notify_srv_handle_message ( struct GNUNET_MESSENGER_SrvHandle *  handle,
struct GNUNET_MESSENGER_SrvRoom *  room,
const struct GNUNET_MESSENGER_SenderSession *  session,
const struct GNUNET_MESSENGER_Message *  message,
const struct GNUNET_HashCode *  hash,
const struct GNUNET_HashCode *  epoch,
enum GNUNET_GenericReturnValue  recent 
)

Notifies the handle that a new message was received or sent.

Parameters
[in,out]handleHandle
[in]roomRoom of the message
[in]sessionSender session
[in]messageMessage
[in]hashHash of message
[in]epochHash of epoch
[in]recentWhether the message was recently received

Definition at line 632 of file gnunet-service-messenger_handle.c.

639{
640 const struct GNUNET_HashCode *key;
641 const struct GNUNET_ShortHashCode *id;
642 const struct GNUNET_HashCode *context;
644 const struct GNUNET_ShortHashCode *discourse;
645 struct GNUNET_MESSENGER_Subscription *subscription;
646 struct GNUNET_HashCode sender;
647
648 GNUNET_assert ((handle) && (room) && (session) && (message) && (hash) && (
649 epoch));
650
651 key = get_srv_room_key (room);
653
654 if (! handle->mq)
655 {
657 "Notifying client is missing a message queue!\n");
658 return;
659 }
660
661 if ((GNUNET_MESSENGER_KIND_MERGE == message->header.kind) &&
663 key)) &&
664 (NULL == get_message_state_merge_hash (&(room->state))))
666
667 if (! id)
668 {
670 "Notifying client about message requires membership!\n");
671 return;
672 }
673
674 context = NULL;
675
676 if (GNUNET_MESSENGER_KIND_TALK != message->header.kind)
677 goto skip_message_filter;
678
680 discourse = &(message->body.talk.discourse);
681
682 {
683 struct GNUNET_MESSENGER_MemberStore *member_store;
684 struct GNUNET_MESSENGER_Member *member;
685
686 member_store = get_srv_room_member_store (room);
687
688 if (! member_store)
689 {
691 "Room does not offer a member store: %s\n",
692 GNUNET_h2s (key));
693 return;
694 }
695
696 member = get_store_member (member_store, id);
697
698 if (! member)
699 {
701 "Could not find member in store with given id: %s (%s)\n",
702 GNUNET_sh2s (id),
703 GNUNET_h2s (key));
704 return;
705 }
706
707 subscription = get_member_subscription (member, discourse);
708 }
709
710 if ((! subscription) ||
712 {
714 "Dropping message for client outside of subscription: %s\n",
715 GNUNET_h2s (hash));
716 return;
717 }
718
719skip_message_filter:
720 if (GNUNET_YES == is_peer_message (message))
721 {
722 const struct GNUNET_PeerIdentity *identity = session->peer;
723 GNUNET_CRYPTO_hash (identity, sizeof(*identity), &sender);
724
725 context = &sender;
726 }
727 else
728 {
731 GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &sender);
732
734 }
735
737 "Notifying client about message: %s (%s)\n",
739 message->header.kind));
740
741 {
743 struct GNUNET_MQ_Envelope *env;
744 uint16_t length;
745 char *buffer;
746
747 length = get_message_size (message, GNUNET_YES);
748
749 env = GNUNET_MQ_msg_extra (msg, length,
751
752 GNUNET_memcpy (&(msg->key), key, sizeof(msg->key));
753 GNUNET_memcpy (&(msg->sender), &sender, sizeof(msg->sender));
754 GNUNET_memcpy (&(msg->context), context, sizeof(msg->context));
755 GNUNET_memcpy (&(msg->hash), hash, sizeof(msg->hash));
756 GNUNET_memcpy (&(msg->epoch), epoch, sizeof(msg->epoch));
757
758 msg->flags = (uint32_t) GNUNET_MESSENGER_FLAG_NONE;
759
760 if (GNUNET_YES == is_peer_message (message))
761 msg->flags |= (uint32_t) GNUNET_MESSENGER_FLAG_PEER;
762 else if (get_handle_member_session (handle, room, key) == session->member)
763 msg->flags |= (uint32_t) GNUNET_MESSENGER_FLAG_SENT;
764
765 if (GNUNET_YES == recent)
766 msg->flags |= (uint32_t) GNUNET_MESSENGER_FLAG_RECENT;
767
768 buffer = ((char*) msg) + sizeof(*msg);
769 encode_message (message, length, buffer, GNUNET_YES);
770
772 }
773}
struct GNUNET_MQ_Envelope * env
Definition 005.c:1
static uint64_t timestamp(void)
Get current timestamp.
static pa_context * context
Pulseaudio context.
static struct GNUNET_IDENTITY_Handle * identity
Which namespace do we publish to? NULL if we do not publish to a namespace.
static const struct GNUNET_MESSENGER_SrvMemberSession * get_handle_member_session(struct GNUNET_MESSENGER_SrvHandle *handle, struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_HashCode *key)
struct GNUNET_MESSENGER_Subscription * get_member_subscription(struct GNUNET_MESSENGER_Member *member, const struct GNUNET_ShortHashCode *discourse)
Returns the active subscription of a given member to a selected discourse.
const struct GNUNET_CRYPTO_BlindablePublicKey * get_member_session_public_key(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the public key of a given member session.
const struct GNUNET_HashCode * get_srv_room_key(const struct GNUNET_MESSENGER_SrvRoom *room)
Returns the shared secret you need to access a room.
enum GNUNET_GenericReturnValue has_subscription_of_timestamp(const struct GNUNET_MESSENGER_Subscription *subscription, struct GNUNET_TIME_Absolute timestamp)
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition crypto_hash.c:40
const char * GNUNET_MESSENGER_name_of_kind(enum GNUNET_MESSENGER_MessageKind kind)
Get the name of a message kind.
@ GNUNET_MESSENGER_KIND_TALK
The talk kind.
@ GNUNET_MESSENGER_KIND_MERGE
The merge kind.
@ GNUNET_MESSENGER_FLAG_SENT
The sent flag.
@ GNUNET_MESSENGER_FLAG_NONE
The none flag.
@ GNUNET_MESSENGER_FLAG_PEER
The peer flag.
@ GNUNET_MESSENGER_FLAG_RECENT
The recent flag.
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct.
#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_RECV_MESSAGE
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition time.c:737
void encode_message(const struct GNUNET_MESSENGER_Message *message, uint16_t length, char *buffer, enum GNUNET_GenericReturnValue include_header)
Encodes a given message into a buffer of a maximum length in bytes.
enum GNUNET_GenericReturnValue is_peer_message(const struct GNUNET_MESSENGER_Message *message)
Returns whether a specific kind of message can be sent by the service without usage of a clients priv...
uint16_t get_message_size(const struct GNUNET_MESSENGER_Message *message, enum GNUNET_GenericReturnValue include_header)
Returns the exact size in bytes to encode a given message.
A 512-bit hashcode.
struct GNUNET_MESSENGER_MessageTalk talk
enum GNUNET_MESSENGER_MessageKind kind
The kind of the message.
struct GNUNET_TIME_AbsoluteNBO timestamp
The timestamp of the message.
struct GNUNET_ShortHashCode discourse
The hash of the discourse to talk.
struct GNUNET_MESSENGER_MessageBody body
Body.
Message to receive something from a room.
struct GNUNET_MESSENGER_SrvMemberSession * member
The identity of the host (wraps the signing key of the peer).
Time for absolute times used by GNUnet, in microseconds.

References GNUNET_MESSENGER_Message::body, context, GNUNET_MESSENGER_MessageTalk::discourse, encode_message(), env, get_handle_member_session(), get_member_session_public_key(), get_member_subscription(), get_message_size(), get_message_state_merge_hash(), get_next_member_session_context(), get_srv_handle_member_id(), get_srv_room_key(), get_srv_room_member_store(), get_store_member(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_contains(), GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_RECV_MESSAGE, GNUNET_MESSENGER_FLAG_NONE, GNUNET_MESSENGER_FLAG_PEER, GNUNET_MESSENGER_FLAG_RECENT, GNUNET_MESSENGER_FLAG_SENT, GNUNET_MESSENGER_KIND_MERGE, GNUNET_MESSENGER_KIND_TALK, GNUNET_MESSENGER_name_of_kind(), GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_sh2s(), GNUNET_TIME_absolute_ntoh(), GNUNET_YES, handle, has_subscription_of_timestamp(), GNUNET_MESSENGER_Message::header, id, identity, is_peer_message(), key, GNUNET_MESSENGER_MessageHeader::kind, GNUNET_MESSENGER_SenderSession::member, merge_srv_handle_room_to_sync(), GNUNET_VPN_Handle::mq, msg, GNUNET_MESSENGER_SenderSession::peer, pubkey, GNUNET_MESSENGER_SrvRoom::state, GNUNET_MESSENGER_MessageBody::talk, GNUNET_MESSENGER_MessageHeader::timestamp, and timestamp().

Referenced by callback_found_message(), handle_service_message(), notify_about_members(), and traverse_epoch_session_message().

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

◆ iterate_next_member_ids()

static enum GNUNET_GenericReturnValue iterate_next_member_ids ( void *  cls,
const struct GNUNET_HashCode *  key,
void *  value 
)
static

Definition at line 777 of file gnunet-service-messenger_handle.c.

780{
783
784 GNUNET_assert ((cls) && (value));
785
786 handle = cls;
787 next = value;
788
790 "Notifying client about next member id: %s (%s)\n",
791 GNUNET_sh2s (&(next->id)), GNUNET_h2s (key));
792
793 {
795 struct GNUNET_MQ_Envelope *env;
796
799
800 GNUNET_memcpy (&(msg->key), key, sizeof(*key));
801 GNUNET_memcpy (&(msg->id), &(next->id), sizeof(next->id));
802 msg->reset = (uint32_t) next->reset;
803
805 }
806
808 return GNUNET_YES;
809}
#define GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_MEMBER_ID
Message to receive the current member id of a handle in room.
struct GNUNET_MQ_Envelope * next
Messages are stored in a linked list.
Definition mq.c:39

References env, GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_MEMBER_ID, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_sh2s(), GNUNET_YES, handle, GNUNET_MESSENGER_NextMemberId::id, key, GNUNET_VPN_Handle::mq, msg, GNUNET_MQ_Envelope::next, and value.

Referenced by task_notify_srv_handle_member_id().

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

◆ task_notify_srv_handle_member_id()

static void task_notify_srv_handle_member_id ( void *  cls)
static

Definition at line 813 of file gnunet-service-messenger_handle.c.

814{
816
817 GNUNET_assert (cls);
818
819 handle = cls;
820 handle->notify = NULL;
821
825}
static enum GNUNET_GenericReturnValue iterate_next_member_ids(void *cls, const struct GNUNET_HashCode *key, void *value)
unsigned int GNUNET_CONTAINER_multihashmap_clear(struct GNUNET_CONTAINER_MultiHashMap *map)
Remove all entries from the map.

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_clear(), GNUNET_CONTAINER_multihashmap_iterate(), handle, and iterate_next_member_ids().

Referenced by notify_srv_handle_member_id().

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

◆ notify_srv_handle_member_id()

void notify_srv_handle_member_id ( struct GNUNET_MESSENGER_SrvHandle *  handle,
struct GNUNET_MESSENGER_SrvRoom *  room,
const struct GNUNET_ShortHashCode *  member_id,
enum GNUNET_GenericReturnValue  reset 
)

Notifies the handle that a new member id needs to be used.

Parameters
[in,out]handleHandle
[in]roomRoom of the member
[in]member_idMember id
[in]resetReset member session with join message

Definition at line 829 of file gnunet-service-messenger_handle.c.

833{
836 const struct GNUNET_HashCode *key;
837
838 GNUNET_assert ((handle) && (room) && (member_id));
839
841 key = get_srv_room_key (room);
842
843 if (! next)
844 {
846 "Allocation of next member id failed: %s (%s)\n",
847 GNUNET_sh2s (member_id), GNUNET_h2s (key));
848 return;
849 }
850
851 GNUNET_memcpy (&(next->id), member_id, sizeof(next->id));
852 next->reset = reset;
853
854 prev = GNUNET_CONTAINER_multihashmap_get (handle->next_ids, key);
855
857 next,
859 {
861 "Update of next member id failed: %s (%s)\n",
862 GNUNET_sh2s (member_id), GNUNET_h2s (key));
863 return;
864 }
865
866 if (prev)
867 GNUNET_free (prev);
868
869 if (! handle->notify)
871 handle);
872}
static int reset
Reset argument.
static void task_notify_srv_handle_member_id(void *cls)
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition scheduler.c:1310

References get_srv_room_key(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_get(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE, GNUNET_ERROR_TYPE_WARNING, GNUNET_free, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_new, GNUNET_SCHEDULER_add_now(), GNUNET_sh2s(), GNUNET_YES, handle, GNUNET_MESSENGER_NextMemberId::id, key, reset, GNUNET_MESSENGER_NextMemberId::reset, and task_notify_srv_handle_member_id().

Referenced by join_room(), and solve_srv_room_member_collisions().

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