diff options
Diffstat (limited to 'src/messenger')
-rw-r--r-- | src/messenger/gnunet-service-messenger.c | 4 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_handle.c | 14 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_handle.h | 4 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_message_store.c | 2 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_room.c | 19 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_service.c | 2 | ||||
-rw-r--r-- | src/messenger/gnunet-service-messenger_tunnel.c | 2 | ||||
-rw-r--r-- | src/messenger/messenger.conf.in | 1 | ||||
-rw-r--r-- | src/messenger/messenger_api.c | 6 | ||||
-rw-r--r-- | src/messenger/messenger_api_handle.c | 2 | ||||
-rw-r--r-- | src/messenger/messenger_api_message.c | 59 | ||||
-rw-r--r-- | src/messenger/messenger_api_message.h | 15 |
12 files changed, 77 insertions, 53 deletions
diff --git a/src/messenger/gnunet-service-messenger.c b/src/messenger/gnunet-service-messenger.c index a994e16ee..546f4c0d2 100644 --- a/src/messenger/gnunet-service-messenger.c +++ b/src/messenger/gnunet-service-messenger.c | |||
@@ -221,7 +221,7 @@ check_for_message: | |||
221 | 221 | ||
222 | struct GNUNET_MESSENGER_Message message; | 222 | struct GNUNET_MESSENGER_Message message; |
223 | 223 | ||
224 | if (length < get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN)) | 224 | if (length < get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN, GNUNET_NO)) |
225 | return GNUNET_NO; | 225 | return GNUNET_NO; |
226 | 226 | ||
227 | if (GNUNET_YES != decode_message (&message, msg_length, msg_buffer, GNUNET_NO, NULL)) | 227 | if (GNUNET_YES != decode_message (&message, msg_length, msg_buffer, GNUNET_NO, NULL)) |
@@ -310,7 +310,7 @@ callback_found_message (void *cls, | |||
310 | struct GNUNET_MESSENGER_MemberSession *session = get_member_session_of(member, message, hash); | 310 | struct GNUNET_MESSENGER_MemberSession *session = get_member_session_of(member, message, hash); |
311 | 311 | ||
312 | if (session) | 312 | if (session) |
313 | notify_handle_message (msg_client->handle, get_room_key(room), session, message, hash); | 313 | notify_handle_message (msg_client->handle, room, session, message, hash); |
314 | } | 314 | } |
315 | 315 | ||
316 | static void | 316 | static void |
diff --git a/src/messenger/gnunet-service-messenger_handle.c b/src/messenger/gnunet-service-messenger_handle.c index 2095f8b29..fa6830697 100644 --- a/src/messenger/gnunet-service-messenger_handle.c +++ b/src/messenger/gnunet-service-messenger_handle.c | |||
@@ -501,14 +501,14 @@ get_next_member_session_contect(const struct GNUNET_MESSENGER_MemberSession *ses | |||
501 | 501 | ||
502 | static const struct GNUNET_MESSENGER_MemberSession* | 502 | static const struct GNUNET_MESSENGER_MemberSession* |
503 | get_handle_member_session (struct GNUNET_MESSENGER_SrvHandle *handle, | 503 | get_handle_member_session (struct GNUNET_MESSENGER_SrvHandle *handle, |
504 | struct GNUNET_MESSENGER_SrvRoom *room, | ||
504 | const struct GNUNET_HashCode *key) | 505 | const struct GNUNET_HashCode *key) |
505 | { | 506 | { |
506 | GNUNET_assert((handle) && (key) && (handle->service)); | 507 | GNUNET_assert((handle) && (room) && (key) && (handle->service)); |
507 | 508 | ||
508 | const struct GNUNET_ShortHashCode *id = get_handle_member_id(handle, key); | 509 | const struct GNUNET_ShortHashCode *id = get_handle_member_id(handle, key); |
509 | struct GNUNET_MESSENGER_SrvRoom *room = get_service_room(handle->service, key); | ||
510 | 510 | ||
511 | if ((!id) || (!room)) | 511 | if (!id) |
512 | return NULL; | 512 | return NULL; |
513 | 513 | ||
514 | struct GNUNET_MESSENGER_MemberStore *store = get_room_member_store(room); | 514 | struct GNUNET_MESSENGER_MemberStore *store = get_room_member_store(room); |
@@ -524,12 +524,14 @@ get_handle_member_session (struct GNUNET_MESSENGER_SrvHandle *handle, | |||
524 | 524 | ||
525 | void | 525 | void |
526 | notify_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, | 526 | notify_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, |
527 | const struct GNUNET_HashCode *key, | 527 | struct GNUNET_MESSENGER_SrvRoom *room, |
528 | const struct GNUNET_MESSENGER_MemberSession *session, | 528 | const struct GNUNET_MESSENGER_MemberSession *session, |
529 | const struct GNUNET_MESSENGER_Message *message, | 529 | const struct GNUNET_MESSENGER_Message *message, |
530 | const struct GNUNET_HashCode *hash) | 530 | const struct GNUNET_HashCode *hash) |
531 | { | 531 | { |
532 | GNUNET_assert((handle) && (key) && (session) && (message) && (hash)); | 532 | GNUNET_assert((handle) && (room) && (session) && (message) && (hash)); |
533 | |||
534 | const struct GNUNET_HashCode *key = get_room_key(room); | ||
533 | 535 | ||
534 | if ((!handle->mq) || (!get_handle_member_id (handle, key))) | 536 | if ((!handle->mq) || (!get_handle_member_id (handle, key))) |
535 | { | 537 | { |
@@ -575,7 +577,7 @@ notify_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, | |||
575 | 577 | ||
576 | msg->flags = (uint32_t) GNUNET_MESSENGER_FLAG_NONE; | 578 | msg->flags = (uint32_t) GNUNET_MESSENGER_FLAG_NONE; |
577 | 579 | ||
578 | if (get_handle_member_session(handle, key) == session) | 580 | if (get_handle_member_session(handle, room, key) == session) |
579 | msg->flags |= (uint32_t) GNUNET_MESSENGER_FLAG_SENT; | 581 | msg->flags |= (uint32_t) GNUNET_MESSENGER_FLAG_SENT; |
580 | 582 | ||
581 | if (private_message) | 583 | if (private_message) |
diff --git a/src/messenger/gnunet-service-messenger_handle.h b/src/messenger/gnunet-service-messenger_handle.h index 97a984721..4438570b9 100644 --- a/src/messenger/gnunet-service-messenger_handle.h +++ b/src/messenger/gnunet-service-messenger_handle.h | |||
@@ -219,14 +219,14 @@ send_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, | |||
219 | * Notifies the handle that a new message was received or sent. | 219 | * Notifies the handle that a new message was received or sent. |
220 | * | 220 | * |
221 | * @param[in/out] handle Handle | 221 | * @param[in/out] handle Handle |
222 | * @param[in] key Key of room | 222 | * @param[in] room Room of the message |
223 | * @param[in] session Member session | 223 | * @param[in] session Member session |
224 | * @param[in] message Message | 224 | * @param[in] message Message |
225 | * @param[in] hash Hash of message | 225 | * @param[in] hash Hash of message |
226 | */ | 226 | */ |
227 | void | 227 | void |
228 | notify_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, | 228 | notify_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, |
229 | const struct GNUNET_HashCode *key, | 229 | struct GNUNET_MESSENGER_SrvRoom *room, |
230 | const struct GNUNET_MESSENGER_MemberSession *session, | 230 | const struct GNUNET_MESSENGER_MemberSession *session, |
231 | const struct GNUNET_MESSENGER_Message *message, | 231 | const struct GNUNET_MESSENGER_Message *message, |
232 | const struct GNUNET_HashCode *hash); | 232 | const struct GNUNET_HashCode *hash); |
diff --git a/src/messenger/gnunet-service-messenger_message_store.c b/src/messenger/gnunet-service-messenger_message_store.c index 56448997a..ce20ac924 100644 --- a/src/messenger/gnunet-service-messenger_message_store.c +++ b/src/messenger/gnunet-service-messenger_message_store.c | |||
@@ -427,7 +427,7 @@ get_store_message (struct GNUNET_MESSENGER_MessageStore *store, | |||
427 | return NULL; | 427 | return NULL; |
428 | 428 | ||
429 | if ((GNUNET_DISK_file_read (store->storage_messages, buffer, entry->length) != entry->length) || | 429 | if ((GNUNET_DISK_file_read (store->storage_messages, buffer, entry->length) != entry->length) || |
430 | (entry->length < get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN))) | 430 | (entry->length < get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN, GNUNET_YES))) |
431 | goto free_buffer; | 431 | goto free_buffer; |
432 | 432 | ||
433 | message = create_message (GNUNET_MESSENGER_KIND_UNKNOWN); | 433 | message = create_message (GNUNET_MESSENGER_KIND_UNKNOWN); |
diff --git a/src/messenger/gnunet-service-messenger_room.c b/src/messenger/gnunet-service-messenger_room.c index 920abb10e..d34665511 100644 --- a/src/messenger/gnunet-service-messenger_room.c +++ b/src/messenger/gnunet-service-messenger_room.c | |||
@@ -212,7 +212,9 @@ join_room (struct GNUNET_MESSENGER_SrvRoom *room, | |||
212 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Joining room: %s (%s)\n", GNUNET_h2s (get_room_key (room)), | 212 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Joining room: %s (%s)\n", GNUNET_h2s (get_room_key (room)), |
213 | GNUNET_sh2s (get_member_id(member))); | 213 | GNUNET_sh2s (get_member_id(member))); |
214 | 214 | ||
215 | if (GNUNET_OK != change_handle_member_id (handle, get_room_key(room), get_member_id(member))) | 215 | const struct GNUNET_ShortHashCode *member_id = get_member_id(member); |
216 | |||
217 | if (GNUNET_OK != change_handle_member_id (handle, get_room_key(room), member_id)) | ||
216 | return GNUNET_NO; | 218 | return GNUNET_NO; |
217 | 219 | ||
218 | struct GNUNET_MESSENGER_Message *message = create_message_join (get_handle_ego (handle)); | 220 | struct GNUNET_MESSENGER_Message *message = create_message_join (get_handle_ego (handle)); |
@@ -224,6 +226,7 @@ join_room (struct GNUNET_MESSENGER_SrvRoom *room, | |||
224 | return GNUNET_NO; | 226 | return GNUNET_NO; |
225 | } | 227 | } |
226 | 228 | ||
229 | GNUNET_memcpy(&(message->header.sender_id), member_id, sizeof(*member_id)); | ||
227 | return send_room_message (room, handle, message); | 230 | return send_room_message (room, handle, message); |
228 | } | 231 | } |
229 | 232 | ||
@@ -262,7 +265,7 @@ notify_about_members (struct GNUNET_MESSENGER_MemberNotify *notify, | |||
262 | const struct GNUNET_MESSENGER_Message *message = get_store_message(message_store, &(element->hash)); | 265 | const struct GNUNET_MESSENGER_Message *message = get_store_message(message_store, &(element->hash)); |
263 | 266 | ||
264 | if (message) | 267 | if (message) |
265 | notify_handle_message (notify->handle, get_room_key(notify->room), session, message, &(element->hash)); | 268 | notify_handle_message (notify->handle, notify->room, session, message, &(element->hash)); |
266 | } | 269 | } |
267 | } | 270 | } |
268 | 271 | ||
@@ -359,12 +362,7 @@ open_room (struct GNUNET_MESSENGER_SrvRoom *room, | |||
359 | const struct GNUNET_ShortHashCode *member_id = get_handle_member_id (handle, get_room_key(room)); | 362 | const struct GNUNET_ShortHashCode *member_id = get_handle_member_id (handle, get_room_key(room)); |
360 | 363 | ||
361 | struct GNUNET_MESSENGER_MemberStore *member_store = get_room_member_store(room); | 364 | struct GNUNET_MESSENGER_MemberStore *member_store = get_room_member_store(room); |
362 | struct GNUNET_MESSENGER_Member *member = get_store_member(member_store, member_id); | 365 | struct GNUNET_MESSENGER_Member *member = add_store_member(member_store, member_id); |
363 | |||
364 | if (member) | ||
365 | goto exit_open_room; | ||
366 | |||
367 | member = add_store_member(member_store, member_id); | ||
368 | 366 | ||
369 | if ((GNUNET_NO == join_room (room, handle, member)) && (room->port)) | 367 | if ((GNUNET_NO == join_room (room, handle, member)) && (room->port)) |
370 | { | 368 | { |
@@ -376,8 +374,9 @@ open_room (struct GNUNET_MESSENGER_SrvRoom *room, | |||
376 | return GNUNET_NO; | 374 | return GNUNET_NO; |
377 | } | 375 | } |
378 | 376 | ||
379 | exit_open_room: | 377 | struct GNUNET_MESSENGER_Message *peer_msg = create_message_peer (room->service); |
380 | return (room->port ? send_room_message (room, handle, create_message_peer (room->service)) : GNUNET_NO); | 378 | GNUNET_memcpy(&(peer_msg->header.sender_id), member_id, sizeof(*member_id)); |
379 | return (room->port ? send_room_message (room, handle, peer_msg) : GNUNET_NO); | ||
381 | } | 380 | } |
382 | 381 | ||
383 | int | 382 | int |
diff --git a/src/messenger/gnunet-service-messenger_service.c b/src/messenger/gnunet-service-messenger_service.c index 91165cf63..b53b72af8 100644 --- a/src/messenger/gnunet-service-messenger_service.c +++ b/src/messenger/gnunet-service-messenger_service.c | |||
@@ -313,7 +313,7 @@ handle_service_message (struct GNUNET_MESSENGER_Service *service, | |||
313 | 313 | ||
314 | while (element) | 314 | while (element) |
315 | { | 315 | { |
316 | notify_handle_message (element->handle, get_room_key(room), session, message, hash); | 316 | notify_handle_message (element->handle, room, session, message, hash); |
317 | element = element->next; | 317 | element = element->next; |
318 | } | 318 | } |
319 | } | 319 | } |
diff --git a/src/messenger/gnunet-service-messenger_tunnel.c b/src/messenger/gnunet-service-messenger_tunnel.c index c21f298b3..45c10c1af 100644 --- a/src/messenger/gnunet-service-messenger_tunnel.c +++ b/src/messenger/gnunet-service-messenger_tunnel.c | |||
@@ -122,7 +122,7 @@ check_tunnel_message (void *cls, | |||
122 | 122 | ||
123 | struct GNUNET_MESSENGER_Message message; | 123 | struct GNUNET_MESSENGER_Message message; |
124 | 124 | ||
125 | if (length < get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN)) | 125 | if (length < get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN, GNUNET_YES)) |
126 | { | 126 | { |
127 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Tunnel error: Message too short! (%d)\n", length); | 127 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Tunnel error: Message too short! (%d)\n", length); |
128 | return GNUNET_SYSERR; | 128 | return GNUNET_SYSERR; |
diff --git a/src/messenger/messenger.conf.in b/src/messenger/messenger.conf.in index 59e11b166..6b54550ea 100644 --- a/src/messenger/messenger.conf.in +++ b/src/messenger/messenger.conf.in | |||
@@ -1,5 +1,6 @@ | |||
1 | [messenger] | 1 | [messenger] |
2 | START_ON_DEMAND = YES | 2 | START_ON_DEMAND = YES |
3 | RUN_PER_USER = YES | ||
3 | PORT = 2097 | 4 | PORT = 2097 |
4 | HOSTNAME = localhost | 5 | HOSTNAME = localhost |
5 | BINARY = gnunet-service-messenger | 6 | BINARY = gnunet-service-messenger |
diff --git a/src/messenger/messenger_api.c b/src/messenger/messenger_api.c index c9b143662..2db841315 100644 --- a/src/messenger/messenger_api.c +++ b/src/messenger/messenger_api.c | |||
@@ -208,7 +208,7 @@ check_recv_message (void *cls, | |||
208 | 208 | ||
209 | struct GNUNET_MESSENGER_Message message; | 209 | struct GNUNET_MESSENGER_Message message; |
210 | 210 | ||
211 | if (length < get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN)) | 211 | if (length < get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN, GNUNET_YES)) |
212 | return GNUNET_NO; | 212 | return GNUNET_NO; |
213 | 213 | ||
214 | if (GNUNET_YES != decode_message (&message, length, buffer, GNUNET_YES, NULL)) | 214 | if (GNUNET_YES != decode_message (&message, length, buffer, GNUNET_YES, NULL)) |
@@ -255,8 +255,10 @@ handle_recv_message (void *cls, | |||
255 | 255 | ||
256 | handle_room_message (room, contact, &message, hash); | 256 | handle_room_message (room, contact, &message, hash); |
257 | 257 | ||
258 | const struct GNUNET_MESSENGER_Message *stored_message = get_room_message(room, hash); | ||
259 | |||
258 | if (handle->msg_callback) | 260 | if (handle->msg_callback) |
259 | handle->msg_callback (handle->msg_cls, room, contact, &message, hash, flags); | 261 | handle->msg_callback (handle->msg_cls, room, contact, stored_message, hash, flags); |
260 | } | 262 | } |
261 | else | 263 | else |
262 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Room not found\n"); | 264 | GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Room not found\n"); |
diff --git a/src/messenger/messenger_api_handle.c b/src/messenger/messenger_api_handle.c index 516807e13..242389040 100644 --- a/src/messenger/messenger_api_handle.c +++ b/src/messenger/messenger_api_handle.c | |||
@@ -98,7 +98,7 @@ destroy_handle (struct GNUNET_MESSENGER_Handle *handle) | |||
98 | 98 | ||
99 | clear_contact_store(get_handle_contact_store(handle)); | 99 | clear_contact_store(get_handle_contact_store(handle)); |
100 | 100 | ||
101 | GNUNET_free(handle->name); | 101 | GNUNET_free(handle); |
102 | } | 102 | } |
103 | 103 | ||
104 | void | 104 | void |
diff --git a/src/messenger/messenger_api_message.c b/src/messenger/messenger_api_message.c index 4e64cc22f..496c98dbf 100644 --- a/src/messenger/messenger_api_message.c +++ b/src/messenger/messenger_api_message.c | |||
@@ -229,13 +229,18 @@ get_message_body_kind_size (enum GNUNET_MESSENGER_MessageKind kind) | |||
229 | typedef uint32_t kind_t; | 229 | typedef uint32_t kind_t; |
230 | 230 | ||
231 | uint16_t | 231 | uint16_t |
232 | get_message_kind_size (enum GNUNET_MESSENGER_MessageKind kind) | 232 | get_message_kind_size (enum GNUNET_MESSENGER_MessageKind kind, |
233 | int include_header) | ||
233 | { | 234 | { |
234 | uint16_t length = 0; | 235 | uint16_t length = 0; |
235 | 236 | ||
236 | length += member_size(struct GNUNET_MESSENGER_Message, header.timestamp); | 237 | if (GNUNET_YES == include_header) |
237 | length += member_size(struct GNUNET_MESSENGER_Message, header.sender_id); | 238 | { |
238 | length += member_size(struct GNUNET_MESSENGER_Message, header.previous); | 239 | length += member_size(struct GNUNET_MESSENGER_Message, header.timestamp); |
240 | length += member_size(struct GNUNET_MESSENGER_Message, header.sender_id); | ||
241 | length += member_size(struct GNUNET_MESSENGER_Message, header.previous); | ||
242 | } | ||
243 | |||
239 | length += sizeof(kind_t); | 244 | length += sizeof(kind_t); |
240 | 245 | ||
241 | return length + get_message_body_kind_size (kind); | 246 | return length + get_message_body_kind_size (kind); |
@@ -279,16 +284,16 @@ get_message_body_size (enum GNUNET_MESSENGER_MessageKind kind, | |||
279 | 284 | ||
280 | uint16_t | 285 | uint16_t |
281 | get_message_size (const struct GNUNET_MESSENGER_Message *message, | 286 | get_message_size (const struct GNUNET_MESSENGER_Message *message, |
282 | int include_signature) | 287 | int include_header) |
283 | { | 288 | { |
284 | GNUNET_assert(message); | 289 | GNUNET_assert(message); |
285 | 290 | ||
286 | uint16_t length = 0; | 291 | uint16_t length = 0; |
287 | 292 | ||
288 | if (GNUNET_YES == include_signature) | 293 | if (GNUNET_YES == include_header) |
289 | length += GNUNET_IDENTITY_signature_get_length(&(message->header.signature)); | 294 | length += GNUNET_IDENTITY_signature_get_length(&(message->header.signature)); |
290 | 295 | ||
291 | length += get_message_kind_size (message->header.kind); | 296 | length += get_message_kind_size (message->header.kind, include_header); |
292 | length += get_message_body_size (message->header.kind, &(message->body)); | 297 | length += get_message_body_size (message->header.kind, &(message->body)); |
293 | 298 | ||
294 | return length; | 299 | return length; |
@@ -314,7 +319,7 @@ calc_usual_padding () | |||
314 | uint16_t kind_size; | 319 | uint16_t kind_size; |
315 | 320 | ||
316 | for (int i = 0; i <= GNUNET_MESSENGER_KIND_MAX; i++) { | 321 | for (int i = 0; i <= GNUNET_MESSENGER_KIND_MAX; i++) { |
317 | kind_size = get_message_kind_size ((enum GNUNET_MESSENGER_MessageKind) i); | 322 | kind_size = get_message_kind_size ((enum GNUNET_MESSENGER_MessageKind) i, GNUNET_YES); |
318 | 323 | ||
319 | if (kind_size > padding) | 324 | if (kind_size > padding) |
320 | padding = kind_size; | 325 | padding = kind_size; |
@@ -464,20 +469,24 @@ void | |||
464 | encode_message (const struct GNUNET_MESSENGER_Message *message, | 469 | encode_message (const struct GNUNET_MESSENGER_Message *message, |
465 | uint16_t length, | 470 | uint16_t length, |
466 | char *buffer, | 471 | char *buffer, |
467 | int include_signature) | 472 | int include_header) |
468 | { | 473 | { |
469 | GNUNET_assert((message) && (buffer)); | 474 | GNUNET_assert((message) && (buffer)); |
470 | 475 | ||
471 | uint16_t offset = 0; | 476 | uint16_t offset = 0; |
472 | 477 | ||
473 | if (GNUNET_YES == include_signature) | 478 | if (GNUNET_YES == include_header) |
474 | encode_step_signature(buffer, offset, &(message->header.signature), length); | 479 | encode_step_signature(buffer, offset, &(message->header.signature), length); |
475 | 480 | ||
476 | const kind_t kind = GNUNET_htobe32((kind_t) message->header.kind); | 481 | const kind_t kind = GNUNET_htobe32((kind_t) message->header.kind); |
477 | 482 | ||
478 | encode_step(buffer, offset, &(message->header.timestamp)); | 483 | if (GNUNET_YES == include_header) |
479 | encode_step(buffer, offset, &(message->header.sender_id)); | 484 | { |
480 | encode_step(buffer, offset, &(message->header.previous)); | 485 | encode_step(buffer, offset, &(message->header.timestamp)); |
486 | encode_step(buffer, offset, &(message->header.sender_id)); | ||
487 | encode_step(buffer, offset, &(message->header.previous)); | ||
488 | } | ||
489 | |||
481 | encode_step(buffer, offset, &kind); | 490 | encode_step(buffer, offset, &kind); |
482 | 491 | ||
483 | encode_message_body (message->header.kind, &(message->body), length, buffer, offset); | 492 | encode_message_body (message->header.kind, &(message->body), length, buffer, offset); |
@@ -619,14 +628,18 @@ int | |||
619 | decode_message (struct GNUNET_MESSENGER_Message *message, | 628 | decode_message (struct GNUNET_MESSENGER_Message *message, |
620 | uint16_t length, | 629 | uint16_t length, |
621 | const char *buffer, | 630 | const char *buffer, |
622 | int include_signature, | 631 | int include_header, |
623 | uint16_t *padding) | 632 | uint16_t *padding) |
624 | { | 633 | { |
625 | GNUNET_assert((message) && (buffer) && (length >= get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN))); | 634 | GNUNET_assert( |
635 | (message) && | ||
636 | (buffer) && | ||
637 | (length >= get_message_kind_size(GNUNET_MESSENGER_KIND_UNKNOWN, include_header)) | ||
638 | ); | ||
626 | 639 | ||
627 | uint16_t offset = 0; | 640 | uint16_t offset = 0; |
628 | 641 | ||
629 | if (GNUNET_YES == include_signature) | 642 | if (GNUNET_YES == include_header) |
630 | { | 643 | { |
631 | ssize_t result = GNUNET_IDENTITY_read_signature_from_buffer( | 644 | ssize_t result = GNUNET_IDENTITY_read_signature_from_buffer( |
632 | &(message->header.signature), buffer, length - offset | 645 | &(message->header.signature), buffer, length - offset |
@@ -640,19 +653,23 @@ decode_message (struct GNUNET_MESSENGER_Message *message, | |||
640 | 653 | ||
641 | const uint16_t count = length - offset; | 654 | const uint16_t count = length - offset; |
642 | 655 | ||
643 | if (count < get_message_kind_size (GNUNET_MESSENGER_KIND_UNKNOWN)) | 656 | if (count < get_message_kind_size (GNUNET_MESSENGER_KIND_UNKNOWN, include_header)) |
644 | return GNUNET_NO; | 657 | return GNUNET_NO; |
645 | 658 | ||
646 | kind_t kind; | 659 | kind_t kind; |
647 | 660 | ||
648 | decode_step(buffer, offset, &(message->header.timestamp)); | 661 | if (GNUNET_YES == include_header) |
649 | decode_step(buffer, offset, &(message->header.sender_id)); | 662 | { |
650 | decode_step(buffer, offset, &(message->header.previous)); | 663 | decode_step(buffer, offset, &(message->header.timestamp)); |
664 | decode_step(buffer, offset, &(message->header.sender_id)); | ||
665 | decode_step(buffer, offset, &(message->header.previous)); | ||
666 | } | ||
667 | |||
651 | decode_step(buffer, offset, &kind); | 668 | decode_step(buffer, offset, &kind); |
652 | 669 | ||
653 | message->header.kind = (enum GNUNET_MESSENGER_MessageKind) GNUNET_be32toh(kind); | 670 | message->header.kind = (enum GNUNET_MESSENGER_MessageKind) GNUNET_be32toh(kind); |
654 | 671 | ||
655 | if (count < get_message_kind_size (message->header.kind)) | 672 | if (count < get_message_kind_size (message->header.kind, include_header)) |
656 | return GNUNET_NO; | 673 | return GNUNET_NO; |
657 | 674 | ||
658 | const uint16_t result = decode_message_body (&(message->header.kind), &(message->body), length, buffer, offset); | 675 | const uint16_t result = decode_message_body (&(message->header.kind), &(message->body), length, buffer, offset); |
diff --git a/src/messenger/messenger_api_message.h b/src/messenger/messenger_api_message.h index 21161c134..46c5cb024 100644 --- a/src/messenger/messenger_api_message.h +++ b/src/messenger/messenger_api_message.h | |||
@@ -90,21 +90,23 @@ is_message_session_bound (const struct GNUNET_MESSENGER_Message *message); | |||
90 | * Returns the minimal size in bytes to encode a message of a specific <i>kind</i>. | 90 | * Returns the minimal size in bytes to encode a message of a specific <i>kind</i>. |
91 | * | 91 | * |
92 | * @param[in] kind Kind of message | 92 | * @param[in] kind Kind of message |
93 | * @param[in] include_header Flag to include header | ||
93 | * @return Minimal size to encode | 94 | * @return Minimal size to encode |
94 | */ | 95 | */ |
95 | uint16_t | 96 | uint16_t |
96 | get_message_kind_size (enum GNUNET_MESSENGER_MessageKind kind); | 97 | get_message_kind_size (enum GNUNET_MESSENGER_MessageKind kind, |
98 | int include_header); | ||
97 | 99 | ||
98 | /** | 100 | /** |
99 | * Returns the exact size in bytes to encode a given <i>message</i>. | 101 | * Returns the exact size in bytes to encode a given <i>message</i>. |
100 | * | 102 | * |
101 | * @param[in] message Message | 103 | * @param[in] message Message |
102 | * @param[in] encode_signature Flag to include signature | 104 | * @param[in] include_header Flag to include header |
103 | * @return Size to encode | 105 | * @return Size to encode |
104 | */ | 106 | */ |
105 | uint16_t | 107 | uint16_t |
106 | get_message_size (const struct GNUNET_MESSENGER_Message *message, | 108 | get_message_size (const struct GNUNET_MESSENGER_Message *message, |
107 | int include_signature); | 109 | int include_header); |
108 | 110 | ||
109 | /** | 111 | /** |
110 | * Encodes a given <i>message</i> into a <i>buffer</i> of a maximal <i>length</i> in bytes. | 112 | * Encodes a given <i>message</i> into a <i>buffer</i> of a maximal <i>length</i> in bytes. |
@@ -112,13 +114,13 @@ get_message_size (const struct GNUNET_MESSENGER_Message *message, | |||
112 | * @param[in] message Message | 114 | * @param[in] message Message |
113 | * @param[in] length Maximal length to encode | 115 | * @param[in] length Maximal length to encode |
114 | * @param[out] buffer Buffer | 116 | * @param[out] buffer Buffer |
115 | * @param[in] encode_signature Flag to include signature | 117 | * @param[in] include_header Flag to include header |
116 | */ | 118 | */ |
117 | void | 119 | void |
118 | encode_message (const struct GNUNET_MESSENGER_Message *message, | 120 | encode_message (const struct GNUNET_MESSENGER_Message *message, |
119 | uint16_t length, | 121 | uint16_t length, |
120 | char *buffer, | 122 | char *buffer, |
121 | int include_signature); | 123 | int include_header); |
122 | 124 | ||
123 | /** | 125 | /** |
124 | * Decodes a <i>message</i> from a given <i>buffer</i> of a maximal <i>length</i> in bytes. | 126 | * Decodes a <i>message</i> from a given <i>buffer</i> of a maximal <i>length</i> in bytes. |
@@ -131,6 +133,7 @@ encode_message (const struct GNUNET_MESSENGER_Message *message, | |||
131 | * @param[out] message Message | 133 | * @param[out] message Message |
132 | * @param[in] length Maximal length to decode | 134 | * @param[in] length Maximal length to decode |
133 | * @param[in] buffer Buffer | 135 | * @param[in] buffer Buffer |
136 | * @param[in] include_header Flag to include header | ||
134 | * @param[out] padding Padding | 137 | * @param[out] padding Padding |
135 | * @return #GNUNET_YES on success, otherwise #GNUNET_NO | 138 | * @return #GNUNET_YES on success, otherwise #GNUNET_NO |
136 | */ | 139 | */ |
@@ -138,7 +141,7 @@ int | |||
138 | decode_message (struct GNUNET_MESSENGER_Message *message, | 141 | decode_message (struct GNUNET_MESSENGER_Message *message, |
139 | uint16_t length, | 142 | uint16_t length, |
140 | const char *buffer, | 143 | const char *buffer, |
141 | int include_signature, | 144 | int include_header, |
142 | uint16_t *padding); | 145 | uint16_t *padding); |
143 | 146 | ||
144 | /** | 147 | /** |