diff options
Diffstat (limited to 'src/messenger/gnunet-service-messenger_member_session.c')
-rw-r--r-- | src/messenger/gnunet-service-messenger_member_session.c | 507 |
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* | |||
35 | create_member_session (struct GNUNET_MESSENGER_Member *member, | 35 | create_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 | |||
83 | static void | 86 | static void |
84 | check_member_session_completion (struct GNUNET_MESSENGER_MemberSession *session) | 87 | check_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 | ||
146 | completion: | 152 | completion: |
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 | |||
167 | static int | 176 | static int |
168 | iterate_copy_history (void *cls, | 177 | iterate_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 | |||
180 | struct GNUNET_MESSENGER_MemberSession* | 190 | struct GNUNET_MESSENGER_MemberSession* |
181 | switch_member_session (struct GNUNET_MESSENGER_MemberSession *session, | 191 | switch_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 | |||
251 | void | 267 | void |
252 | destroy_member_session(struct GNUNET_MESSENGER_MemberSession* session) | 268 | destroy_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 | |||
272 | int | 290 | int |
273 | reset_member_session (struct GNUNET_MESSENGER_MemberSession* session, | 291 | reset_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 | ||
294 | clear_messages: | 313 | clear_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 | |||
305 | void | 325 | void |
306 | close_member_session (struct GNUNET_MESSENGER_MemberSession* session) | 326 | close_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 | |||
314 | int | 335 | int |
315 | is_member_session_closed (const struct GNUNET_MESSENGER_MemberSession* session) | 336 | is_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 | |||
322 | int | 344 | int |
323 | is_member_session_completed (const struct GNUNET_MESSENGER_MemberSession* session) | 345 | is_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 | |||
330 | struct GNUNET_TIME_Absolute | 354 | struct GNUNET_TIME_Absolute |
331 | get_member_session_start (const struct GNUNET_MESSENGER_MemberSession* session) | 355 | get_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 | |||
341 | const struct GNUNET_HashCode* | 366 | const struct GNUNET_HashCode* |
342 | get_member_session_key (const struct GNUNET_MESSENGER_MemberSession* session) | 367 | get_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 | |||
349 | const struct GNUNET_ShortHashCode* | 375 | const struct GNUNET_ShortHashCode* |
350 | get_member_session_id (const struct GNUNET_MESSENGER_MemberSession* session) | 376 | get_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 | |||
357 | const struct GNUNET_IDENTITY_PublicKey* | 384 | const struct GNUNET_IDENTITY_PublicKey* |
358 | get_member_session_public_key (const struct GNUNET_MESSENGER_MemberSession* session) | 385 | get_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 | |||
365 | const struct GNUNET_HashCode* | 394 | const struct GNUNET_HashCode* |
366 | get_member_session_context (const struct GNUNET_MESSENGER_MemberSession* session) | 395 | get_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 | |||
373 | struct GNUNET_MESSENGER_Contact* | 404 | struct GNUNET_MESSENGER_Contact* |
374 | get_member_session_contact (struct GNUNET_MESSENGER_MemberSession* session) | 405 | get_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 | ||
381 | int verify_member_session_as_sender (const struct GNUNET_MESSENGER_MemberSession *session, | 412 | |
382 | const struct GNUNET_MESSENGER_Message *message, | 413 | int |
383 | const struct GNUNET_HashCode *hash) | 414 | verify_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 | |||
400 | int | 438 | int |
401 | check_member_session_history (const struct GNUNET_MESSENGER_MemberSession *session, | 439 | check_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 | |||
412 | static void | 453 | static void |
413 | update_member_chain_history (struct GNUNET_MESSENGER_MemberSession *session, | 454 | update_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 | |||
423 | void | 468 | void |
424 | update_member_session_history (struct GNUNET_MESSENGER_MemberSession *session, | 469 | update_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 | |||
450 | static void | 497 | static void |
451 | clear_member_chain_history (struct GNUNET_MESSENGER_MemberSession *session, | 498 | clear_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 | |||
460 | void | 509 | void |
461 | clear_member_session_history (struct GNUNET_MESSENGER_MemberSession *session, | 510 | clear_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 | |||
469 | struct GNUNET_MESSENGER_MemberSessionHistoryEntry | 519 | struct GNUNET_MESSENGER_MemberSessionHistoryEntry |
470 | { | 520 | { |
471 | struct GNUNET_HashCode hash; | 521 | struct GNUNET_HashCode hash; |
@@ -476,21 +526,22 @@ static void | |||
476 | load_member_session_history (struct GNUNET_MESSENGER_MemberSession *session, | 526 | load_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 | |||
518 | void | 573 | void |
519 | load_member_session (struct GNUNET_MESSENGER_Member *member, | 574 | load_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 | ||
566 | destroy_config: | 631 | destroy_config: |
567 | GNUNET_CONFIGURATION_destroy (cfg); | 632 | GNUNET_CONFIGURATION_destroy (cfg); |
568 | 633 | ||
569 | free_config: | 634 | free_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 | |||
590 | static struct GNUNET_MESSENGER_MemberSession* | 656 | static struct GNUNET_MESSENGER_MemberSession* |
591 | get_cycle_safe_next_session (struct GNUNET_MESSENGER_MemberSession *session, | 657 | get_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 | |||
609 | void | 676 | void |
610 | load_member_session_next (struct GNUNET_MESSENGER_MemberSession *session, | 677 | load_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 | ||
659 | free_config: | 732 | free_config: |
660 | GNUNET_free(config_file); | 733 | GNUNET_free (config_file); |
661 | } | 734 | } |
662 | 735 | ||
736 | |||
663 | static int | 737 | static int |
664 | iterate_save_member_session_history_hentries (void *cls, | 738 | iterate_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 | |||
677 | static void | 752 | static void |
678 | save_member_session_history (struct GNUNET_MESSENGER_MemberSession *session, | 753 | save_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 | |||
704 | void | 781 | void |
705 | save_member_session (struct GNUNET_MESSENGER_MemberSession *session, | 782 | save_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 | } |