aboutsummaryrefslogtreecommitdiff
path: root/src/chat/gnunet-chat.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/chat/gnunet-chat.c')
-rw-r--r--src/chat/gnunet-chat.c354
1 files changed, 173 insertions, 181 deletions
diff --git a/src/chat/gnunet-chat.c b/src/chat/gnunet-chat.c
index 85d266534..6dba4dda5 100644
--- a/src/chat/gnunet-chat.c
+++ b/src/chat/gnunet-chat.c
@@ -44,7 +44,8 @@ static struct GNUNET_CONTAINER_MetaData *meta;
44 44
45static struct GNUNET_CHAT_Room *room; 45static struct GNUNET_CHAT_Room *room;
46 46
47static GNUNET_SCHEDULER_TaskIdentifier handle_cmd_task = GNUNET_SCHEDULER_NO_TASK; 47static GNUNET_SCHEDULER_TaskIdentifier handle_cmd_task =
48 GNUNET_SCHEDULER_NO_TASK;
48 49
49struct ChatCommand 50struct ChatCommand
50{ 51{
@@ -66,12 +67,13 @@ static void
66free_user_list () 67free_user_list ()
67{ 68{
68 struct UserList *next; 69 struct UserList *next;
70
69 while (NULL != users) 71 while (NULL != users)
70 { 72 {
71 next = users->next; 73 next = users->next;
72 GNUNET_free (users); 74 GNUNET_free (users);
73 users = next; 75 users = next;
74 } 76 }
75} 77}
76 78
77static int do_help (const char *args, const void *xtra); 79static int do_help (const char *args, const void *xtra);
@@ -107,7 +109,7 @@ join_cb (void *cls)
107static int 109static int
108receive_cb (void *cls, 110receive_cb (void *cls,
109 struct GNUNET_CHAT_Room *room, 111 struct GNUNET_CHAT_Room *room,
110 const GNUNET_HashCode *sender, 112 const GNUNET_HashCode * sender,
111 const struct GNUNET_CONTAINER_MetaData *member_info, 113 const struct GNUNET_CONTAINER_MetaData *member_info,
112 const char *message, 114 const char *message,
113 struct GNUNET_TIME_Absolute timestamp, 115 struct GNUNET_TIME_Absolute timestamp,
@@ -122,43 +124,45 @@ receive_cb (void *cls,
122 else 124 else
123 nick = GNUNET_strdup (_("anonymous")); 125 nick = GNUNET_strdup (_("anonymous"));
124 fmt = NULL; 126 fmt = NULL;
125 switch ( (int) options) 127 switch ((int) options)
126 { 128 {
127 case GNUNET_CHAT_MSG_OPTION_NONE: 129 case GNUNET_CHAT_MSG_OPTION_NONE:
128 case GNUNET_CHAT_MSG_ANONYMOUS: 130 case GNUNET_CHAT_MSG_ANONYMOUS:
129 fmt = _("(%s) `%s' said: %s\n"); 131 fmt = _("(%s) `%s' said: %s\n");
130 break; 132 break;
131 case GNUNET_CHAT_MSG_PRIVATE: 133 case GNUNET_CHAT_MSG_PRIVATE:
132 fmt = _("(%s) `%s' said to you: %s\n"); 134 fmt = _("(%s) `%s' said to you: %s\n");
133 break; 135 break;
134 case GNUNET_CHAT_MSG_PRIVATE | GNUNET_CHAT_MSG_ANONYMOUS: 136 case GNUNET_CHAT_MSG_PRIVATE | GNUNET_CHAT_MSG_ANONYMOUS:
135 fmt = _("(%s) `%s' said to you: %s\n"); 137 fmt = _("(%s) `%s' said to you: %s\n");
136 break; 138 break;
137 case GNUNET_CHAT_MSG_AUTHENTICATED: 139 case GNUNET_CHAT_MSG_AUTHENTICATED:
138 fmt = _("(%s) `%s' said for sure: %s\n"); 140 fmt = _("(%s) `%s' said for sure: %s\n");
139 break; 141 break;
140 case GNUNET_CHAT_MSG_PRIVATE | GNUNET_CHAT_MSG_AUTHENTICATED: 142 case GNUNET_CHAT_MSG_PRIVATE | GNUNET_CHAT_MSG_AUTHENTICATED:
141 fmt = _("(%s) `%s' said to you for sure: %s\n"); 143 fmt = _("(%s) `%s' said to you for sure: %s\n");
142 break; 144 break;
143 case GNUNET_CHAT_MSG_ACKNOWLEDGED: 145 case GNUNET_CHAT_MSG_ACKNOWLEDGED:
144 fmt = _("(%s) `%s' was confirmed that you received: %s\n"); 146 fmt = _("(%s) `%s' was confirmed that you received: %s\n");
145 break; 147 break;
146 case GNUNET_CHAT_MSG_PRIVATE | GNUNET_CHAT_MSG_ACKNOWLEDGED: 148 case GNUNET_CHAT_MSG_PRIVATE | GNUNET_CHAT_MSG_ACKNOWLEDGED:
147 fmt = _("(%s) `%s' was confirmed that you and only you received: %s\n"); 149 fmt = _("(%s) `%s' was confirmed that you and only you received: %s\n");
148 break; 150 break;
149 case GNUNET_CHAT_MSG_AUTHENTICATED | GNUNET_CHAT_MSG_ACKNOWLEDGED: 151 case GNUNET_CHAT_MSG_AUTHENTICATED | GNUNET_CHAT_MSG_ACKNOWLEDGED:
150 fmt = _("(%s) `%s' was confirmed that you received from him or her: %s\n"); 152 fmt = _("(%s) `%s' was confirmed that you received from him or her: %s\n");
151 break; 153 break;
152 case GNUNET_CHAT_MSG_AUTHENTICATED | GNUNET_CHAT_MSG_PRIVATE | GNUNET_CHAT_MSG_ACKNOWLEDGED: 154 case GNUNET_CHAT_MSG_AUTHENTICATED | GNUNET_CHAT_MSG_PRIVATE | GNUNET_CHAT_MSG_ACKNOWLEDGED:
153 fmt = _("(%s) `%s' was confirmed that you and only you received from him or her: %s\n"); 155 fmt =
154 break; 156 _
155 case GNUNET_CHAT_MSG_OFF_THE_RECORD: 157 ("(%s) `%s' was confirmed that you and only you received from him or her: %s\n");
156 fmt = _("(%s) `%s' said off the record: %s\n"); 158 break;
157 break; 159 case GNUNET_CHAT_MSG_OFF_THE_RECORD:
158 default: 160 fmt = _("(%s) `%s' said off the record: %s\n");
159 fmt = _("(%s) <%s> said using an unknown message type: %s\n"); 161 break;
160 break; 162 default:
161 } 163 fmt = _("(%s) <%s> said using an unknown message type: %s\n");
164 break;
165 }
162 time = GNUNET_STRINGS_absolute_time_to_string (timestamp); 166 time = GNUNET_STRINGS_absolute_time_to_string (timestamp);
163 fprintf (stdout, fmt, time, nick, message); 167 fprintf (stdout, fmt, time, nick, message);
164 GNUNET_free (nick); 168 GNUNET_free (nick);
@@ -183,7 +187,7 @@ confirmation_cb (void *cls,
183 struct GNUNET_CHAT_Room *room, 187 struct GNUNET_CHAT_Room *room,
184 uint32_t orig_seq_number, 188 uint32_t orig_seq_number,
185 struct GNUNET_TIME_Absolute timestamp, 189 struct GNUNET_TIME_Absolute timestamp,
186 const GNUNET_HashCode *receiver) 190 const GNUNET_HashCode * receiver)
187{ 191{
188 char *nick; 192 char *nick;
189 193
@@ -222,40 +226,41 @@ member_list_cb (void *cls,
222 ? _("`%s' entered the room\n") : _("`%s' left the room\n"), nick); 226 ? _("`%s' entered the room\n") : _("`%s' left the room\n"), nick);
223 GNUNET_free (nick); 227 GNUNET_free (nick);
224 if (NULL != member_info) 228 if (NULL != member_info)
229 {
230 /* user joining */
231 pos = GNUNET_malloc (sizeof (struct UserList));
232 pos->next = users;
233 pos->pkey = *member_id;
234 pos->ignored = GNUNET_NO;
235 users = pos;
236 }
237 else
238 {
239 /* user leaving */
240 prev = NULL;
241 pos = users;
242 while ((NULL != pos) &&
243 (0 != memcmp (&pos->pkey,
244 member_id,
245 sizeof (struct
246 GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded))))
225 { 247 {
226 /* user joining */ 248 prev = pos;
227 pos = GNUNET_malloc (sizeof (struct UserList)); 249 pos = pos->next;
228 pos->next = users;
229 pos->pkey = *member_id;
230 pos->ignored = GNUNET_NO;
231 users = pos;
232 } 250 }
233 else 251 if (NULL == pos)
234 { 252 {
235 /* user leaving */ 253 GNUNET_break (0);
236 prev = NULL; 254 }
237 pos = users; 255 else
238 while ((NULL != pos) && 256 {
239 (0 != memcmp (&pos->pkey, 257 if (NULL == prev)
240 member_id, 258 users = pos->next;
241 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded))))
242 {
243 prev = pos;
244 pos = pos->next;
245 }
246 if (NULL == pos)
247 {
248 GNUNET_break (0);
249 }
250 else 259 else
251 { 260 prev->next = pos->next;
252 if (NULL == prev) 261 GNUNET_free (pos);
253 users = pos->next;
254 else
255 prev->next = pos->next;
256 GNUNET_free (pos);
257 }
258 } 262 }
263 }
259 return GNUNET_OK; 264 return GNUNET_OK;
260} 265}
261 266
@@ -282,12 +287,13 @@ do_join (const char *arg, const void *xtra)
282 &member_list_cb, NULL, 287 &member_list_cb, NULL,
283 &confirmation_cb, NULL, &me); 288 &confirmation_cb, NULL, &me);
284 if (NULL == room) 289 if (NULL == room)
285 { 290 {
286 fprintf (stdout, _("Could not change username\n")); 291 fprintf (stdout, _("Could not change username\n"));
287 return GNUNET_SYSERR; 292 return GNUNET_SYSERR;
288 } 293 }
289 my_name = GNUNET_PSEUDONYM_id_to_name (cfg, &me); 294 my_name = GNUNET_PSEUDONYM_id_to_name (cfg, &me);
290 fprintf (stdout, _("Joining room `%s' as user `%s'...\n"), room_name, my_name); 295 fprintf (stdout, _("Joining room `%s' as user `%s'...\n"), room_name,
296 my_name);
291 GNUNET_free (my_name); 297 GNUNET_free (my_name);
292 return GNUNET_OK; 298 return GNUNET_OK;
293} 299}
@@ -310,8 +316,7 @@ do_nick (const char *msg, const void *xtra)
310 EXTRACTOR_METATYPE_TITLE, 316 EXTRACTOR_METATYPE_TITLE,
311 EXTRACTOR_METAFORMAT_UTF8, 317 EXTRACTOR_METAFORMAT_UTF8,
312 "text/plain", 318 "text/plain",
313 nickname, 319 nickname, strlen (nickname) + 1);
314 strlen(nickname)+1);
315 room = GNUNET_CHAT_join_room (cfg, 320 room = GNUNET_CHAT_join_room (cfg,
316 nickname, 321 nickname,
317 meta, 322 meta,
@@ -322,10 +327,10 @@ do_nick (const char *msg, const void *xtra)
322 &member_list_cb, NULL, 327 &member_list_cb, NULL,
323 &confirmation_cb, NULL, &me); 328 &confirmation_cb, NULL, &me);
324 if (NULL == room) 329 if (NULL == room)
325 { 330 {
326 fprintf (stdout, _("Could not change username\n")); 331 fprintf (stdout, _("Could not change username\n"));
327 return GNUNET_SYSERR; 332 return GNUNET_SYSERR;
328 } 333 }
329 my_name = GNUNET_PSEUDONYM_id_to_name (cfg, &me); 334 my_name = GNUNET_PSEUDONYM_id_to_name (cfg, &me);
330 fprintf (stdout, _("Changed username to `%s'\n"), my_name); 335 fprintf (stdout, _("Changed username to `%s'\n"), my_name);
331 GNUNET_free (my_name); 336 GNUNET_free (my_name);
@@ -343,15 +348,15 @@ do_names (const char *msg, const void *xtra)
343 fprintf (stdout, _("Users in room `%s': "), room_name); 348 fprintf (stdout, _("Users in room `%s': "), room_name);
344 pos = users; 349 pos = users;
345 while (NULL != pos) 350 while (NULL != pos)
346 { 351 {
347 GNUNET_CRYPTO_hash (&pos->pkey, 352 GNUNET_CRYPTO_hash (&pos->pkey,
348 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), 353 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
349 &pid); 354 &pid);
350 name = GNUNET_PSEUDONYM_id_to_name (cfg, &pid); 355 name = GNUNET_PSEUDONYM_id_to_name (cfg, &pid);
351 fprintf (stdout, "`%s' ", name); 356 fprintf (stdout, "`%s' ", name);
352 GNUNET_free (name); 357 GNUNET_free (name);
353 pos = pos->next; 358 pos = pos->next;
354 } 359 }
355 fprintf (stdout, "\n"); 360 fprintf (stdout, "\n");
356 return GNUNET_OK; 361 return GNUNET_OK;
357} 362}
@@ -361,10 +366,8 @@ static int
361do_send (const char *msg, const void *xtra) 366do_send (const char *msg, const void *xtra)
362{ 367{
363 uint32_t seq; 368 uint32_t seq;
364 GNUNET_CHAT_send_message (room, 369
365 msg, 370 GNUNET_CHAT_send_message (room, msg, GNUNET_CHAT_MSG_OPTION_NONE, NULL, &seq);
366 GNUNET_CHAT_MSG_OPTION_NONE,
367 NULL, &seq);
368 return GNUNET_OK; 371 return GNUNET_OK;
369} 372}
370 373
@@ -379,40 +382,37 @@ do_send_pm (const char *msg, const void *xtra)
379 struct UserList *pos; 382 struct UserList *pos;
380 383
381 if (NULL == strstr (msg, " ")) 384 if (NULL == strstr (msg, " "))
382 { 385 {
383 fprintf (stderr, _("Syntax: /msg USERNAME MESSAGE")); 386 fprintf (stderr, _("Syntax: /msg USERNAME MESSAGE"));
384 return GNUNET_OK; 387 return GNUNET_OK;
385 } 388 }
386 user = GNUNET_strdup (msg); 389 user = GNUNET_strdup (msg);
387 strstr (user, " ")[0] = '\0'; 390 strstr (user, " ")[0] = '\0';
388 msg += strlen (user) + 1; 391 msg += strlen (user) + 1;
389 if (GNUNET_OK != GNUNET_PSEUDONYM_name_to_id (cfg, user, &uid)) 392 if (GNUNET_OK != GNUNET_PSEUDONYM_name_to_id (cfg, user, &uid))
390 { 393 {
391 fprintf (stderr, _("Unknown user `%s'\n"), user); 394 fprintf (stderr, _("Unknown user `%s'\n"), user);
392 GNUNET_free (user); 395 GNUNET_free (user);
393 return GNUNET_OK; 396 return GNUNET_OK;
394 } 397 }
395 pos = users; 398 pos = users;
396 while (NULL != pos) 399 while (NULL != pos)
397 { 400 {
398 GNUNET_CRYPTO_hash (&pos->pkey, 401 GNUNET_CRYPTO_hash (&pos->pkey,
399 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), 402 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
400 &pid); 403 &pid);
401 if (0 == memcmp (&pid, &uid, sizeof (GNUNET_HashCode))) 404 if (0 == memcmp (&pid, &uid, sizeof (GNUNET_HashCode)))
402 break; 405 break;
403 pos = pos->next; 406 pos = pos->next;
404 } 407 }
405 if (NULL == pos) 408 if (NULL == pos)
406 { 409 {
407 fprintf (stderr, _("User `%s' is currently not in the room!\n"), user); 410 fprintf (stderr, _("User `%s' is currently not in the room!\n"), user);
408 GNUNET_free (user); 411 GNUNET_free (user);
409 return GNUNET_OK; 412 return GNUNET_OK;
410 } 413 }
411 GNUNET_CHAT_send_message (room, 414 GNUNET_CHAT_send_message (room,
412 msg, 415 msg, GNUNET_CHAT_MSG_PRIVATE, &pos->pkey, &seq);
413 GNUNET_CHAT_MSG_PRIVATE,
414 &pos->pkey,
415 &seq);
416 GNUNET_free (user); 416 GNUNET_free (user);
417 return GNUNET_OK; 417 return GNUNET_OK;
418} 418}
@@ -422,10 +422,9 @@ static int
422do_send_sig (const char *msg, const void *xtra) 422do_send_sig (const char *msg, const void *xtra)
423{ 423{
424 uint32_t seq; 424 uint32_t seq;
425
425 GNUNET_CHAT_send_message (room, 426 GNUNET_CHAT_send_message (room,
426 msg, 427 msg, GNUNET_CHAT_MSG_AUTHENTICATED, NULL, &seq);
427 GNUNET_CHAT_MSG_AUTHENTICATED,
428 NULL, &seq);
429 return GNUNET_OK; 428 return GNUNET_OK;
430} 429}
431 430
@@ -434,10 +433,9 @@ static int
434do_send_ack (const char *msg, const void *xtra) 433do_send_ack (const char *msg, const void *xtra)
435{ 434{
436 uint32_t seq; 435 uint32_t seq;
436
437 GNUNET_CHAT_send_message (room, 437 GNUNET_CHAT_send_message (room,
438 msg, 438 msg, GNUNET_CHAT_MSG_ACKNOWLEDGED, NULL, &seq);
439 GNUNET_CHAT_MSG_ACKNOWLEDGED,
440 NULL, &seq);
441 return GNUNET_OK; 439 return GNUNET_OK;
442} 440}
443 441
@@ -446,10 +444,8 @@ static int
446do_send_anonymous (const char *msg, const void *xtra) 444do_send_anonymous (const char *msg, const void *xtra)
447{ 445{
448 uint32_t seq; 446 uint32_t seq;
449 GNUNET_CHAT_send_message (room, 447
450 msg, 448 GNUNET_CHAT_send_message (room, msg, GNUNET_CHAT_MSG_ANONYMOUS, NULL, &seq);
451 GNUNET_CHAT_MSG_ANONYMOUS,
452 NULL, &seq);
453 return GNUNET_OK; 449 return GNUNET_OK;
454} 450}
455 451
@@ -509,8 +505,8 @@ static struct ChatCommand commands[] = {
509 {"/help", &do_help, 505 {"/help", &do_help,
510 gettext_noop ("Use `/help command' to get help for a specific command")}, 506 gettext_noop ("Use `/help command' to get help for a specific command")},
511 /* Add standard commands: 507 /* Add standard commands:
512 /whois (print metadata), 508 * /whois (print metadata),
513 /ignore (set flag, check on receive!) */ 509 * /ignore (set flag, check on receive!) */
514 /* the following three commands must be last! */ 510 /* the following three commands must be last! */
515 {"/", &do_unknown, NULL}, 511 {"/", &do_unknown, NULL},
516 {"", &do_send, NULL}, 512 {"", &do_send, NULL},
@@ -522,41 +518,40 @@ static int
522do_help (const char *args, const void *xtra) 518do_help (const char *args, const void *xtra)
523{ 519{
524 int i; 520 int i;
521
525 i = 0; 522 i = 0;
526 while ((NULL != args) && 523 while ((NULL != args) &&
527 (0 != strlen (args)) && (commands[i].Action != &do_help)) 524 (0 != strlen (args)) && (commands[i].Action != &do_help))
525 {
526 if (0 == strncasecmp (&args[1], &commands[i].command[1], strlen (args) - 1))
528 { 527 {
529 if (0 == 528 fprintf (stdout, "%s\n", gettext (commands[i].helptext));
530 strncasecmp (&args[1], &commands[i].command[1], strlen (args) - 1)) 529 return GNUNET_OK;
531 {
532 fprintf (stdout, "%s\n", gettext (commands[i].helptext));
533 return GNUNET_OK;
534 }
535 i++;
536 } 530 }
531 i++;
532 }
537 i = 0; 533 i = 0;
538 fprintf (stdout, "Available commands:"); 534 fprintf (stdout, "Available commands:");
539 while (commands[i].Action != &do_help) 535 while (commands[i].Action != &do_help)
540 { 536 {
541 fprintf (stdout, " %s", gettext (commands[i].command)); 537 fprintf (stdout, " %s", gettext (commands[i].command));
542 i++; 538 i++;
543 } 539 }
544 fprintf (stdout, "\n"); 540 fprintf (stdout, "\n");
545 fprintf (stdout, "%s\n", gettext (commands[i].helptext)); 541 fprintf (stdout, "%s\n", gettext (commands[i].helptext));
546 return GNUNET_OK; 542 return GNUNET_OK;
547} 543}
548 544
549 545
550static void 546static void
551do_stop_task (void *cls, 547do_stop_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
552 const struct GNUNET_SCHEDULER_TaskContext *tc)
553{ 548{
554 GNUNET_CHAT_leave_room (room); 549 GNUNET_CHAT_leave_room (room);
555 if (handle_cmd_task != GNUNET_SCHEDULER_NO_TASK) 550 if (handle_cmd_task != GNUNET_SCHEDULER_NO_TASK)
556 { 551 {
557 GNUNET_SCHEDULER_cancel (handle_cmd_task); 552 GNUNET_SCHEDULER_cancel (handle_cmd_task);
558 handle_cmd_task = GNUNET_SCHEDULER_NO_TASK; 553 handle_cmd_task = GNUNET_SCHEDULER_NO_TASK;
559 } 554 }
560 free_user_list (); 555 free_user_list ();
561 GNUNET_CONTAINER_meta_data_destroy (meta); 556 GNUNET_CONTAINER_meta_data_destroy (meta);
562 GNUNET_free (room_name); 557 GNUNET_free (room_name);
@@ -591,10 +586,9 @@ handle_command (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
591 586
592next: 587next:
593 handle_cmd_task = 588 handle_cmd_task =
594 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_MILLISECONDS, 589 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply
595 100), 590 (GNUNET_TIME_UNIT_MILLISECONDS, 100),
596 &handle_command, 591 &handle_command, NULL);
597 NULL);
598 return; 592 return;
599 593
600out: 594out:
@@ -614,8 +608,7 @@ out:
614static void 608static void
615run (void *cls, 609run (void *cls,
616 char *const *args, 610 char *const *args,
617 const char *cfgfile, 611 const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *c)
618 const struct GNUNET_CONFIGURATION_Handle *c)
619{ 612{
620 GNUNET_HashCode me; 613 GNUNET_HashCode me;
621 char *my_name; 614 char *my_name;
@@ -623,11 +616,11 @@ run (void *cls,
623 cfg = c; 616 cfg = c;
624 /* check arguments */ 617 /* check arguments */
625 if (NULL == nickname) 618 if (NULL == nickname)
626 { 619 {
627 fprintf (stderr, _("You must specify a nickname\n")); 620 fprintf (stderr, _("You must specify a nickname\n"));
628 ret = -1; 621 ret = -1;
629 return; 622 return;
630 } 623 }
631 if (NULL == room_name) 624 if (NULL == room_name)
632 room_name = GNUNET_strdup ("gnunet"); 625 room_name = GNUNET_strdup ("gnunet");
633 meta = GNUNET_CONTAINER_meta_data_create (); 626 meta = GNUNET_CONTAINER_meta_data_create ();
@@ -636,8 +629,7 @@ run (void *cls,
636 EXTRACTOR_METATYPE_TITLE, 629 EXTRACTOR_METATYPE_TITLE,
637 EXTRACTOR_METAFORMAT_UTF8, 630 EXTRACTOR_METAFORMAT_UTF8,
638 "text/plain", 631 "text/plain",
639 nickname, 632 nickname, strlen (nickname) + 1);
640 strlen(nickname)+1);
641 room = GNUNET_CHAT_join_room (cfg, 633 room = GNUNET_CHAT_join_room (cfg,
642 nickname, 634 nickname,
643 meta, 635 meta,
@@ -648,24 +640,23 @@ run (void *cls,
648 &member_list_cb, NULL, 640 &member_list_cb, NULL,
649 &confirmation_cb, NULL, &me); 641 &confirmation_cb, NULL, &me);
650 if (NULL == room) 642 if (NULL == room)
651 { 643 {
652 fprintf (stderr, _("Failed to join room `%s'\n"), room_name); 644 fprintf (stderr, _("Failed to join room `%s'\n"), room_name);
653 GNUNET_free (room_name); 645 GNUNET_free (room_name);
654 GNUNET_free (nickname); 646 GNUNET_free (nickname);
655 GNUNET_CONTAINER_meta_data_destroy (meta); 647 GNUNET_CONTAINER_meta_data_destroy (meta);
656 ret = -1; 648 ret = -1;
657 return; 649 return;
658 } 650 }
659 my_name = GNUNET_PSEUDONYM_id_to_name (cfg, &me); 651 my_name = GNUNET_PSEUDONYM_id_to_name (cfg, &me);
660 fprintf (stdout, _("Joining room `%s' as user `%s'...\n"), room_name, my_name); 652 fprintf (stdout, _("Joining room `%s' as user `%s'...\n"), room_name,
653 my_name);
661 GNUNET_free (my_name); 654 GNUNET_free (my_name);
662 handle_cmd_task = 655 handle_cmd_task =
663 GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_UI, 656 GNUNET_SCHEDULER_add_with_priority (GNUNET_SCHEDULER_PRIORITY_UI,
664 &handle_command, 657 &handle_command, NULL);
665 NULL);
666 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, 658 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL,
667 &do_stop_task, 659 &do_stop_task, NULL);
668 NULL);
669} 660}
670 661
671 662
@@ -680,6 +671,7 @@ int
680main (int argc, char *const *argv) 671main (int argc, char *const *argv)
681{ 672{
682 int flags; 673 int flags;
674
683 static const struct GNUNET_GETOPT_CommandLineOption options[] = { 675 static const struct GNUNET_GETOPT_CommandLineOption options[] = {
684 {'n', "nick", "NAME", 676 {'n', "nick", "NAME",
685 gettext_noop ("set the nickname to use (required)"), 677 gettext_noop ("set the nickname to use (required)"),