aboutsummaryrefslogtreecommitdiff
path: root/src/messenger/gnunet-service-messenger_member_session.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/messenger/gnunet-service-messenger_member_session.c')
-rw-r--r--src/messenger/gnunet-service-messenger_member_session.c507
1 files changed, 297 insertions, 210 deletions
diff --git a/src/messenger/gnunet-service-messenger_member_session.c b/src/messenger/gnunet-service-messenger_member_session.c
index 2e26fd228..361fb9966 100644
--- a/src/messenger/gnunet-service-messenger_member_session.c
+++ b/src/messenger/gnunet-service-messenger_member_session.c
@@ -35,44 +35,46 @@ struct GNUNET_MESSENGER_MemberSession*
35create_member_session (struct GNUNET_MESSENGER_Member *member, 35create_member_session (struct GNUNET_MESSENGER_Member *member,
36 const struct GNUNET_IDENTITY_PublicKey *pubkey) 36 const struct GNUNET_IDENTITY_PublicKey *pubkey)
37{ 37{
38 if ((!member) || (!pubkey) || (!(member->store))) 38 if ((! member) || (! pubkey) || (! (member->store)))
39 return NULL; 39 return NULL;
40 40
41 struct GNUNET_MESSENGER_MemberSession *session = GNUNET_new(struct GNUNET_MESSENGER_MemberSession); 41 struct GNUNET_MESSENGER_MemberSession *session = GNUNET_new (struct
42 GNUNET_MESSENGER_MemberSession);
42 session->member = member; 43 session->member = member;
43 44
44 GNUNET_memcpy(&(session->public_key), pubkey, sizeof(session->public_key)); 45 GNUNET_memcpy (&(session->public_key), pubkey, sizeof(session->public_key));
45 46
46 get_context_from_member ( 47 get_context_from_member (
47 get_member_session_key (session), 48 get_member_session_key (session),
48 get_member_session_id (session), 49 get_member_session_id (session),
49 &(session->context) 50 &(session->context)
50 ); 51 );
51 52
52 struct GNUNET_MESSENGER_ContactStore *store = get_member_contact_store(session->member->store); 53 struct GNUNET_MESSENGER_ContactStore *store = get_member_contact_store (
54 session->member->store);
53 55
54 session->contact = get_store_contact( 56 session->contact = get_store_contact (
55 store, 57 store,
56 get_member_session_context (session), 58 get_member_session_context (session),
57 get_member_session_public_key (session) 59 get_member_session_public_key (session)
58 ); 60 );
59 61
60 if (!(session->contact)) 62 if (! (session->contact))
61 { 63 {
62 GNUNET_free(session); 64 GNUNET_free (session);
63 return NULL; 65 return NULL;
64 } 66 }
65 67
66 increase_contact_rc (session->contact); 68 increase_contact_rc (session->contact);
67 69
68 session->history = GNUNET_CONTAINER_multihashmap_create(8, GNUNET_NO); 70 session->history = GNUNET_CONTAINER_multihashmap_create (8, GNUNET_NO);
69 71
70 init_list_messages(&(session->messages)); 72 init_list_messages (&(session->messages));
71 73
72 session->prev = NULL; 74 session->prev = NULL;
73 session->next = NULL; 75 session->next = NULL;
74 76
75 session->start = GNUNET_TIME_absolute_get(); 77 session->start = GNUNET_TIME_absolute_get ();
76 78
77 session->closed = GNUNET_NO; 79 session->closed = GNUNET_NO;
78 session->completed = GNUNET_NO; 80 session->completed = GNUNET_NO;
@@ -80,32 +82,35 @@ create_member_session (struct GNUNET_MESSENGER_Member *member,
80 return session; 82 return session;
81} 83}
82 84
85
83static void 86static void
84check_member_session_completion (struct GNUNET_MESSENGER_MemberSession *session) 87check_member_session_completion (struct GNUNET_MESSENGER_MemberSession *session)
85{ 88{
86 GNUNET_assert (session); 89 GNUNET_assert (session);
87 90
88 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Check session history (%s) for completion.\n", 91 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
89 GNUNET_sh2s(get_member_session_id(session))); 92 "Check session history (%s) for completion.\n",
93 GNUNET_sh2s (get_member_session_id (session)));
90 94
91 if (!session->messages.tail) 95 if (! session->messages.tail)
92 { 96 {
93 session->completed = GNUNET_YES; 97 session->completed = GNUNET_YES;
94 goto completion; 98 goto completion;
95 } 99 }
96 100
97 const struct GNUNET_HashCode* start = &(session->messages.head->hash); 101 const struct GNUNET_HashCode *start = &(session->messages.head->hash);
98 const struct GNUNET_HashCode* end = &(session->messages.tail->hash); 102 const struct GNUNET_HashCode *end = &(session->messages.tail->hash);
99 103
100 struct GNUNET_MESSENGER_ListMessages level; 104 struct GNUNET_MESSENGER_ListMessages level;
101 init_list_messages(&level); 105 init_list_messages (&level);
102 106
103 add_to_list_messages(&level, end); 107 add_to_list_messages (&level, end);
104 108
105 struct GNUNET_MESSENGER_MessageStore *store = get_srv_room_message_store(session->member->store->room); 109 struct GNUNET_MESSENGER_MessageStore *store = get_srv_room_message_store (
110 session->member->store->room);
106 111
107 struct GNUNET_MESSENGER_ListMessages list; 112 struct GNUNET_MESSENGER_ListMessages list;
108 init_list_messages(&list); 113 init_list_messages (&list);
109 114
110 while (level.head) 115 while (level.head)
111 { 116 {
@@ -113,57 +118,61 @@ check_member_session_completion (struct GNUNET_MESSENGER_MemberSession *session)
113 118
114 for (element = level.head; element; element = element->next) 119 for (element = level.head; element; element = element->next)
115 { 120 {
116 const struct GNUNET_MESSENGER_MessageLink *link = get_store_message_link( 121 const struct GNUNET_MESSENGER_MessageLink *link = get_store_message_link (
117 store, &(element->hash), GNUNET_NO 122 store, &(element->hash), GNUNET_NO
118 ); 123 );
119 124
120 if (!link) 125 if (! link)
121 continue; 126 continue;
122 127
123 add_to_list_messages(&list, &(link->first)); 128 add_to_list_messages (&list, &(link->first));
124 129
125 if (GNUNET_YES == link->multiple) 130 if (GNUNET_YES == link->multiple)
126 add_to_list_messages(&list, &(link->second)); 131 add_to_list_messages (&list, &(link->second));
127 } 132 }
128 133
129 clear_list_messages(&level); 134 clear_list_messages (&level);
130 135
131 for (element = list.head; element; element = element->next) 136 for (element = list.head; element; element = element->next)
132 if (GNUNET_YES == check_member_session_history(session, &(element->hash), GNUNET_YES)) 137 if (GNUNET_YES == check_member_session_history (session, &(element->hash),
138 GNUNET_YES))
133 break; 139 break;
134 140
135 if (element) 141 if (element)
136 if (0 != GNUNET_CRYPTO_hash_cmp(&(element->hash), start)) 142 if (0 != GNUNET_CRYPTO_hash_cmp (&(element->hash), start))
137 add_to_list_messages(&level, &(element->hash)); 143 add_to_list_messages (&level, &(element->hash));
138 else 144 else
139 session->completed = GNUNET_YES; 145 session->completed = GNUNET_YES;
140 else 146 else
141 copy_list_messages(&level, &list); 147 copy_list_messages (&level, &list);
142 148
143 clear_list_messages(&list); 149 clear_list_messages (&list);
144 } 150 }
145 151
146completion: 152completion:
147 if (GNUNET_YES == is_member_session_completed(session)) 153 if (GNUNET_YES == is_member_session_completed (session))
148 { 154 {
149 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Completed session history (%s)\n", 155 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Completed session history (%s)\n",
150 GNUNET_sh2s(get_member_session_id(session))); 156 GNUNET_sh2s (get_member_session_id (session)));
151 157
152 GNUNET_CONTAINER_multihashmap_clear (session->history); 158 GNUNET_CONTAINER_multihashmap_clear (session->history);
153 159
154 struct GNUNET_MESSENGER_ContactStore *store = get_member_contact_store(session->member->store); 160 struct GNUNET_MESSENGER_ContactStore *store = get_member_contact_store (
161 session->member->store);
155 162
156 if ((session->contact) && (GNUNET_YES == decrease_contact_rc (session->contact))) 163 if ((session->contact) && (GNUNET_YES == decrease_contact_rc (
164 session->contact)))
157 remove_store_contact ( 165 remove_store_contact (
158 store, 166 store,
159 session->contact, 167 session->contact,
160 get_member_session_context(session) 168 get_member_session_context (session)
161 ); 169 );
162 170
163 session->contact = NULL; 171 session->contact = NULL;
164 } 172 }
165} 173}
166 174
175
167static int 176static int
168iterate_copy_history (void *cls, 177iterate_copy_history (void *cls,
169 const struct GNUNET_HashCode *key, 178 const struct GNUNET_HashCode *key,
@@ -171,73 +180,79 @@ iterate_copy_history (void *cls,
171{ 180{
172 struct GNUNET_MESSENGER_MemberSession *next = cls; 181 struct GNUNET_MESSENGER_MemberSession *next = cls;
173 182
174 GNUNET_CONTAINER_multihashmap_put(next->history, key, (value? next : NULL), 183 GNUNET_CONTAINER_multihashmap_put (next->history, key, (value? next : NULL),
175 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); 184 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
176 185
177 return GNUNET_YES; 186 return GNUNET_YES;
178} 187}
179 188
189
180struct GNUNET_MESSENGER_MemberSession* 190struct GNUNET_MESSENGER_MemberSession*
181switch_member_session (struct GNUNET_MESSENGER_MemberSession *session, 191switch_member_session (struct GNUNET_MESSENGER_MemberSession *session,
182 const struct GNUNET_MESSENGER_Message *message, 192 const struct GNUNET_MESSENGER_Message *message,
183 const struct GNUNET_HashCode *hash) 193 const struct GNUNET_HashCode *hash)
184{ 194{
185 if ((!session) || (!message) || (!hash)) 195 if ((! session) || (! message) || (! hash))
186 return NULL; 196 return NULL;
187 197
188 GNUNET_assert((GNUNET_MESSENGER_KIND_ID == message->header.kind) || 198 GNUNET_assert ((GNUNET_MESSENGER_KIND_ID == message->header.kind) ||
189 (GNUNET_MESSENGER_KIND_KEY == message->header.kind)); 199 (GNUNET_MESSENGER_KIND_KEY == message->header.kind));
190 200
191 struct GNUNET_MESSENGER_MemberSession *next = GNUNET_new(struct GNUNET_MESSENGER_MemberSession); 201 struct GNUNET_MESSENGER_MemberSession *next = GNUNET_new (struct
202 GNUNET_MESSENGER_MemberSession);
192 203
193 if (GNUNET_MESSENGER_KIND_ID == message->header.kind) 204 if (GNUNET_MESSENGER_KIND_ID == message->header.kind)
194 next->member = add_store_member(session->member->store, &(message->body.id.id)); 205 next->member = add_store_member (session->member->store,
206 &(message->body.id.id));
195 else 207 else
196 next->member = session->member; 208 next->member = session->member;
197 209
198 if (GNUNET_MESSENGER_KIND_KEY == message->header.kind) 210 if (GNUNET_MESSENGER_KIND_KEY == message->header.kind)
199 GNUNET_memcpy(&(next->public_key), &(message->body.key.key), sizeof(next->public_key)); 211 GNUNET_memcpy (&(next->public_key), &(message->body.key.key),
212 sizeof(next->public_key));
200 else 213 else
201 GNUNET_memcpy(&(next->public_key), get_member_session_public_key(session), sizeof(next->public_key)); 214 GNUNET_memcpy (&(next->public_key), get_member_session_public_key (session),
215 sizeof(next->public_key));
202 216
203 get_context_from_member ( 217 get_context_from_member (
204 get_member_session_key (next), 218 get_member_session_key (next),
205 get_member_session_id (next), 219 get_member_session_id (next),
206 &(next->context) 220 &(next->context)
207 ); 221 );
208 222
209 update_store_contact( 223 update_store_contact (
210 get_member_contact_store(next->member->store), 224 get_member_contact_store (next->member->store),
211 get_member_session_contact(session), 225 get_member_session_contact (session),
212 get_member_session_context(session), 226 get_member_session_context (session),
213 get_member_session_context(next), 227 get_member_session_context (next),
214 get_member_session_public_key(next) 228 get_member_session_public_key (next)
215 ); 229 );
216 230
217 next->contact = get_member_session_contact(session); 231 next->contact = get_member_session_contact (session);
218 232
219 if (!(next->contact)) 233 if (! (next->contact))
220 { 234 {
221 GNUNET_free(next); 235 GNUNET_free (next);
222 return NULL; 236 return NULL;
223 } 237 }
224 238
225 increase_contact_rc (next->contact); 239 increase_contact_rc (next->contact);
226 240
227 next->history = GNUNET_CONTAINER_multihashmap_create( 241 next->history = GNUNET_CONTAINER_multihashmap_create (
228 GNUNET_CONTAINER_multihashmap_size(session->history), GNUNET_NO 242 GNUNET_CONTAINER_multihashmap_size (session->history), GNUNET_NO
229 ); 243 );
230 244
231 GNUNET_CONTAINER_multihashmap_iterate(session->history, iterate_copy_history, next); 245 GNUNET_CONTAINER_multihashmap_iterate (session->history, iterate_copy_history,
246 next);
232 247
233 init_list_messages(&(next->messages)); 248 init_list_messages (&(next->messages));
234 copy_list_messages(&(next->messages), &(session->messages)); 249 copy_list_messages (&(next->messages), &(session->messages));
235 250
236 session->next = next; 251 session->next = next;
237 next->prev = session; 252 next->prev = session;
238 next->next = NULL; 253 next->next = NULL;
239 254
240 next->start = GNUNET_TIME_absolute_get(); 255 next->start = GNUNET_TIME_absolute_get ();
241 256
242 session->closed = GNUNET_YES; 257 session->closed = GNUNET_YES;
243 next->closed = GNUNET_NO; 258 next->closed = GNUNET_NO;
@@ -248,8 +263,9 @@ switch_member_session (struct GNUNET_MESSENGER_MemberSession *session,
248 return next; 263 return next;
249} 264}
250 265
266
251void 267void
252destroy_member_session(struct GNUNET_MESSENGER_MemberSession* session) 268destroy_member_session (struct GNUNET_MESSENGER_MemberSession *session)
253{ 269{
254 GNUNET_assert (session); 270 GNUNET_assert (session);
255 271
@@ -257,32 +273,35 @@ destroy_member_session(struct GNUNET_MESSENGER_MemberSession* session)
257 273
258 clear_list_messages (&(session->messages)); 274 clear_list_messages (&(session->messages));
259 275
260 struct GNUNET_MESSENGER_Contact *contact = get_member_session_contact (session); 276 struct GNUNET_MESSENGER_Contact *contact = get_member_session_contact (
277 session);
261 278
262 if ((contact) && (GNUNET_YES == decrease_contact_rc (contact))) 279 if ((contact) && (GNUNET_YES == decrease_contact_rc (contact)))
263 remove_store_contact ( 280 remove_store_contact (
264 get_member_contact_store(session->member->store), 281 get_member_contact_store (session->member->store),
265 contact, 282 contact,
266 get_member_session_context(session) 283 get_member_session_context (session)
267 ); 284 );
268 285
269 GNUNET_free(session); 286 GNUNET_free (session);
270} 287}
271 288
289
272int 290int
273reset_member_session (struct GNUNET_MESSENGER_MemberSession* session, 291reset_member_session (struct GNUNET_MESSENGER_MemberSession *session,
274 const struct GNUNET_HashCode *hash) 292 const struct GNUNET_HashCode *hash)
275{ 293{
276 GNUNET_assert ((session) && (hash)); 294 GNUNET_assert ((session) && (hash));
277 295
278 struct GNUNET_MESSENGER_ContactStore *store = get_member_contact_store(session->member->store); 296 struct GNUNET_MESSENGER_ContactStore *store = get_member_contact_store (
279 struct GNUNET_MESSENGER_Contact *contact = get_store_contact( 297 session->member->store);
280 store, 298 struct GNUNET_MESSENGER_Contact *contact = get_store_contact (
281 get_member_session_context (session), 299 store,
282 get_member_session_public_key (session) 300 get_member_session_context (session),
283 ); 301 get_member_session_public_key (session)
302 );
284 303
285 if (!contact) 304 if (! contact)
286 return GNUNET_SYSERR; 305 return GNUNET_SYSERR;
287 306
288 if (contact == session->contact) 307 if (contact == session->contact)
@@ -292,8 +311,8 @@ reset_member_session (struct GNUNET_MESSENGER_MemberSession* session,
292 increase_contact_rc (session->contact); 311 increase_contact_rc (session->contact);
293 312
294clear_messages: 313clear_messages:
295 clear_list_messages(&(session->messages)); 314 clear_list_messages (&(session->messages));
296 add_to_list_messages(&(session->messages), hash); 315 add_to_list_messages (&(session->messages), hash);
297 316
298 session->next = NULL; 317 session->next = NULL;
299 session->closed = GNUNET_NO; 318 session->closed = GNUNET_NO;
@@ -302,8 +321,9 @@ clear_messages:
302 return GNUNET_OK; 321 return GNUNET_OK;
303} 322}
304 323
324
305void 325void
306close_member_session (struct GNUNET_MESSENGER_MemberSession* session) 326close_member_session (struct GNUNET_MESSENGER_MemberSession *session)
307{ 327{
308 GNUNET_assert (session); 328 GNUNET_assert (session);
309 329
@@ -311,132 +331,158 @@ close_member_session (struct GNUNET_MESSENGER_MemberSession* session)
311 check_member_session_completion (session); 331 check_member_session_completion (session);
312} 332}
313 333
334
314int 335int
315is_member_session_closed (const struct GNUNET_MESSENGER_MemberSession* session) 336is_member_session_closed (const struct GNUNET_MESSENGER_MemberSession *session)
316{ 337{
317 GNUNET_assert(session); 338 GNUNET_assert (session);
318 339
319 return session->closed; 340 return session->closed;
320} 341}
321 342
343
322int 344int
323is_member_session_completed (const struct GNUNET_MESSENGER_MemberSession* session) 345is_member_session_completed (const struct
346 GNUNET_MESSENGER_MemberSession *session)
324{ 347{
325 GNUNET_assert(session); 348 GNUNET_assert (session);
326 349
327 return session->completed; 350 return session->completed;
328} 351}
329 352
353
330struct GNUNET_TIME_Absolute 354struct GNUNET_TIME_Absolute
331get_member_session_start (const struct GNUNET_MESSENGER_MemberSession* session) 355get_member_session_start (const struct GNUNET_MESSENGER_MemberSession *session)
332{ 356{
333 GNUNET_assert(session); 357 GNUNET_assert (session);
334 358
335 if (session->prev) 359 if (session->prev)
336 return get_member_session_start(session->prev); 360 return get_member_session_start (session->prev);
337 361
338 return session->start; 362 return session->start;
339} 363}
340 364
365
341const struct GNUNET_HashCode* 366const struct GNUNET_HashCode*
342get_member_session_key (const struct GNUNET_MESSENGER_MemberSession* session) 367get_member_session_key (const struct GNUNET_MESSENGER_MemberSession *session)
343{ 368{
344 GNUNET_assert((session) && (session->member)); 369 GNUNET_assert ((session) && (session->member));
345 370
346 return get_member_store_key(session->member->store); 371 return get_member_store_key (session->member->store);
347} 372}
348 373
374
349const struct GNUNET_ShortHashCode* 375const struct GNUNET_ShortHashCode*
350get_member_session_id (const struct GNUNET_MESSENGER_MemberSession* session) 376get_member_session_id (const struct GNUNET_MESSENGER_MemberSession *session)
351{ 377{
352 GNUNET_assert(session); 378 GNUNET_assert (session);
353 379
354 return get_member_id(session->member); 380 return get_member_id (session->member);
355} 381}
356 382
383
357const struct GNUNET_IDENTITY_PublicKey* 384const struct GNUNET_IDENTITY_PublicKey*
358get_member_session_public_key (const struct GNUNET_MESSENGER_MemberSession* session) 385get_member_session_public_key (const struct
386 GNUNET_MESSENGER_MemberSession *session)
359{ 387{
360 GNUNET_assert(session); 388 GNUNET_assert (session);
361 389
362 return &(session->public_key); 390 return &(session->public_key);
363} 391}
364 392
393
365const struct GNUNET_HashCode* 394const struct GNUNET_HashCode*
366get_member_session_context (const struct GNUNET_MESSENGER_MemberSession* session) 395get_member_session_context (const struct
396 GNUNET_MESSENGER_MemberSession *session)
367{ 397{
368 GNUNET_assert(session); 398 GNUNET_assert (session);
369 399
370 return &(session->context); 400 return &(session->context);
371} 401}
372 402
403
373struct GNUNET_MESSENGER_Contact* 404struct GNUNET_MESSENGER_Contact*
374get_member_session_contact (struct GNUNET_MESSENGER_MemberSession* session) 405get_member_session_contact (struct GNUNET_MESSENGER_MemberSession *session)
375{ 406{
376 GNUNET_assert (session); 407 GNUNET_assert (session);
377 408
378 return session->contact; 409 return session->contact;
379} 410}
380 411
381int verify_member_session_as_sender (const struct GNUNET_MESSENGER_MemberSession *session, 412
382 const struct GNUNET_MESSENGER_Message *message, 413int
383 const struct GNUNET_HashCode *hash) 414verify_member_session_as_sender (const struct
415 GNUNET_MESSENGER_MemberSession *session,
416 const struct GNUNET_MESSENGER_Message *message,
417 const struct GNUNET_HashCode *hash)
384{ 418{
385 GNUNET_assert((session) && (message) && (hash)); 419 GNUNET_assert ((session) && (message) && (hash));
386 420
387 if (GNUNET_YES == is_member_session_completed (session)) 421 if (GNUNET_YES == is_member_session_completed (session))
388 return GNUNET_SYSERR; 422 return GNUNET_SYSERR;
389 423
390 if (0 != GNUNET_memcmp (get_member_session_id (session), &(message->header.sender_id))) 424 if (0 != GNUNET_memcmp (get_member_session_id (session),
425 &(message->header.sender_id)))
391 return GNUNET_SYSERR; 426 return GNUNET_SYSERR;
392 427
393 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Check message (%s) using key: %s\n", 428 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Check message (%s) using key: %s\n",
394 GNUNET_h2s (hash), 429 GNUNET_h2s (hash),
395 GNUNET_IDENTITY_public_key_to_string (get_member_session_public_key (session))); 430 GNUNET_IDENTITY_public_key_to_string (
431 get_member_session_public_key (session)));
396 432
397 return verify_message (message, hash, get_member_session_public_key (session)); 433 return verify_message (message, hash, get_member_session_public_key (
434 session));
398} 435}
399 436
437
400int 438int
401check_member_session_history (const struct GNUNET_MESSENGER_MemberSession *session, 439check_member_session_history (const struct
440 GNUNET_MESSENGER_MemberSession *session,
402 const struct GNUNET_HashCode *hash, int ownership) 441 const struct GNUNET_HashCode *hash, int ownership)
403{ 442{
404 GNUNET_assert((session) && (hash)); 443 GNUNET_assert ((session) && (hash));
405 444
406 if (GNUNET_YES == ownership) 445 if (GNUNET_YES == ownership)
407 return (NULL != GNUNET_CONTAINER_multihashmap_get(session->history, hash)? GNUNET_YES : GNUNET_NO); 446 return (NULL != GNUNET_CONTAINER_multihashmap_get (session->history, hash)?
447 GNUNET_YES : GNUNET_NO);
408 else 448 else
409 return GNUNET_CONTAINER_multihashmap_contains(session->history, hash); 449 return GNUNET_CONTAINER_multihashmap_contains (session->history, hash);
410} 450}
411 451
452
412static void 453static void
413update_member_chain_history (struct GNUNET_MESSENGER_MemberSession *session, 454update_member_chain_history (struct GNUNET_MESSENGER_MemberSession *session,
414 const struct GNUNET_HashCode *hash, int ownership) 455 const struct GNUNET_HashCode *hash, int ownership)
415{ 456{
416 GNUNET_assert ((session) && (hash)); 457 GNUNET_assert ((session) && (hash));
417 458
418 if ((GNUNET_OK == GNUNET_CONTAINER_multihashmap_put(session->history, hash, (GNUNET_YES == ownership? session : NULL), 459 if ((GNUNET_OK == GNUNET_CONTAINER_multihashmap_put (session->history, hash,
419 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) && (session->next)) 460 (GNUNET_YES == ownership?
461 session : NULL),
462 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST))
463 && (session->next))
420 update_member_chain_history (session->next, hash, ownership); 464 update_member_chain_history (session->next, hash, ownership);
421} 465}
422 466
467
423void 468void
424update_member_session_history (struct GNUNET_MESSENGER_MemberSession *session, 469update_member_session_history (struct GNUNET_MESSENGER_MemberSession *session,
425 const struct GNUNET_MESSENGER_Message *message, 470 const struct GNUNET_MESSENGER_Message *message,
426 const struct GNUNET_HashCode *hash) 471 const struct GNUNET_HashCode *hash)
427{ 472{
428 GNUNET_assert((session) && (message) && (hash)); 473 GNUNET_assert ((session) && (message) && (hash));
429 474
430 if (GNUNET_YES == is_member_session_completed(session)) 475 if (GNUNET_YES == is_member_session_completed (session))
431 return; 476 return;
432 477
433 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Updating sessions history (%s) += (%s)\n", 478 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
434 GNUNET_sh2s(get_member_session_id(session)), GNUNET_h2s(hash)); 479 "Updating sessions history (%s) += (%s)\n",
480 GNUNET_sh2s (get_member_session_id (session)), GNUNET_h2s (hash));
435 481
436 if (GNUNET_OK == verify_member_session_as_sender (session, message, hash)) 482 if (GNUNET_OK == verify_member_session_as_sender (session, message, hash))
437 { 483 {
438 if (GNUNET_YES == is_message_session_bound (message)) 484 if (GNUNET_YES == is_message_session_bound (message))
439 add_to_list_messages(&(session->messages), hash); 485 add_to_list_messages (&(session->messages), hash);
440 486
441 update_member_chain_history (session, hash, GNUNET_YES); 487 update_member_chain_history (session, hash, GNUNET_YES);
442 } 488 }
@@ -444,28 +490,32 @@ update_member_session_history (struct GNUNET_MESSENGER_MemberSession *session,
444 update_member_chain_history (session, hash, GNUNET_NO); 490 update_member_chain_history (session, hash, GNUNET_NO);
445 491
446 if (GNUNET_YES == session->closed) 492 if (GNUNET_YES == session->closed)
447 check_member_session_completion(session); 493 check_member_session_completion (session);
448} 494}
449 495
496
450static void 497static void
451clear_member_chain_history (struct GNUNET_MESSENGER_MemberSession *session, 498clear_member_chain_history (struct GNUNET_MESSENGER_MemberSession *session,
452 const struct GNUNET_HashCode *hash) 499 const struct GNUNET_HashCode *hash)
453{ 500{
454 GNUNET_assert ((session) && (hash)); 501 GNUNET_assert ((session) && (hash));
455 502
456 if ((0 < GNUNET_CONTAINER_multihashmap_remove_all(session->history, hash)) && (session->next)) 503 if ((0 < GNUNET_CONTAINER_multihashmap_remove_all (session->history, hash)) &&
457 clear_member_session_history(session->next, hash); 504 (session->next))
505 clear_member_session_history (session->next, hash);
458} 506}
459 507
508
460void 509void
461clear_member_session_history (struct GNUNET_MESSENGER_MemberSession *session, 510clear_member_session_history (struct GNUNET_MESSENGER_MemberSession *session,
462 const struct GNUNET_HashCode *hash) 511 const struct GNUNET_HashCode *hash)
463{ 512{
464 GNUNET_assert((session) && (hash)); 513 GNUNET_assert ((session) && (hash));
465 514
466 clear_member_chain_history (session, hash); 515 clear_member_chain_history (session, hash);
467} 516}
468 517
518
469struct GNUNET_MESSENGER_MemberSessionHistoryEntry 519struct GNUNET_MESSENGER_MemberSessionHistoryEntry
470{ 520{
471 struct GNUNET_HashCode hash; 521 struct GNUNET_HashCode hash;
@@ -476,21 +526,22 @@ static void
476load_member_session_history (struct GNUNET_MESSENGER_MemberSession *session, 526load_member_session_history (struct GNUNET_MESSENGER_MemberSession *session,
477 const char *path) 527 const char *path)
478{ 528{
479 GNUNET_assert((session) && (path)); 529 GNUNET_assert ((session) && (path));
480 530
481 if (GNUNET_YES != GNUNET_DISK_file_test (path)) 531 if (GNUNET_YES != GNUNET_DISK_file_test (path))
482 return; 532 return;
483 533
484 enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE); 534 enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
535 | GNUNET_DISK_PERM_USER_WRITE);
485 536
486 struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open( 537 struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open (
487 path, GNUNET_DISK_OPEN_READ, permission 538 path, GNUNET_DISK_OPEN_READ, permission
488 ); 539 );
489 540
490 if (!handle) 541 if (! handle)
491 return; 542 return;
492 543
493 GNUNET_DISK_file_seek(handle, 0, GNUNET_DISK_SEEK_SET); 544 GNUNET_DISK_file_seek (handle, 0, GNUNET_DISK_SEEK_SET);
494 545
495 struct GNUNET_MESSENGER_MemberSessionHistoryEntry entry; 546 struct GNUNET_MESSENGER_MemberSessionHistoryEntry entry;
496 ssize_t len; 547 ssize_t len;
@@ -498,23 +549,27 @@ load_member_session_history (struct GNUNET_MESSENGER_MemberSession *session,
498 int status; 549 int status;
499 550
500 do { 551 do {
501 len = GNUNET_DISK_file_read(handle, &(entry.hash), sizeof(entry.hash)); 552 len = GNUNET_DISK_file_read (handle, &(entry.hash), sizeof(entry.hash));
502 553
503 if (len != sizeof(entry.hash)) 554 if (len != sizeof(entry.hash))
504 break; 555 break;
505 556
506 len = GNUNET_DISK_file_read(handle, &(entry.ownership), sizeof(entry.ownership)); 557 len = GNUNET_DISK_file_read (handle, &(entry.ownership),
558 sizeof(entry.ownership));
507 559
508 if (len != sizeof(entry.ownership)) 560 if (len != sizeof(entry.ownership))
509 break; 561 break;
510 562
511 status = GNUNET_CONTAINER_multihashmap_put(session->history, &(entry.hash), (entry.ownership? session : NULL), 563 status = GNUNET_CONTAINER_multihashmap_put (session->history, &(entry.hash),
512 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST); 564 (entry.ownership? session :
565 NULL),
566 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST);
513 } while (status == GNUNET_OK); 567 } while (status == GNUNET_OK);
514 568
515 GNUNET_DISK_file_close(handle); 569 GNUNET_DISK_file_close (handle);
516} 570}
517 571
572
518void 573void
519load_member_session (struct GNUNET_MESSENGER_Member *member, 574load_member_session (struct GNUNET_MESSENGER_Member *member,
520 const char *directory) 575 const char *directory)
@@ -529,7 +584,8 @@ load_member_session (struct GNUNET_MESSENGER_Member *member,
529 if (GNUNET_YES != GNUNET_DISK_file_test (config_file)) 584 if (GNUNET_YES != GNUNET_DISK_file_test (config_file))
530 goto free_config; 585 goto free_config;
531 586
532 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load session configuration of member: %s\n", config_file); 587 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
588 "Load session configuration of member: %s\n", config_file);
533 589
534 struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create (); 590 struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
535 591
@@ -537,61 +593,71 @@ load_member_session (struct GNUNET_MESSENGER_Member *member,
537 { 593 {
538 char *key_data; 594 char *key_data;
539 595
540 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(cfg, "session", "key", &key_data)) 596 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (cfg, "session",
597 "key", &key_data))
541 goto destroy_config; 598 goto destroy_config;
542 599
543 struct GNUNET_IDENTITY_PublicKey key; 600 struct GNUNET_IDENTITY_PublicKey key;
544 601
545 enum GNUNET_GenericReturnValue key_return = GNUNET_IDENTITY_public_key_from_string(key_data, &key); 602 enum GNUNET_GenericReturnValue key_return =
603 GNUNET_IDENTITY_public_key_from_string (key_data, &key);
546 604
547 GNUNET_free(key_data); 605 GNUNET_free (key_data);
548 606
549 if (GNUNET_OK != key_return) 607 if (GNUNET_OK != key_return)
550 goto destroy_config; 608 goto destroy_config;
551 609
552 session = create_member_session(member, &key); 610 session = create_member_session (member, &key);
553 611
554 unsigned long long numeric_value; 612 unsigned long long numeric_value;
555 613
556 if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cfg, "session", "start", &numeric_value)) 614 if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (cfg, "session",
615 "start",
616 &numeric_value))
557 session->start.abs_value_us = numeric_value; 617 session->start.abs_value_us = numeric_value;
558 618
559 if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cfg, "session", "closed", &numeric_value)) 619 if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (cfg, "session",
620 "closed",
621 &numeric_value))
560 session->closed = (GNUNET_YES == numeric_value? GNUNET_YES : GNUNET_NO); 622 session->closed = (GNUNET_YES == numeric_value? GNUNET_YES : GNUNET_NO);
561 623
562 if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cfg, "session", "completed", &numeric_value)) 624 if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (cfg, "session",
563 session->completed = (GNUNET_YES == numeric_value? GNUNET_YES : GNUNET_NO); 625 "completed",
626 &numeric_value))
627 session->completed = (GNUNET_YES == numeric_value? GNUNET_YES :
628 GNUNET_NO);
564 } 629 }
565 630
566destroy_config: 631destroy_config:
567 GNUNET_CONFIGURATION_destroy (cfg); 632 GNUNET_CONFIGURATION_destroy (cfg);
568 633
569free_config: 634free_config:
570 GNUNET_free(config_file); 635 GNUNET_free (config_file);
571 636
572 if (!session) 637 if (! session)
573 return; 638 return;
574 639
575 char *history_file; 640 char *history_file;
576 GNUNET_asprintf (&history_file, "%s%s", directory, "history.map"); 641 GNUNET_asprintf (&history_file, "%s%s", directory, "history.map");
577 642
578 load_member_session_history (session, history_file); 643 load_member_session_history (session, history_file);
579 GNUNET_free(history_file); 644 GNUNET_free (history_file);
580 645
581 char *messages_file; 646 char *messages_file;
582 GNUNET_asprintf (&messages_file, "%s%s", directory, "messages.list"); 647 GNUNET_asprintf (&messages_file, "%s%s", directory, "messages.list");
583 648
584 load_list_messages(&(session->messages), messages_file); 649 load_list_messages (&(session->messages), messages_file);
585 GNUNET_free(messages_file); 650 GNUNET_free (messages_file);
586 651
587 add_member_session(member, session); 652 add_member_session (member, session);
588} 653}
589 654
655
590static struct GNUNET_MESSENGER_MemberSession* 656static struct GNUNET_MESSENGER_MemberSession*
591get_cycle_safe_next_session (struct GNUNET_MESSENGER_MemberSession *session, 657get_cycle_safe_next_session (struct GNUNET_MESSENGER_MemberSession *session,
592 struct GNUNET_MESSENGER_MemberSession *next) 658 struct GNUNET_MESSENGER_MemberSession *next)
593{ 659{
594 if (!next) 660 if (! next)
595 return NULL; 661 return NULL;
596 662
597 struct GNUNET_MESSENGER_MemberSession *check = next; 663 struct GNUNET_MESSENGER_MemberSession *check = next;
@@ -606,6 +672,7 @@ get_cycle_safe_next_session (struct GNUNET_MESSENGER_MemberSession *session,
606 return next; 672 return next;
607} 673}
608 674
675
609void 676void
610load_member_session_next (struct GNUNET_MESSENGER_MemberSession *session, 677load_member_session_next (struct GNUNET_MESSENGER_MemberSession *session,
611 const char *directory) 678 const char *directory)
@@ -618,7 +685,8 @@ load_member_session_next (struct GNUNET_MESSENGER_MemberSession *session,
618 if (GNUNET_YES != GNUNET_DISK_file_test (config_file)) 685 if (GNUNET_YES != GNUNET_DISK_file_test (config_file))
619 goto free_config; 686 goto free_config;
620 687
621 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Load next session configuration of member: %s\n", config_file); 688 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
689 "Load next session configuration of member: %s\n", config_file);
622 690
623 struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create (); 691 struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
624 692
@@ -626,28 +694,33 @@ load_member_session_next (struct GNUNET_MESSENGER_MemberSession *session,
626 { 694 {
627 char *key_data; 695 char *key_data;
628 696
629 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string(cfg, "session", "next_key", &key_data)) 697 if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_string (cfg, "session",
698 "next_key",
699 &key_data))
630 goto destroy_config; 700 goto destroy_config;
631 701
632 struct GNUNET_IDENTITY_PublicKey next_key; 702 struct GNUNET_IDENTITY_PublicKey next_key;
633 703
634 enum GNUNET_GenericReturnValue key_return = GNUNET_IDENTITY_public_key_from_string(key_data, &next_key); 704 enum GNUNET_GenericReturnValue key_return =
705 GNUNET_IDENTITY_public_key_from_string (key_data, &next_key);
635 706
636 GNUNET_free(key_data); 707 GNUNET_free (key_data);
637 708
638 if (GNUNET_OK != key_return) 709 if (GNUNET_OK != key_return)
639 goto destroy_config; 710 goto destroy_config;
640 711
641 struct GNUNET_ShortHashCode next_id; 712 struct GNUNET_ShortHashCode next_id;
642 713
643 if (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "session", "next_id", &next_id, sizeof(next_id))) 714 if (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "session", "next_id",
715 &next_id, sizeof(next_id)))
644 goto destroy_config; 716 goto destroy_config;
645 717
646 struct GNUNET_MESSENGER_Member *member = get_store_member(session->member->store, &next_id); 718 struct GNUNET_MESSENGER_Member *member = get_store_member (
719 session->member->store, &next_id);
647 720
648 session->next = get_cycle_safe_next_session( 721 session->next = get_cycle_safe_next_session (
649 session, member? get_member_session (member, &next_key) : NULL 722 session, member? get_member_session (member, &next_key) : NULL
650 ); 723 );
651 724
652 if (session->next) 725 if (session->next)
653 session->next->prev = session; 726 session->next->prev = session;
@@ -657,9 +730,10 @@ destroy_config:
657 GNUNET_CONFIGURATION_destroy (cfg); 730 GNUNET_CONFIGURATION_destroy (cfg);
658 731
659free_config: 732free_config:
660 GNUNET_free(config_file); 733 GNUNET_free (config_file);
661} 734}
662 735
736
663static int 737static int
664iterate_save_member_session_history_hentries (void *cls, 738iterate_save_member_session_history_hentries (void *cls,
665 const struct GNUNET_HashCode *key, 739 const struct GNUNET_HashCode *key,
@@ -668,39 +742,42 @@ iterate_save_member_session_history_hentries (void *cls,
668 struct GNUNET_DISK_FileHandle *handle = cls; 742 struct GNUNET_DISK_FileHandle *handle = cls;
669 unsigned char ownership = value? GNUNET_YES : GNUNET_NO; 743 unsigned char ownership = value? GNUNET_YES : GNUNET_NO;
670 744
671 GNUNET_DISK_file_write(handle, key, sizeof(*key)); 745 GNUNET_DISK_file_write (handle, key, sizeof(*key));
672 GNUNET_DISK_file_write(handle, &ownership, sizeof(ownership)); 746 GNUNET_DISK_file_write (handle, &ownership, sizeof(ownership));
673 747
674 return GNUNET_YES; 748 return GNUNET_YES;
675} 749}
676 750
751
677static void 752static void
678save_member_session_history (struct GNUNET_MESSENGER_MemberSession *session, 753save_member_session_history (struct GNUNET_MESSENGER_MemberSession *session,
679 const char *path) 754 const char *path)
680{ 755{
681 GNUNET_assert((session) && (path)); 756 GNUNET_assert ((session) && (path));
682 757
683 enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ | GNUNET_DISK_PERM_USER_WRITE); 758 enum GNUNET_DISK_AccessPermissions permission = (GNUNET_DISK_PERM_USER_READ
759 | GNUNET_DISK_PERM_USER_WRITE);
684 760
685 struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open( 761 struct GNUNET_DISK_FileHandle *handle = GNUNET_DISK_file_open (
686 path, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_WRITE, permission 762 path, GNUNET_DISK_OPEN_CREATE | GNUNET_DISK_OPEN_WRITE, permission
687 ); 763 );
688 764
689 if (!handle) 765 if (! handle)
690 return; 766 return;
691 767
692 GNUNET_DISK_file_seek(handle, 0, GNUNET_DISK_SEEK_SET); 768 GNUNET_DISK_file_seek (handle, 0, GNUNET_DISK_SEEK_SET);
693 769
694 GNUNET_CONTAINER_multihashmap_iterate( 770 GNUNET_CONTAINER_multihashmap_iterate (
695 session->history, 771 session->history,
696 iterate_save_member_session_history_hentries, 772 iterate_save_member_session_history_hentries,
697 handle 773 handle
698 ); 774 );
699 775
700 GNUNET_DISK_file_sync(handle); 776 GNUNET_DISK_file_sync (handle);
701 GNUNET_DISK_file_close(handle); 777 GNUNET_DISK_file_close (handle);
702} 778}
703 779
780
704void 781void
705save_member_session (struct GNUNET_MESSENGER_MemberSession *session, 782save_member_session (struct GNUNET_MESSENGER_MemberSession *session,
706 const char *directory) 783 const char *directory)
@@ -710,61 +787,71 @@ save_member_session (struct GNUNET_MESSENGER_MemberSession *session,
710 char *config_file; 787 char *config_file;
711 GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg"); 788 GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg");
712 789
713 GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Save session configuration of member: %s\n", config_file); 790 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
791 "Save session configuration of member: %s\n", config_file);
714 792
715 struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create (); 793 struct GNUNET_CONFIGURATION_Handle *cfg = GNUNET_CONFIGURATION_create ();
716 794
717 char *key_data = GNUNET_IDENTITY_public_key_to_string(get_member_session_public_key(session)); 795 char *key_data = GNUNET_IDENTITY_public_key_to_string (
796 get_member_session_public_key (session));
718 797
719 if (key_data) 798 if (key_data)
720 { 799 {
721 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "key", key_data); 800 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "key", key_data);
722 801
723 GNUNET_free(key_data); 802 GNUNET_free (key_data);
724 } 803 }
725 804
726 if (session->next) 805 if (session->next)
727 { 806 {
728 const struct GNUNET_ShortHashCode *next_id = get_member_session_id(session->next); 807 const struct GNUNET_ShortHashCode *next_id = get_member_session_id (
808 session->next);
729 809
730 char *next_id_data = GNUNET_STRINGS_data_to_string_alloc (next_id, sizeof(*next_id)); 810 char *next_id_data = GNUNET_STRINGS_data_to_string_alloc (next_id,
811 sizeof(*next_id));
731 812
732 if (next_id_data) 813 if (next_id_data)
733 { 814 {
734 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_id", next_id_data); 815 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_id",
816 next_id_data);
735 817
736 GNUNET_free(next_id_data); 818 GNUNET_free (next_id_data);
737 } 819 }
738 820
739 key_data = GNUNET_IDENTITY_public_key_to_string(get_member_session_public_key(session->next)); 821 key_data = GNUNET_IDENTITY_public_key_to_string (
822 get_member_session_public_key (session->next));
740 823
741 if (key_data) 824 if (key_data)
742 { 825 {
743 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_key", key_data); 826 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_key",
827 key_data);
744 828
745 GNUNET_free(key_data); 829 GNUNET_free (key_data);
746 } 830 }
747 } 831 }
748 832
749 GNUNET_CONFIGURATION_set_value_number(cfg, "session", "start", session->start.abs_value_us); 833 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "start",
834 session->start.abs_value_us);
750 835
751 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "closed", session->closed); 836 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "closed",
752 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "completed", session->completed); 837 session->closed);
838 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "completed",
839 session->completed);
753 840
754 GNUNET_CONFIGURATION_write (cfg, config_file); 841 GNUNET_CONFIGURATION_write (cfg, config_file);
755 GNUNET_CONFIGURATION_destroy (cfg); 842 GNUNET_CONFIGURATION_destroy (cfg);
756 843
757 GNUNET_free(config_file); 844 GNUNET_free (config_file);
758 845
759 char *history_file; 846 char *history_file;
760 GNUNET_asprintf (&history_file, "%s%s", directory, "history.map"); 847 GNUNET_asprintf (&history_file, "%s%s", directory, "history.map");
761 848
762 save_member_session_history (session, history_file); 849 save_member_session_history (session, history_file);
763 GNUNET_free(history_file); 850 GNUNET_free (history_file);
764 851
765 char *messages_file; 852 char *messages_file;
766 GNUNET_asprintf (&messages_file, "%s%s", directory, "messages.list"); 853 GNUNET_asprintf (&messages_file, "%s%s", directory, "messages.list");
767 854
768 save_list_messages(&(session->messages), messages_file); 855 save_list_messages (&(session->messages), messages_file);
769 GNUNET_free(messages_file); 856 GNUNET_free (messages_file);
770} 857}