GNUnet 0.28.0-dev.3-7-g31e20e2e6
 
Loading...
Searching...
No Matches
gnunet-service-messenger_member_session.h File Reference
Include dependency graph for gnunet-service-messenger_member_session.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_SrvMemberSession
 

Functions

struct GNUNET_MESSENGER_SrvMemberSessioncreate_member_session (struct GNUNET_MESSENGER_Member *member, const struct GNUNET_CRYPTO_BlindablePublicKey *pubkey)
 Creates and allocates a new member session of a member with a given public key.
 
struct GNUNET_MESSENGER_SrvMemberSessionswitch_member_session (struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
 Creates and allocates a new member session closing and replacing a given other session of the same member.
 
void destroy_member_session (struct GNUNET_MESSENGER_SrvMemberSession *session)
 Destroys a member session and frees its memory fully.
 
enum GNUNET_GenericReturnValue reset_member_session (struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash)
 Resets a given member session which re-opens a member session for new usage.
 
void close_member_session (struct GNUNET_MESSENGER_SrvMemberSession *session)
 Closes a given member session which opens the request for completion of the given member session.
 
enum GNUNET_GenericReturnValue is_member_session_closed (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns if the given member session has been closed.
 
enum GNUNET_GenericReturnValue is_member_session_completed (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns if the given member session has been completed.
 
struct GNUNET_TIME_Absolute get_member_session_start (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns the timestamp of the member session's start.
 
const struct GNUNET_HashCodeget_member_session_key (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns the key of the room a given member session belongs to.
 
const struct GNUNET_ShortHashCodeget_member_session_id (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns the member id of a given member session.
 
const struct GNUNET_CRYPTO_BlindablePublicKeyget_member_session_public_key (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns the public key of a given member session.
 
const struct GNUNET_HashCodeget_member_session_context (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns the member context of a given member session.
 
struct GNUNET_MESSENGER_Contactget_member_session_contact (struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns the contact which is connected to a given member session.
 
enum GNUNET_GenericReturnValue verify_member_session_as_sender (const struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
 Verifies a given member session as sender of a selected message and its hash.
 
enum GNUNET_GenericReturnValue check_member_session_history (const struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash, enum GNUNET_GenericReturnValue ownership)
 Checks the history of a session for a specific message which is identified by its hash and if the ownership flag is set, if the message is owned by the sessions contact.
 
void update_member_session_history (struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
 Adds a given message to the history of a session using the messages hash.
 
void clear_member_session_history (struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash)
 Removes a message from the history of a session using the messages hash.
 
void load_member_session (struct GNUNET_MESSENGER_Member *member, const char *directory)
 Loads data from a directory into a new allocated and created member session of a member if the required information can be read from the content of the given directory.
 
void load_member_session_next (struct GNUNET_MESSENGER_SrvMemberSession *session, const char *directory)
 Loads the connection from one session to another through the next attribute.
 
void save_member_session (struct GNUNET_MESSENGER_SrvMemberSession *session, const char *directory)
 Saves data from a member session into a directory which can be load to restore the member session completely.
 

Function Documentation

◆ create_member_session()

struct GNUNET_MESSENGER_SrvMemberSession * create_member_session ( struct GNUNET_MESSENGER_Member member,
const struct GNUNET_CRYPTO_BlindablePublicKey pubkey 
)

Creates and allocates a new member session of a member with a given public key.

If the creation fails, NULL gets returned.

Parameters
[in,out]memberMember
[in]pubkeyPublic key
Returns
New member session

Definition at line 34 of file gnunet-service-messenger_member_session.c.

36{
38
39 if ((! member) || (! pubkey) || (! (member->store)))
40 return NULL;
41
42 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Create new member session!\n");
43
45 session->member = member;
46
47 GNUNET_memcpy (&(session->public_key), pubkey, sizeof(session->public_key));
48
50 get_member_session_key (session),
51 get_member_session_id (session),
52 &(session->context));
53
54 {
56
57 store = get_member_contact_store (member->store);
58
59 session->contact = get_store_contact (
60 store,
63 }
64
65 if (! (session->contact))
66 {
67 GNUNET_free (session);
68 return NULL;
69 }
70
72
74
75 init_list_messages (&(session->messages));
76
77 session->prev = NULL;
78 session->next = NULL;
79
80 session->start = GNUNET_TIME_absolute_get ();
81
82 session->closed = GNUNET_NO;
83 session->completed = GNUNET_NO;
84
85 return session;
86}
static struct GNUNET_CRYPTO_BlindablePublicKey pubkey
Public key of the zone to look in.
void init_list_messages(struct GNUNET_MESSENGER_ListMessages *messages)
Initializes list of message hashes as empty list.
const struct GNUNET_ShortHashCode * get_member_session_id(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the member id of a given member session.
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_member_session_context(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the member context of a given member session.
const struct GNUNET_HashCode * get_member_session_key(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the key of the room a given member session belongs to.
struct GNUNET_MESSENGER_ContactStore * get_member_contact_store(struct GNUNET_MESSENGER_MemberStore *store)
Returns the used contact store of a given member store.
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
#define GNUNET_log(kind,...)
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
@ GNUNET_NO
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition time.c:111
void increase_contact_rc(struct GNUNET_MESSENGER_Contact *contact)
Increases the reference counter of a given contact which is zero as default.
void get_context_from_member(const struct GNUNET_HashCode *key, const struct GNUNET_ShortHashCode *id, struct GNUNET_HashCode *context)
Calculates the context hash of a member in a room and returns it.
struct GNUNET_MESSENGER_Contact * get_store_contact(struct GNUNET_MESSENGER_ContactStore *store, const struct GNUNET_HashCode *context, const struct GNUNET_CRYPTO_BlindablePublicKey *pubkey)
Returns a contact using a specific public key.
struct GNUNET_MESSENGER_MemberStore * store
struct GNUNET_MESSENGER_SrvMemberSession * next
struct GNUNET_MESSENGER_SrvMemberSession * prev
struct GNUNET_CRYPTO_BlindablePublicKey public_key

References GNUNET_MESSENGER_SrvMemberSession::closed, GNUNET_MESSENGER_SrvMemberSession::completed, GNUNET_MESSENGER_SrvMemberSession::contact, GNUNET_MESSENGER_SrvMemberSession::context, get_context_from_member(), get_member_contact_store(), get_member_session_context(), get_member_session_id(), get_member_session_key(), get_member_session_public_key(), get_store_contact(), GNUNET_CONTAINER_multihashmap_create(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_memcpy, GNUNET_new, GNUNET_NO, GNUNET_TIME_absolute_get(), GNUNET_MESSENGER_SrvMemberSession::history, increase_contact_rc(), init_list_messages(), GNUNET_MESSENGER_SrvMemberSession::member, GNUNET_MESSENGER_SrvMemberSession::messages, GNUNET_MESSENGER_SrvMemberSession::next, GNUNET_MESSENGER_SrvMemberSession::prev, pubkey, GNUNET_MESSENGER_SrvMemberSession::public_key, GNUNET_MESSENGER_SrvMemberSession::start, and GNUNET_MESSENGER_Member::store.

Referenced by load_member_session(), and try_member_session().

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

◆ switch_member_session()

struct GNUNET_MESSENGER_SrvMemberSession * switch_member_session ( struct GNUNET_MESSENGER_SrvMemberSession session,
const struct GNUNET_MESSENGER_Message message,
const struct GNUNET_HashCode hash 
)

Creates and allocates a new member session closing and replacing a given other session of the same member.

The new session could have significant changes to the members public key or its member id depending on the used message to switch session. The new session will be linked to the old one.

Parameters
[in,out]sessionOld member session
[in]messageMessage
[in]hashHash of message
Returns
New member session

Definition at line 259 of file gnunet-service-messenger_member_session.c.

262{
263 struct GNUNET_MESSENGER_MemberStore *store;
265
266 if ((! session) || (! message) || (! hash))
267 return NULL;
268
271
272 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Switch member session!\n");
273
274 store = get_session_member_store (session);
276
277 if (GNUNET_MESSENGER_KIND_ID == message->header.kind)
278 {
279 next->member = add_store_member (store,
280 &(message->body.id.id));
281 if (! next->member)
282 {
284 "Failed to switch member session to ID: %s\n",
285 GNUNET_sh2s (&(message->body.id.id)));
286
288 return NULL;
289 }
290 }
291 else
292 {
293 if (! session->member)
294 {
296 "Failed to switch member session\n");
297
299 return NULL;
300 }
301
302 next->member = session->member;
303 }
304
305 if (GNUNET_MESSENGER_KIND_KEY == message->header.kind)
306 GNUNET_memcpy (&(next->public_key), &(message->body.key.key),
307 sizeof(next->public_key));
308 else
310 sizeof(next->public_key));
311
315 &(next->context));
316
323
325
326 if (! (next->contact))
327 {
329 return NULL;
330 }
331
333
336 GNUNET_NO);
337
339 next);
340
342 copy_list_messages (&(next->messages), &(session->messages));
343
344 session->next = next;
345 next->prev = session;
346 next->next = NULL;
347
349
350 session->closed = GNUNET_YES;
353
355
356 return next;
357}
void copy_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const struct GNUNET_MESSENGER_ListMessages *origin)
Copies all message hashes from an origin to another list.
static void check_member_session_completion(struct GNUNET_MESSENGER_SrvMemberSession *session)
static enum GNUNET_GenericReturnValue iterate_copy_history(void *cls, const struct GNUNET_HashCode *key, void *value)
struct GNUNET_MESSENGER_Contact * get_member_session_contact(struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the contact which is connected to a given member session.
static struct GNUNET_MESSENGER_MemberStore * get_session_member_store(const struct GNUNET_MESSENGER_SrvMemberSession *session)
struct GNUNET_MESSENGER_Member * add_store_member(struct GNUNET_MESSENGER_MemberStore *store, const struct GNUNET_ShortHashCode *id)
Adds a member to a store under a specific id and returns it on success.
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
unsigned int GNUNET_CONTAINER_multihashmap_size(const struct GNUNET_CONTAINER_MultiHashMap *map)
Get the number of key-value pairs in the map.
@ GNUNET_YES
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
const char * GNUNET_sh2s(const struct GNUNET_ShortHashCode *shc)
Convert a short hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_MESSENGER_KIND_KEY
The key kind.
@ GNUNET_MESSENGER_KIND_ID
The id kind.
void update_store_contact(struct GNUNET_MESSENGER_ContactStore *store, struct GNUNET_MESSENGER_Contact *contact, const struct GNUNET_HashCode *context, const struct GNUNET_HashCode *next_context, const struct GNUNET_CRYPTO_BlindablePublicKey *pubkey)
Moves a contact from the store to another location matching a given public key and member context.
struct GNUNET_MESSENGER_MessageId id
struct GNUNET_MESSENGER_MessageKey key
enum GNUNET_MESSENGER_MessageKind kind
The kind of the message.
struct GNUNET_ShortHashCode id
The new id which will replace the senders id in a room.
struct GNUNET_CRYPTO_BlindablePublicKey key
The new blindable public key which replaces the current senders public key.
struct GNUNET_MESSENGER_MessageHeader header
Header.
struct GNUNET_MESSENGER_MessageBody body
Body.

References add_store_member(), GNUNET_MESSENGER_Message::body, check_member_session_completion(), GNUNET_MESSENGER_SrvMemberSession::closed, GNUNET_MESSENGER_SrvMemberSession::completed, GNUNET_MESSENGER_SrvMemberSession::contact, GNUNET_MESSENGER_SrvMemberSession::context, copy_list_messages(), get_context_from_member(), get_member_contact_store(), get_member_session_contact(), get_member_session_context(), get_member_session_id(), get_member_session_key(), get_member_session_public_key(), get_session_member_store(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_create(), GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_CONTAINER_multihashmap_size(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_memcpy, GNUNET_MESSENGER_KIND_ID, GNUNET_MESSENGER_KIND_KEY, GNUNET_new, GNUNET_NO, GNUNET_sh2s(), GNUNET_TIME_absolute_get(), GNUNET_YES, GNUNET_MESSENGER_Message::header, GNUNET_MESSENGER_SrvMemberSession::history, GNUNET_MESSENGER_MessageId::id, GNUNET_MESSENGER_MessageBody::id, increase_contact_rc(), init_list_messages(), iterate_copy_history(), GNUNET_MESSENGER_MessageKey::key, GNUNET_MESSENGER_MessageBody::key, GNUNET_MESSENGER_MessageHeader::kind, GNUNET_MESSENGER_SrvMemberSession::member, GNUNET_MESSENGER_SrvMemberSession::messages, GNUNET_MESSENGER_SrvMemberSession::next, GNUNET_MESSENGER_SrvMemberSession::prev, GNUNET_MESSENGER_SrvMemberSession::public_key, GNUNET_MESSENGER_SrvMemberSession::start, and update_store_contact().

Referenced by handle_member_session_switch().

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

◆ destroy_member_session()

void destroy_member_session ( struct GNUNET_MESSENGER_SrvMemberSession session)

Destroys a member session and frees its memory fully.

Parameters
[in,out]sessionMember session

Definition at line 361 of file gnunet-service-messenger_member_session.c.

362{
363 struct GNUNET_MESSENGER_MemberStore *store;
364 struct GNUNET_MESSENGER_Contact *contact;
365
366 GNUNET_assert (session);
367
369
370 clear_list_messages (&(session->messages));
371
372 store = get_session_member_store (session);
373 contact = get_member_session_contact (session);
374
375 if ((contact) && (GNUNET_YES == decrease_contact_rc (contact)))
378 contact,
380
381 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Free member session!\n");
382 GNUNET_free (session);
383}
void clear_list_messages(struct GNUNET_MESSENGER_ListMessages *messages)
Clears the list of message hashes.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
enum GNUNET_GenericReturnValue decrease_contact_rc(struct GNUNET_MESSENGER_Contact *contact)
Decreases the reference counter if possible (can not underflow!) of a given contact and returns GNUNE...
void remove_store_contact(struct GNUNET_MESSENGER_ContactStore *store, struct GNUNET_MESSENGER_Contact *contact, const struct GNUNET_HashCode *context)
Removes a contact from the store which uses a given member context.

References clear_list_messages(), decrease_contact_rc(), get_member_contact_store(), get_member_session_contact(), get_member_session_context(), get_session_member_store(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_YES, GNUNET_MESSENGER_SrvMemberSession::history, GNUNET_MESSENGER_SrvMemberSession::messages, and remove_store_contact().

Referenced by iterate_destroy_session(), and remove_room_member_session().

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

◆ reset_member_session()

enum GNUNET_GenericReturnValue reset_member_session ( struct GNUNET_MESSENGER_SrvMemberSession session,
const struct GNUNET_HashCode hash 
)

Resets a given member session which re-opens a member session for new usage.

Every connection to other sessions will be be dropped. The member sessions messages will be cleared but old history from uncompleted sessions however can be reused!

Parameters
[in,out]sessionMember session
[in]hashHash of initial message (JOIN message!)
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

Definition at line 387 of file gnunet-service-messenger_member_session.c.

389{
390 struct GNUNET_MESSENGER_Contact *contact;
391
392 GNUNET_assert ((session) && (hash));
393
394 {
395 struct GNUNET_MESSENGER_MemberStore *member_store;
396 struct GNUNET_MESSENGER_ContactStore *store;
397
398 member_store = get_session_member_store (session);
399 store = get_member_contact_store (member_store);
400 contact = get_store_contact (
401 store,
404 }
405
406 if (! contact)
407 return GNUNET_SYSERR;
408
409 if (contact == session->contact)
410 goto clear_messages;
411
412 session->contact = contact;
413 increase_contact_rc (session->contact);
414
415clear_messages:
416 clear_list_messages (&(session->messages));
417 add_to_list_messages (&(session->messages), hash);
418
419 session->next = NULL;
420 session->closed = GNUNET_NO;
421 session->completed = GNUNET_NO;
422
423 return GNUNET_OK;
424}
void add_to_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const struct GNUNET_HashCode *hash)
Adds a specific hash from a message to the end of the list.
@ GNUNET_OK
@ GNUNET_SYSERR

References add_to_list_messages(), clear_list_messages(), GNUNET_MESSENGER_SrvMemberSession::closed, GNUNET_MESSENGER_SrvMemberSession::completed, GNUNET_MESSENGER_SrvMemberSession::contact, get_member_contact_store(), get_member_session_context(), get_member_session_public_key(), get_session_member_store(), get_store_contact(), GNUNET_assert, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, increase_contact_rc(), GNUNET_MESSENGER_SrvMemberSession::messages, and GNUNET_MESSENGER_SrvMemberSession::next.

Referenced by handle_message_join().

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

◆ close_member_session()

void close_member_session ( struct GNUNET_MESSENGER_SrvMemberSession session)

Closes a given member session which opens the request for completion of the given member session.

Closing a session may complete a session and can't be used without a reset! (

See also
reset_member_session() )
Parameters
[in,out]sessionMember session

Definition at line 428 of file gnunet-service-messenger_member_session.c.

429{
430 GNUNET_assert (session);
431
432 session->closed = GNUNET_YES;
434}

References check_member_session_completion(), GNUNET_MESSENGER_SrvMemberSession::closed, GNUNET_assert, and GNUNET_YES.

Referenced by handle_message_leave().

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

◆ is_member_session_closed()

enum GNUNET_GenericReturnValue is_member_session_closed ( const struct GNUNET_MESSENGER_SrvMemberSession session)

Returns if the given member session has been closed.

Parameters
[in]sessionMember session
Returns
GNUNET_YES or GNUNET_NO

Definition at line 438 of file gnunet-service-messenger_member_session.c.

440{
441 GNUNET_assert (session);
442
443 return session->closed;
444}

References GNUNET_MESSENGER_SrvMemberSession::closed, and GNUNET_assert.

◆ is_member_session_completed()

enum GNUNET_GenericReturnValue is_member_session_completed ( const struct GNUNET_MESSENGER_SrvMemberSession session)

Returns if the given member session has been completed.

A completed member session can't verify any message as its own and it won't add any message to its history.

Parameters
[in]sessionMember session
Returns
GNUNET_YES or GNUNET_NO

Definition at line 448 of file gnunet-service-messenger_member_session.c.

450{
451 GNUNET_assert (session);
452
453 return session->completed;
454}

References GNUNET_MESSENGER_SrvMemberSession::completed, and GNUNET_assert.

Referenced by check_member_session_completion(), iterate_epoch_session_members(), iterate_forward_members(), iterate_notify_about_members(), iterate_update_member_sessions(), update_member_session_history(), and verify_member_session_as_sender().

Here is the caller graph for this function:

◆ get_member_session_start()

struct GNUNET_TIME_Absolute get_member_session_start ( const struct GNUNET_MESSENGER_SrvMemberSession session)

Returns the timestamp of the member session's start.

Parameters
[in]sessionMember session
Returns
Absolute timestamp

Definition at line 458 of file gnunet-service-messenger_member_session.c.

460{
461 GNUNET_assert (session);
462
463 if (session->prev)
464 return get_member_session_start (session->prev);
465
466 return session->start;
467}
struct GNUNET_TIME_Absolute get_member_session_start(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the timestamp of the member session's start.

References get_member_session_start(), and GNUNET_assert.

Referenced by get_member_session_start(), and solve_srv_room_member_collisions().

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

◆ get_member_session_key()

const struct GNUNET_HashCode * get_member_session_key ( const struct GNUNET_MESSENGER_SrvMemberSession session)

Returns the key of the room a given member session belongs to.

Parameters
[in]sessionMember session
Returns
Key of room

Definition at line 471 of file gnunet-service-messenger_member_session.c.

472{
473 const struct GNUNET_MESSENGER_MemberStore *store;
474
475 GNUNET_assert ((session) && (session->member));
476
477 store = get_session_member_store (session);
478
479 return get_member_store_key (store);
480}
const struct GNUNET_HashCode * get_member_store_key(const struct GNUNET_MESSENGER_MemberStore *store)
Returns the shared secret you need to access a room of the store.

References get_member_store_key(), get_session_member_store(), GNUNET_assert, and GNUNET_MESSENGER_SrvMemberSession::member.

Referenced by create_member_session(), and switch_member_session().

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

◆ get_member_session_id()

const struct GNUNET_ShortHashCode * get_member_session_id ( const struct GNUNET_MESSENGER_SrvMemberSession session)

Returns the member id of a given member session.

Parameters
[in]sessionMember session
Returns
Member id

Definition at line 484 of file gnunet-service-messenger_member_session.c.

485{
486 GNUNET_assert (session);
487
488 return get_member_id (session->member);
489}
const struct GNUNET_ShortHashCode * get_member_id(const struct GNUNET_MESSENGER_Member *member)
Returns the current id of a given member.

References get_member_id(), GNUNET_assert, and GNUNET_MESSENGER_SrvMemberSession::member.

Referenced by check_member_session_completion(), create_member_session(), delete_srv_room_message(), find_member_session_in_room(), iterate_epoch_session_members(), iterate_notify_about_members(), notify_about_members(), remove_room_member_session(), request_room_message_step(), save_member_session(), send_message_join(), switch_member_session(), traverse_epoch_session_message(), update_member_session_history(), and verify_member_session_as_sender().

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

◆ get_member_session_public_key()

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.

Parameters
[in]sessionMember session
Returns
Public key

Definition at line 493 of file gnunet-service-messenger_member_session.c.

495{
496 GNUNET_assert (session);
497
498 return &(session->public_key);
499}

References GNUNET_assert, and GNUNET_MESSENGER_SrvMemberSession::public_key.

Referenced by add_member_session(), create_member_session(), handle_message_id(), iterate_member_sessions_it(), notify_srv_handle_message(), remove_member_session(), remove_room_member_session(), reset_member_session(), save_member_session(), switch_member_session(), and verify_member_session_as_sender().

Here is the caller graph for this function:

◆ get_member_session_context()

const struct GNUNET_HashCode * get_member_session_context ( const struct GNUNET_MESSENGER_SrvMemberSession session)

Returns the member context of a given member session.

Parameters
[in]sessionMember session
Returns
Member context as hash

Definition at line 503 of file gnunet-service-messenger_member_session.c.

505{
506 GNUNET_assert (session);
507
508 return &(session->context);
509}

References GNUNET_MESSENGER_SrvMemberSession::context, and GNUNET_assert.

Referenced by check_member_session_completion(), create_member_session(), destroy_member_session(), get_next_member_session_context(), reset_member_session(), and switch_member_session().

Here is the caller graph for this function:

◆ get_member_session_contact()

struct GNUNET_MESSENGER_Contact * get_member_session_contact ( struct GNUNET_MESSENGER_SrvMemberSession session)

Returns the contact which is connected to a given member session.

Parameters
[in]sessionMember session
Returns
Contact

Definition at line 513 of file gnunet-service-messenger_member_session.c.

514{
515 GNUNET_assert (session);
516
517 return session->contact;
518}

References GNUNET_MESSENGER_SrvMemberSession::contact, and GNUNET_assert.

Referenced by destroy_member_session(), and switch_member_session().

Here is the caller graph for this function:

◆ verify_member_session_as_sender()

enum GNUNET_GenericReturnValue verify_member_session_as_sender ( const struct GNUNET_MESSENGER_SrvMemberSession session,
const struct GNUNET_MESSENGER_Message message,
const struct GNUNET_HashCode hash 
)

Verifies a given member session as sender of a selected message and its hash.

The function returns GNUNET_OK if the message session is verified as sender, otherwise GNUNET_SYSERR.

See also
is_member_session_completed() for verification.
Parameters
[in]sessionMember session
[in]messageMessage
[in]hashHash of message
Returns
GNUNET_OK on success, otherwise GNUNET_SYSERR

Definition at line 522 of file gnunet-service-messenger_member_session.c.

526{
527 GNUNET_assert ((session) && (message) && (hash));
528
530 {
531 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Check message (%s) using history!\n",
532 GNUNET_h2s (hash));
533
534 if (GNUNET_YES == check_member_session_history (session, hash, GNUNET_YES))
535 return GNUNET_OK;
536 else
537 return GNUNET_SYSERR;
538 }
539
540 if (0 != GNUNET_memcmp (get_member_session_id (session),
541 &(message->header.sender_id)))
542 return GNUNET_SYSERR;
543
544 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Check message (%s) using key: %s\n",
545 GNUNET_h2s (hash),
548
549 return verify_message (message, hash, get_member_session_public_key (
550 session));
551}
enum GNUNET_GenericReturnValue is_member_session_completed(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns if the given member session has been completed.
enum GNUNET_GenericReturnValue check_member_session_history(const struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash, enum GNUNET_GenericReturnValue ownership)
Checks the history of a session for a specific message which is identified by its hash and if the own...
char * GNUNET_CRYPTO_blindable_public_key_to_string(const struct GNUNET_CRYPTO_BlindablePublicKey *key)
Creates a (Base32) string representation of the public key.
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
enum GNUNET_GenericReturnValue verify_message(const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash, const struct GNUNET_CRYPTO_BlindablePublicKey *key)
Verifies the signature of a given message and its hash with a specific public key.
struct GNUNET_ShortHashCode sender_id
The senders id inside of the room the message was sent in.

References check_member_session_history(), get_member_session_id(), get_member_session_public_key(), GNUNET_assert, GNUNET_CRYPTO_blindable_public_key_to_string(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_memcmp, GNUNET_OK, GNUNET_SYSERR, GNUNET_YES, GNUNET_MESSENGER_Message::header, is_member_session_completed(), GNUNET_MESSENGER_MessageHeader::sender_id, and verify_message().

Referenced by iterate_search_session(), and update_member_session_history().

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

◆ check_member_session_history()

enum GNUNET_GenericReturnValue check_member_session_history ( const struct GNUNET_MESSENGER_SrvMemberSession session,
const struct GNUNET_HashCode hash,
enum GNUNET_GenericReturnValue  ownership 
)

Checks the history of a session for a specific message which is identified by its hash and if the ownership flag is set, if the message is owned by the sessions contact.

Parameters
[in]sessionMember session
[in]hashHash of message
[in]ownershipOwnership flag
Returns
GNUNET_YES if found, otherwise GNUNET_NO

Definition at line 555 of file gnunet-service-messenger_member_session.c.

559{
560 GNUNET_assert ((session) && (hash));
561
562 if (GNUNET_YES == ownership)
563 return (NULL != GNUNET_CONTAINER_multihashmap_get (session->history, hash)?
565 else
566 return GNUNET_CONTAINER_multihashmap_contains (session->history, hash);
567}
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).
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_contains(), GNUNET_CONTAINER_multihashmap_get(), GNUNET_NO, GNUNET_YES, and GNUNET_MESSENGER_SrvMemberSession::history.

Referenced by check_member_session_completion(), delete_srv_room_message(), notify_about_members(), recv_message_request(), request_room_message_step(), and verify_member_session_as_sender().

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

◆ update_member_session_history()

void update_member_session_history ( struct GNUNET_MESSENGER_SrvMemberSession session,
const struct GNUNET_MESSENGER_Message message,
const struct GNUNET_HashCode hash 
)

Adds a given message to the history of a session using the messages hash.

The ownership will be set automatically.

See also
is_member_session_completed() for updating a history.
Parameters
[in,out]sessionMember session
[in]messageMessage
[in]hashHash of message

Definition at line 587 of file gnunet-service-messenger_member_session.c.

591{
592 GNUNET_assert ((session) && (message) && (hash));
593
595 {
597 "Updating session history (%s) failed: Session already completed!\n",
599 return;
600 }
601
603 "Updating sessions history (%s) += (%s)\n",
604 GNUNET_sh2s (get_member_session_id (session)), GNUNET_h2s (hash));
605
606 if (GNUNET_OK == verify_member_session_as_sender (session, message, hash))
607 {
608 if (GNUNET_YES == is_message_session_bound (message))
609 add_to_list_messages (&(session->messages), hash);
610
612 }
613 else
614 update_member_chain_history (session, hash, GNUNET_NO);
615
616 if (GNUNET_YES == session->closed)
618}
enum GNUNET_GenericReturnValue verify_member_session_as_sender(const struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
Verifies a given member session as sender of a selected message and its hash.
static void update_member_chain_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash, enum GNUNET_GenericReturnValue ownership)
@ GNUNET_ERROR_TYPE_WARNING
enum GNUNET_GenericReturnValue is_message_session_bound(const struct GNUNET_MESSENGER_Message *message)
Returns if the message should be bound to a member session.

References add_to_list_messages(), check_member_session_completion(), GNUNET_MESSENGER_SrvMemberSession::closed, get_member_session_id(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_h2s(), GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_sh2s(), GNUNET_YES, is_member_session_completed(), is_message_session_bound(), GNUNET_MESSENGER_SrvMemberSession::messages, update_member_chain_history(), and verify_member_session_as_sender().

Referenced by iterate_update_member_sessions().

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

◆ clear_member_session_history()

void clear_member_session_history ( struct GNUNET_MESSENGER_SrvMemberSession session,
const struct GNUNET_HashCode hash 
)

Removes a message from the history of a session using the messages hash.

Parameters
[in,out]sessionMember session
[in]hashHash of message

Definition at line 634 of file gnunet-service-messenger_member_session.c.

636{
637 GNUNET_assert ((session) && (hash));
638
639 clear_member_chain_history (session, hash);
640}
static void clear_member_chain_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash)

References clear_member_chain_history(), and GNUNET_assert.

Referenced by clear_member_chain_history().

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

◆ load_member_session()

void load_member_session ( struct GNUNET_MESSENGER_Member member,
const char *  directory 
)

Loads data from a directory into a new allocated and created member session of a member if the required information can be read from the content of the given directory.

Parameters
[out]memberMember
[in]directoryPath to a directory

Definition at line 699 of file gnunet-service-messenger_member_session.c.

701{
702 char *config_file;
703 struct GNUNET_MESSENGER_SrvMemberSession *session;
705
706 GNUNET_assert ((member) && (directory));
707
708 GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg");
709
710 session = NULL;
711
713 goto free_config;
714
716 "Load session configuration of member: %s\n", config_file);
717
719
720 if (! cfg)
721 goto free_config;
722
724 {
726 enum GNUNET_GenericReturnValue key_result;
727 unsigned long long numeric_value;
728 char *key_data;
729
731 "key", &key_data))
732 goto destroy_config;
733
735 ;
736 GNUNET_free (key_data);
737
738 if (GNUNET_OK != key_result)
739 goto destroy_config;
740
741 session = create_member_session (member, &key);
742
744 "start",
745 &numeric_value))
746 session->start.abs_value_us = numeric_value;
747
749 "closed",
750 &numeric_value))
751 session->closed = (GNUNET_YES == numeric_value? GNUNET_YES : GNUNET_NO);
752
754 "completed",
755 &numeric_value))
756 session->completed = (GNUNET_YES == numeric_value? GNUNET_YES :
757 GNUNET_NO);
758 }
759
760destroy_config:
762
763free_config:
765
766 if (! session)
767 return;
768
769 {
770 char *history_file;
771 GNUNET_asprintf (&history_file, "%s%s", directory, "history.map");
772
773 load_member_session_history (session, history_file);
774 GNUNET_free (history_file);
775 }
776
777 {
778 char *messages_file;
779 GNUNET_asprintf (&messages_file, "%s%s", directory, "messages.list");
780
781 load_list_messages (&(session->messages), messages_file);
782 GNUNET_free (messages_file);
783 }
784
785 add_member_session (member, session);
786}
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition gnunet-arm.c:108
static char * config_file
Set to the name of the config file used.
Definition gnunet-arm.c:83
struct GNUNET_HashCode key
The key used in the DHT.
void load_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const char *path)
Loads the list of message hashes from a file under a given path.
void add_member_session(struct GNUNET_MESSENGER_Member *member, struct GNUNET_MESSENGER_SrvMemberSession *session)
Adds a given member session to its member.
struct GNUNET_MESSENGER_SrvMemberSession * create_member_session(struct GNUNET_MESSENGER_Member *member, const struct GNUNET_CRYPTO_BlindablePublicKey *pubkey)
Creates and allocates a new member session of a member with a given public key.
static void load_member_session_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const char *path)
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(const struct GNUNET_OS_ProjectData *pd)
Create a new configuration object.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_parse(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Parse a configuration file, add all of the options in the file to the configuration environment.
enum GNUNET_GenericReturnValue GNUNET_DISK_file_test(const char *fil)
Check that fil corresponds to a filename (of a file that exists and that is not a directory).
Definition disk.c:557
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_blindable_public_key_from_string(const char *str, struct GNUNET_CRYPTO_BlindablePublicKey *key)
Parses a (Base32) string representation of the public key.
GNUNET_GenericReturnValue
Named constants for return values.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
An identity key as per LSD0001.
uint64_t abs_value_us
The actual value.

References GNUNET_TIME_Absolute::abs_value_us, add_member_session(), cfg, GNUNET_MESSENGER_SrvMemberSession::closed, GNUNET_MESSENGER_SrvMemberSession::completed, config_file, create_member_session(), GNUNET_asprintf(), GNUNET_assert, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_parse(), GNUNET_CRYPTO_blindable_public_key_from_string(), GNUNET_DISK_file_test(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_OS_project_data_gnunet(), GNUNET_YES, key, load_list_messages(), load_member_session_history(), GNUNET_MESSENGER_SrvMemberSession::messages, and GNUNET_MESSENGER_SrvMemberSession::start.

Referenced by callback_scan_for_sessions().

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

◆ load_member_session_next()

void load_member_session_next ( struct GNUNET_MESSENGER_SrvMemberSession session,
const char *  directory 
)

Loads the connection from one session to another through the next attribute.

Necessary information will be loaded from a configuration file inside of a given directory.

Parameters
[in,out]sessionMember session
[in]directoryPath to a directory

Definition at line 807 of file gnunet-service-messenger_member_session.c.

809{
811 char *config_file;
812
813
814 GNUNET_assert ((session) && (directory));
815
816 GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg");
817
819 goto free_config;
820
822 "Load next session configuration of member: %s\n", config_file);
823
825
826 if (! cfg)
827 goto free_config;
828
830 {
831 struct GNUNET_CRYPTO_BlindablePublicKey next_key;
832 enum GNUNET_GenericReturnValue key_result;
834 char *key_data;
835
837 "next_key",
838 &key_data))
839 goto destroy_config;
840
841 key_result = GNUNET_CRYPTO_blindable_public_key_from_string (key_data, &
842 next_key);
843 GNUNET_free (key_data);
844
845 if (GNUNET_OK != key_result)
846 goto destroy_config;
847
848 if (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "session", "next_id",
849 &next_id, sizeof(next_id)))
850 goto destroy_config;
851
852 {
853 struct GNUNET_MESSENGER_MemberStore *store;
854 struct GNUNET_MESSENGER_Member *member;
855
857 member = get_store_member (store, &next_id);
858
860 session,
861 member? get_member_session (member, &next_key) : NULL);
862 }
863
864 if (session->next)
865 session->next->prev = session;
866 }
867
868destroy_config:
870
871free_config:
873}
static char * next_id
Command-line option for namespace publishing: identifier for updates to this publication.
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.
static struct GNUNET_MESSENGER_SrvMemberSession * get_cycle_safe_next_session(struct GNUNET_MESSENGER_SrvMemberSession *session, struct GNUNET_MESSENGER_SrvMemberSession *next)
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.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_data(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, void *buf, size_t buf_size)
Get Crockford32-encoded fixed-size binary data from a configuration.
A 256-bit hashcode.

References cfg, config_file, get_cycle_safe_next_session(), get_member_session(), get_session_member_store(), get_store_member(), GNUNET_asprintf(), GNUNET_assert, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_get_data(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_parse(), GNUNET_CRYPTO_blindable_public_key_from_string(), GNUNET_DISK_file_test(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_OK, GNUNET_OS_project_data_gnunet(), GNUNET_YES, GNUNET_MESSENGER_SrvMemberSession::next, next_id, GNUNET_MESSENGER_SrvMemberSession::prev, and GNUNET_MESSENGER_Member::store.

Referenced by iterate_load_next_session().

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

◆ save_member_session()

void save_member_session ( struct GNUNET_MESSENGER_SrvMemberSession session,
const char *  directory 
)

Saves data from a member session into a directory which can be load to restore the member session completely.

Parameters
[in]sessionMember session
[in]directoryPath to a directory

Definition at line 931 of file gnunet-service-messenger_member_session.c.

933{
935 char *config_file;
936 char *key_data;
937
938 GNUNET_assert ((session) && (directory));
939
940 GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg");
941
943 "Save session configuration of member: %s\n", config_file);
944
946
947 if (! cfg)
948 goto free_config;
949
952
953 if (key_data)
954 {
955 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "key", key_data);
956 GNUNET_free (key_data);
957 }
958
959 if (session->next)
960 {
962 session->next);
963
964 char *next_id_data = GNUNET_STRINGS_data_to_string_alloc (next_id,
965 sizeof(*next_id));
966
967 if (next_id_data)
968 {
969 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_id",
970 next_id_data);
971 GNUNET_free (next_id_data);
972 }
973
976
977 if (key_data)
978 {
979 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_key",
980 key_data);
981 GNUNET_free (key_data);
982 }
983 }
984
985 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "start",
986 session->start.abs_value_us);
987
988 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "closed",
989 session->closed);
990 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "completed",
991 session->completed);
992
995
996free_config:
998
999 {
1000 char *history_file;
1001 GNUNET_asprintf (&history_file, "%s%s", directory, "history.map");
1002
1003 save_member_session_history (session, history_file);
1004 GNUNET_free (history_file);
1005 }
1006
1007 {
1008 char *messages_file;
1009 GNUNET_asprintf (&messages_file, "%s%s", directory, "messages.list");
1010
1011 save_list_messages (&(session->messages), messages_file);
1012 GNUNET_free (messages_file);
1013 }
1014}
void save_list_messages(const struct GNUNET_MESSENGER_ListMessages *messages, const char *path)
Saves the list of message hashes to a file under a given path.
static void save_member_session_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const char *path)
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
void GNUNET_CONFIGURATION_set_value_number(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long number)
Set a configuration value that should be a number.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_write(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Write configuration file.
char * GNUNET_STRINGS_data_to_string_alloc(const void *buf, size_t size)
Return the base32crockford encoding of the given buffer.
Definition strings.c:818

References GNUNET_TIME_Absolute::abs_value_us, cfg, GNUNET_MESSENGER_SrvMemberSession::closed, GNUNET_MESSENGER_SrvMemberSession::completed, config_file, get_member_session_id(), get_member_session_public_key(), GNUNET_asprintf(), GNUNET_assert, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_set_value_number(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_CONFIGURATION_write(), GNUNET_CRYPTO_blindable_public_key_to_string(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_OS_project_data_gnunet(), GNUNET_STRINGS_data_to_string_alloc(), GNUNET_MESSENGER_SrvMemberSession::messages, GNUNET_MESSENGER_SrvMemberSession::next, next_id, save_list_messages(), save_member_session_history(), and GNUNET_MESSENGER_SrvMemberSession::start.

Referenced by iterate_save_session().

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