GNUnet 0.29.1-6-gb66d952d5
 
Loading...
Searching...
No Matches
gnunet-service-messenger_handle.h File Reference
Include dependency graph for gnunet-service-messenger_handle.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_SrvHandleSync
 
struct  GNUNET_MESSENGER_SrvHandle
 

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).
 
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.
 
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.
 
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 *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.
 
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.
 
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.
 
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:

◆ 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.
#define GNUNET_free(ptr)
Wrapper around free.
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}
struct GNUNET_HashCode key
The key used in the DHT.
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:

◆ 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}
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,...)
#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_OK
@ GNUNET_SYSERR
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
A 256-bit hashcode.

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.
@ GNUNET_YES

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.
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.
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:

◆ 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.
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.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE
Allow multiple values with the same key.
struct GNUNET_MESSENGER_MessageState state

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:

◆ 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_CRYPTO_BlindablePublicKey pubkey
Public key of the zone to look in.
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)
static const struct GNUNET_HashCode * get_next_member_session_context(const struct GNUNET_MESSENGER_SrvMemberSession *session)
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.
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.
const struct GNUNET_HashCode * get_srv_room_key(const struct GNUNET_MESSENGER_SrvRoom *room)
Returns the shared secret you need to access a room.
struct GNUNET_MESSENGER_MemberStore * get_srv_room_member_store(struct GNUNET_MESSENGER_SrvRoom *room)
Returns the used member store of a given 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.
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_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:

◆ 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: