GNUnet 0.22.2
gnunet-conversation.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2013 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
26#include "platform.h"
27#include "gnunet_util_lib.h"
30
34#define MAX_MESSAGE_LENGTH 1024
35
36#define XSTRINGIFY(x) STRINGIFY (x)
37
38#define STRINGIFY(x) (#x)
39
44{
49
54
59
64};
65
66
71{
76
81
86
91};
92
93
98{
102 struct CallList *prev;
103
107 struct CallList *next;
108
113
118
122 unsigned int caller_num;
123};
124
125
130
135
140static struct CallList *cl_active;
141
145static struct CallList *cl_head;
146
150static struct CallList *cl_tail;
151
155static char *line;
156
161
166
171
176
181
186
190static char *ego_name;
191
196
200static char *peer_name;
201
206
211
216
220static unsigned int caller_num_gen;
221
225static char *address;
226
230static int verbose;
231
232
241static void
244 struct GNUNET_CONVERSATION_Caller *caller,
245 const struct GNUNET_CRYPTO_PublicKey *caller_id)
246{
247 struct CallList *cl;
248
249 (void) cls;
250 switch (code)
251 {
253 /*
254 * FIXME: we should be playing our ringtones from contrib/sounds now!
255 *
256 ring_my_bell();
257 *
258 * see https://gstreamer.freedesktop.org/documentation/application-development/highlevel/playback-components.html on how to play a wav using the gst framework being used here
259 */fprintf (
260 stdout,
261 _ (
262 "Incoming call from `%s'. Please /accept %u or /cancel %u the call.\n"),
266 cl = GNUNET_new (struct CallList);
267 cl->caller = caller;
268 cl->caller_id = *caller_id;
271 break;
272
274 for (cl = cl_head; NULL != cl; cl = cl->next)
275 if (caller == cl->caller)
276 break;
277 if ((NULL == cl) && (caller == cl_active->caller))
278 cl = cl_active;
279 if (NULL == cl)
280 {
281 GNUNET_break (0);
282 return;
283 }
284 fprintf (stdout,
285 _ ("Call from `%s' terminated\n"),
287 if (cl == cl_active)
288 {
289 cl_active = NULL;
291 }
292 else
293 {
295 }
296 GNUNET_free (cl);
297 break;
298 }
299}
300
301
308static void
310{
311 struct CallList *cl = cls;
312
313 switch (code)
314 {
316 fprintf (stdout,
317 _ ("Call from `%s' suspended by other user\n"),
319 break;
320
322 fprintf (stdout,
323 _ ("Call from `%s' resumed by other user\n"),
325 break;
326 }
327}
328
329
333static void
335{
337
338 if (NULL == my_caller_id)
339 {
340 fprintf (stderr,
341 _ ("Ego `%s' no longer available, phone is now down.\n"),
342 ego_name);
344 return;
345 }
346 GNUNET_assert (NULL == phone);
350 NULL);
351 /* FIXME: get record and print full GNS record info later here... */
352 if (NULL == phone)
353 {
354 fprintf (stderr, "%s", _ ("Failed to setup phone (internal error)\n"));
356 }
357 else
358 {
361 address =
363 fprintf (
364 stdout,
365 _ (
366 "Phone active at `%s'. Type `/help' for a list of available commands\n"),
367 address);
369 }
370}
371
372
379static void
381{
382 (void) cls;
383
384 switch (code)
385 {
388 fprintf (stdout,
389 _ ("Resolved address of `%s'. Now ringing other party.\n"),
390 peer_name);
392 break;
393
396 fprintf (stdout, _ ("Connection established to `%s'\n"), peer_name);
398 break;
399
402 fprintf (stdout, _ ("Failed to resolve `%s'\n"), peer_name);
404 peer_name = NULL;
405 call = NULL;
406 break;
407
409 fprintf (stdout, _ ("Call to `%s' terminated\n"), peer_name);
411 peer_name = NULL;
412 call = NULL;
413 break;
414
417 fprintf (stdout,
418 _ ("Connection to `%s' suspended (by other user)\n"),
419 peer_name);
420 break;
421
424 fprintf (stdout,
425 _ ("Connection to `%s' resumed (by other user)\n"),
426 peer_name);
427 break;
428
430 fprintf (stdout, _ ("Error with the call, restarting it\n"));
432 peer_name = NULL;
433 call = NULL;
434 break;
435 }
436}
437
438
444typedef void (*ActionFunction) (const char *arguments);
445
446
451{
455 const char *command;
456
461
465 const char *helptext;
466};
467
468
474static void
475do_help (const char *args);
476
477
483static void
484do_quit (const char *args)
485{
486 (void) args;
488}
489
490
496static void
497do_unknown (const char *msg)
498{
499 fprintf (stderr, _ ("Unknown command `%s'\n"), msg);
500}
501
502
508static void
509do_call (const char *arg)
510{
511 if (NULL == my_caller_id)
512 {
513 fprintf (stderr, _ ("Ego `%s' not available\n"), ego_name);
514 return;
515 }
516 if (NULL != call)
517 {
518 fprintf (stderr,
519 _ ("You are calling someone else already, hang up first!\n"));
520 return;
521 }
522 switch (phone_state)
523 {
524 case PS_LOOKUP_EGO:
525 fprintf (stderr, _ ("Ego `%s' not available\n"), ego_name);
526 return;
527
528 case PS_LISTEN:
529 /* ok to call! */
530 break;
531
532 case PS_ACCEPTED:
533 fprintf (
534 stderr,
535 _ (
536 "You are answering call from `%s', hang up or suspend that call first!\n"),
538 return;
539
540 case PS_ERROR:
541 /* ok to call */
542 break;
543 }
544 if (NULL == arg)
545 {
546 fprintf (stderr, _ ("Call recipient missing.\n"));
547 do_help ("/call");
548 return;
549 }
552 GNUNET_assert (NULL == call);
555 arg,
556 speaker,
557 mic,
559 NULL);
560}
561
562
568static void
569do_accept (const char *args)
570{
571 struct CallList *cl;
572 char buf[32];
573
574 if ((NULL != call) && (CS_SUSPENDED != call_state))
575 {
576 fprintf (stderr,
577 _ ("You are calling someone else already, hang up first!\n"));
578 return;
579 }
580 switch (phone_state)
581 {
582 case PS_LOOKUP_EGO:
583 GNUNET_break (0);
584 break;
585
586 case PS_LISTEN:
587 /* this is the expected state */
588 break;
589
590 case PS_ACCEPTED:
591 fprintf (
592 stderr,
593 _ (
594 "You are answering call from `%s', hang up or suspend that call first!\n"),
596 return;
597
598 case PS_ERROR:
599 GNUNET_break (0);
600 break;
601 }
602 cl = cl_head;
603 if (NULL == cl)
604 {
605 fprintf (stderr, _ ("There is no incoming call to accept here!\n"));
606 return;
607 }
608 if ((NULL != cl->next) || (NULL != args))
609 {
610 for (cl = cl_head; NULL != cl; cl = cl->next)
611 {
612 GNUNET_snprintf (buf, sizeof(buf), "%u", cl->caller_num);
613 if (0 == strcmp (buf, args))
614 break;
615 }
616 }
617 if (NULL == cl)
618 {
619 fprintf (stderr,
620 _ ("There is no incoming call `%s' to accept right now!\n"),
621 args);
622 return;
623 }
625 cl_active = cl;
626 peer_key = cl->caller_id;
630 cl,
631 speaker,
632 mic);
633}
634
635
641static void
642do_address (const char *args)
643{
644 (void) args;
645 if (NULL == address)
646 {
647 fprintf (stdout, "%s", _ ("We currently do not have an address.\n"));
648 return;
649 }
650 fprintf (stdout, "%s\n", address);
651}
652
653
659static void
660do_status (const char *args)
661{
662 struct CallList *cl;
663
664 (void) args;
665 switch (phone_state)
666 {
667 case PS_LOOKUP_EGO:
668 fprintf (
669 stdout,
670 _ (
671 "We are currently trying to locate the private key for the ego `%s'.\n"),
672 ego_name);
673 break;
674
675 case PS_LISTEN:
676 fprintf (stdout,
677 _ (
678 "We are listening for incoming calls for ego `%s' on line `%s'.\n"),
679 ego_name,
680 line);
681 break;
682
683 case PS_ACCEPTED:
684 fprintf (stdout,
685 _ ("You are having a conversation with `%s'.\n"),
687 ;
688 break;
689
690 case PS_ERROR:
691 fprintf (
692 stdout,
693 _ (
694 "We had an internal error setting up our phone line. You can still make calls.\n"));
695 break;
696 }
697 if (NULL != call)
698 {
699 switch (call_state)
700 {
701 case CS_RESOLVING:
702 fprintf (stdout,
703 _ ("We are trying to find the network address to call `%s'.\n"),
704 peer_name);
705 break;
706
707 case CS_RINGING:
708 fprintf (stdout,
709 _ ("We are calling `%s', their phone should be ringing.\n"),
710 peer_name);
711 break;
712
713 case CS_CONNECTED:
714 fprintf (stdout,
715 _ ("You are having a conversation with `%s'.\n"),
716 peer_name);
717 break;
718
719 case CS_SUSPENDED:
720 /* ok to accept incoming call right now */
721 break;
722 }
723 }
724 if ((NULL != cl_head) && ((cl_head != cl_active) || (cl_head != cl_tail)))
725 {
726 fprintf (stdout, "%s", _ ("Calls waiting:\n"));
727 for (cl = cl_head; NULL != cl; cl = cl->next)
728 {
729 if (cl == cl_active)
730 continue;
731 fprintf (stdout,
732 _ ("#%u: `%s'\n"),
733 cl->caller_num,
735 }
736 fprintf (stdout, "%s", "\n");
737 }
738}
739
740
746static void
747do_suspend (const char *args)
748{
749 (void) args;
750 if (NULL != call)
751 {
752 switch (call_state)
753 {
754 case CS_RESOLVING:
755 case CS_RINGING:
756 case CS_SUSPENDED:
757 fprintf (stderr,
758 "%s",
759 _ ("There is no call that could be suspended right now.\n"));
760 return;
761
762 case CS_CONNECTED:
765 return;
766 }
767 }
768 switch (phone_state)
769 {
770 case PS_LOOKUP_EGO:
771 case PS_LISTEN:
772 case PS_ERROR:
773 fprintf (stderr,
774 "%s",
775 _ ("There is no call that could be suspended right now.\n"));
776 return;
777
778 case PS_ACCEPTED:
779 /* expected state, do rejection logic */
780 break;
781 }
782 GNUNET_assert (NULL != cl_active);
784 cl_active = NULL;
786}
787
788
794static void
795do_resume (const char *args)
796{
797 struct CallList *cl;
798 char buf[32];
799
800 if (NULL != call)
801 {
802 switch (call_state)
803 {
804 case CS_RESOLVING:
805 case CS_RINGING:
806 case CS_CONNECTED:
807 fprintf (stderr,
808 "%s",
809 _ ("There is no call that could be resumed right now.\n"));
810 return;
811
812 case CS_SUSPENDED:
815 return;
816 }
817 }
818 switch (phone_state)
819 {
820 case PS_LOOKUP_EGO:
821 case PS_ERROR:
822 fprintf (stderr,
823 "%s",
824 _ ("There is no call that could be resumed right now.\n"));
825 return;
826
827 case PS_LISTEN:
828 /* expected state, do resume logic */
829 break;
830
831 case PS_ACCEPTED:
832 fprintf (stderr,
833 _ ("Already talking with `%s', cannot resume a call right now.\n"),
835 return;
836 }
837 GNUNET_assert (NULL == cl_active);
838 cl = cl_head;
839 if (NULL == cl)
840 {
841 fprintf (stderr, _ ("There is no incoming call to resume here!\n"));
842 return;
843 }
844 if ((NULL != cl->next) || (NULL != args))
845 {
846 for (cl = cl_head; NULL != cl; cl = cl->next)
847 {
848 GNUNET_snprintf (buf, sizeof(buf), "%u", cl->caller_num);
849 if (0 == strcmp (buf, args))
850 break;
851 }
852 }
853 if (NULL == cl)
854 {
855 fprintf (stderr,
856 _ ("There is no incoming call `%s' to resume right now!\n"),
857 args);
858 return;
859 }
860 cl_active = cl;
863}
864
865
871static void
872do_reject (const char *args)
873{
874 struct CallList *cl;
875 char buf[32];
876
877 if (NULL != call)
878 {
880 call = NULL;
881 return;
882 }
883 switch (phone_state)
884 {
885 case PS_LOOKUP_EGO:
886 case PS_ERROR:
887 fprintf (stderr,
888 "%s",
889 _ ("There is no call that could be cancelled right now.\n"));
890 return;
891
892 case PS_LISTEN:
893 /* look for active incoming calls to refuse */
894 cl = cl_head;
895 if (NULL == cl)
896 {
897 fprintf (stderr, _ ("There is no incoming call to refuse here!\n"));
898 return;
899 }
900 if ((NULL != cl->next) || (NULL != args))
901 {
902 for (cl = cl_head; NULL != cl; cl = cl->next)
903 {
904 GNUNET_snprintf (buf, sizeof(buf), "%u", cl->caller_num);
905 if (0 == strcmp (buf, args))
906 break;
907 }
908 }
909 if (NULL == cl)
910 {
911 fprintf (stderr,
912 _ ("There is no incoming call `%s' to refuse right now!\n"),
913 args);
914 return;
915 }
918 GNUNET_free (cl);
919 break;
920
921 case PS_ACCEPTED:
922 /* expected state, do rejection logic */
923 GNUNET_assert (NULL != cl_active);
925 cl_active = NULL;
927 break;
928 }
929}
930
931
935static struct VoipCommand commands[] = {
936 { "/address",
937 &do_address,
939 "Use `/address' to find out which address this phone should have in GNS") },
940 { "/call", &do_call, gettext_noop ("Use `/call USER.gnu' to call USER") },
941 { "/accept",
942 &do_accept,
943 gettext_noop ("Use `/accept #NUM' to accept incoming call #NUM") },
944 { "/suspend",
945 &do_suspend,
946 gettext_noop ("Use `/suspend' to suspend the active call") },
947 { "/resume",
948 &do_resume,
950 "Use `/resume [#NUM]' to resume a call, #NUM is needed to resume incoming calls, no argument is needed to resume the current outgoing call.") },
951 { "/cancel",
952 &do_reject,
953 gettext_noop ("Use `/cancel' to reject or terminate a call") },
954 { "/status",
955 &do_status,
956 gettext_noop ("Use `/status' to print status information") },
957 { "/quit",
958 &do_quit,
959 gettext_noop ("Use `/quit' to terminate gnunet-conversation") },
960 { "/help",
961 &do_help,
962 gettext_noop ("Use `/help command' to get help for a specific command") },
963 { "", &do_unknown, NULL },
964 { NULL, NULL, NULL },
965};
966
967
973static void
974do_help (const char *args)
975{
976 unsigned int i;
977
978 i = 0;
979 while ((NULL != args) && (0 != strlen (args)) &&
980 (commands[i].Action != &do_help))
981 {
982 if (0 == strncasecmp (&args[1], &commands[i].command[1], strlen (args) - 1))
983 {
984 fprintf (stdout, "%s\n", gettext (commands[i].helptext));
985 return;
986 }
987 i++;
988 }
989 i = 0;
990 fprintf (stdout, "%s", "Available commands:\n");
991 while (commands[i].Action != &do_help)
992 {
993 fprintf (stdout, "%s\n", gettext (commands[i].command));
994 i++;
995 }
996 fprintf (stdout, "%s", "\n");
997 fprintf (stdout, "%s\n", gettext (commands[i].helptext));
998}
999
1000
1006static void
1007do_stop_task (void *cls)
1008{
1009 (void) cls;
1010 if (NULL != call)
1011 {
1013 call = NULL;
1014 }
1015 if (NULL != phone)
1016 {
1018 phone = NULL;
1019 }
1020 if (NULL != handle_cmd_task)
1021 {
1023 handle_cmd_task = NULL;
1024 }
1025 if (NULL != id)
1026 {
1028 id = NULL;
1029 }
1031 speaker = NULL;
1033 mic = NULL;
1035 ego_name = NULL;
1037 peer_name = NULL;
1039}
1040
1041
1048static void
1049handle_command_string (char *message, size_t str_len)
1050{
1051 size_t i;
1052 const char *ptr;
1053
1054 if (0 == str_len)
1055 return;
1056 if (message[str_len - 1] == '\n')
1057 message[str_len - 1] = '\0';
1058 if (message[str_len - 2] == '\r')
1059 message[str_len - 2] = '\0';
1060 if (0 == strlen (message))
1061 return;
1062 i = 0;
1063 while (
1064 (NULL != commands[i].command) &&
1065 (0 !=
1066 strncasecmp (commands[i].command, message, strlen (commands[i].command))))
1067 i++;
1068 ptr = &message[strlen (commands[i].command)];
1069 while (isspace ((unsigned char) *ptr))
1070 ptr++;
1071 if ('\0' == *ptr)
1072 ptr = NULL;
1073 commands[i].Action (ptr);
1074}
1075
1076
1082static void
1084{
1085 char message[MAX_MESSAGE_LENGTH + 1];
1086
1087 (void) cls;
1090 stdin_fh,
1092 NULL);
1093 /* read message from command line and handle it */
1094 memset (message, 0, MAX_MESSAGE_LENGTH + 1);
1095 if (NULL == fgets (message, MAX_MESSAGE_LENGTH, stdin))
1096 return;
1097 handle_command_string (message, strlen (message));
1098}
1099
1100
1109static void
1110identity_cb (void *cls,
1111 struct GNUNET_IDENTITY_Ego *ego,
1112 void **ctx,
1113 const char *name)
1114{
1115 (void) cls;
1116 (void) ctx;
1117 if (NULL == name)
1118 return;
1119 if (ego == my_caller_id)
1120 {
1121 if (verbose)
1122 fprintf (stdout, _ ("Name of our ego changed to `%s'\n"), name);
1125 return;
1126 }
1127 if (0 != strcmp (name, ego_name))
1128 return;
1129 if (NULL == ego)
1130 {
1131 if (verbose)
1132 fprintf (stdout, _ ("Our ego `%s' was deleted!\n"), ego_name);
1133 my_caller_id = NULL;
1134 return;
1135 }
1136 my_caller_id = ego;
1137 GNUNET_CONFIGURATION_set_value_string (cfg, "CONVERSATION", "LINE", line);
1138 start_phone ();
1139}
1140
1141
1150static void
1151run (void *cls,
1152 char *const *args,
1153 const char *cfgfile,
1154 const struct GNUNET_CONFIGURATION_Handle *c)
1155{
1156 (void) cls;
1157 (void) args;
1158 (void) cfgfile;
1162 if (NULL == ego_name)
1163 {
1164 fprintf (stderr, "%s", _ ("You must specify the NAME of an ego to use\n"));
1165 return;
1166 }
1171 NULL);
1173}
1174
1175
1183int
1184main (int argc, char *const *argv)
1185{
1188 'e',
1189 "ego",
1190 "NAME",
1191 gettext_noop ("sets the NAME of the ego to use for the caller ID"),
1192 &ego_name),
1194 "phone",
1195 "LINE",
1196 gettext_noop (
1197 "sets the LINE to use for the phone"),
1198 &line),
1200 int ret;
1201
1202 int flags;
1203 flags = fcntl (0, F_GETFL, 0);
1204 flags |= O_NONBLOCK;
1205 if (0 != fcntl (0, F_SETFL, flags))
1208
1209 ret =
1211 argc,
1212 argv,
1213 "gnunet-conversation",
1214 gettext_noop (
1215 "Enables having a conversation with other GNUnet users."),
1216 options,
1217 &run,
1218 NULL);
1219 if (NULL != cfg)
1220 {
1222 cfg = NULL;
1223 }
1224 return (GNUNET_OK == ret) ? 0 : 1;
1225}
1226
1227
1228/* end of gnunet-conversation.c */
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
PhoneState
Possible states of a phone.
CallState
Possible states of the phone.
#define gettext_noop(String)
Definition: gettext.h:74
#define gettext(Msgid)
Definition: gettext.h:50
static int ret
Final status code.
Definition: gnunet-arm.c:93
static void do_suspend(const char *args)
Suspending a call.
static void do_status(const char *args)
Accepting an incoming call.
static int verbose
Be verbose.
static struct GNUNET_CONVERSATION_Call * call
Call handle (for active outgoing call).
static void do_address(const char *args)
Print address information for this phone.
static struct GNUNET_IDENTITY_Ego * my_caller_id
Our ego.
static struct CallList * cl_active
Caller handle (for active incoming call).
static void do_quit(const char *args)
Terminate the client.
static struct GNUNET_CRYPTO_PublicKey peer_key
Public key of active conversation partner (if any).
static void do_call(const char *arg)
Initiating a new call.
static enum CallState call_state
Our call's current state.
void(* ActionFunction)(const char *arguments)
Function declareation for executing a action.
static struct GNUNET_MICROPHONE_Handle * mic
Our microphone.
static void do_help(const char *args)
Action function to print help for the command shell.
static void handle_command_string(char *message, size_t str_len)
Handle user command.
static unsigned int caller_num_gen
Counts the number of incoming calls we have had so far.
static enum PhoneState phone_state
Our phone's current state.
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
static char * ego_name
Name of our ego.
static char * address
GNS address for this phone.
static void start_phone()
Start our phone.
static void phone_event_handler(void *cls, enum GNUNET_CONVERSATION_PhoneEventCode code, struct GNUNET_CONVERSATION_Caller *caller, const struct GNUNET_CRYPTO_PublicKey *caller_id)
Function called with an event emitted by a phone.
static void handle_command(void *cls)
Task to handle commands from the terminal.
static char * line
Desired phone line (string to be converted to a hash).
static void run(void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *c)
Main function that will be run by the scheduler.
static void do_stop_task(void *cls)
Task run during shutdown.
static void call_event_handler(void *cls, enum GNUNET_CONVERSATION_CallEventCode code)
Function called with an event emitted by a call.
static struct GNUNET_SPEAKER_Handle * speaker
Our speaker.
static struct GNUNET_DISK_FileHandle * stdin_fh
File handle for stdin.
static void caller_event_handler(void *cls, enum GNUNET_CONVERSATION_CallerEventCode code)
Function called with an event emitted by a caller.
@ CS_SUSPENDED
The call is currently suspended (by us).
@ CS_CONNECTED
The other party accepted our call and we are now connected.
@ CS_RESOLVING
We are looking up some other participant.
@ CS_RINGING
We are now ringing the other participant.
#define MAX_MESSAGE_LENGTH
Maximum length allowed for the command line input.
static struct GNUNET_SCHEDULER_Task * handle_cmd_task
Task which handles the commands.
static struct GNUNET_IDENTITY_Handle * id
Handle to identity service.
static void do_accept(const char *args)
Accepting an incoming call.
static void do_reject(const char *args)
Rejecting a call.
static char * peer_name
Name of active conversation partner (if any).
static void identity_cb(void *cls, struct GNUNET_IDENTITY_Ego *ego, void **ctx, const char *name)
Function called by identity service with information about egos.
static struct CallList * cl_tail
Tail of calls waiting to be accepted.
int main(int argc, char *const *argv)
The main function to conversation.
static struct CallList * cl_head
Head of calls waiting to be accepted.
static struct GNUNET_CONVERSATION_Phone * phone
Phone handle.
static void do_unknown(const char *msg)
Handler for unknown command.
static void do_resume(const char *args)
Resuming a call.
static struct VoipCommand commands[]
List of supported commands.
@ PS_ERROR
Internal error.
@ PS_ACCEPTED
We accepted an incoming phone call.
@ PS_LOOKUP_EGO
We're waiting for our own idenitty.
@ PS_LISTEN
We're listening for calls.
static struct GNUNET_FS_Handle * ctx
static char * name
Name (label) of the records to list.
static struct GNUNET_GNSRECORD_Data rd[50]
The record data under a single label.
API to the conversation service.
API that can be used to manipulate GNS record data.
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_dup(const struct GNUNET_CONFIGURATION_Handle *cfg)
Duplicate an existing configuration object.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
void GNUNET_CONVERSATION_phone_get_record(struct GNUNET_CONVERSATION_Phone *phone, struct GNUNET_GNSRECORD_Data *rd)
Fill in a namestore record with the contact information for this phone.
struct GNUNET_CONVERSATION_Phone * GNUNET_CONVERSATION_phone_create(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_IDENTITY_Ego *ego, GNUNET_CONVERSATION_PhoneEventHandler event_handler, void *event_handler_cls)
Create a new phone.
void GNUNET_CONVERSATION_call_suspend(struct GNUNET_CONVERSATION_Call *call)
Pause a call.
void GNUNET_CONVERSATION_caller_suspend(struct GNUNET_CONVERSATION_Caller *caller)
Pause conversation of an active call.
void GNUNET_CONVERSATION_call_resume(struct GNUNET_CONVERSATION_Call *call, struct GNUNET_SPEAKER_Handle *speaker, struct GNUNET_MICROPHONE_Handle *mic)
Resumes a call after GNUNET_CONVERSATION_call_suspend.
struct GNUNET_CONVERSATION_Call * GNUNET_CONVERSATION_call_start(const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_IDENTITY_Ego *caller_id, const char *callee, struct GNUNET_SPEAKER_Handle *speaker, struct GNUNET_MICROPHONE_Handle *mic, GNUNET_CONVERSATION_CallEventHandler event_handler, void *event_handler_cls)
Call the phone of another user.
void GNUNET_CONVERSATION_call_stop(struct GNUNET_CONVERSATION_Call *call)
Terminate a call.
void GNUNET_CONVERSATION_phone_destroy(struct GNUNET_CONVERSATION_Phone *phone)
Destroys a phone.
GNUNET_CONVERSATION_CallerEventCode
Information about the current status of a call.
GNUNET_CONVERSATION_PhoneEventCode
Information about active callers to a phone.
void GNUNET_CONVERSATION_caller_resume(struct GNUNET_CONVERSATION_Caller *caller, struct GNUNET_SPEAKER_Handle *speaker, struct GNUNET_MICROPHONE_Handle *mic)
Resume suspended conversation of a phone.
void GNUNET_CONVERSATION_caller_hang_up(struct GNUNET_CONVERSATION_Caller *caller)
Hang up up a (possibly ringing) phone.
void GNUNET_CONVERSATION_caller_pick_up(struct GNUNET_CONVERSATION_Caller *caller, GNUNET_CONVERSATION_CallerEventHandler event_handler, void *event_handler_cls, struct GNUNET_SPEAKER_Handle *speaker, struct GNUNET_MICROPHONE_Handle *mic)
Picks up a (ringing) phone.
GNUNET_CONVERSATION_CallEventCode
Information about the current status of a call.
@ GNUNET_CONVERSATION_EC_CALLER_RESUME
We are the callee and the caller resumed the call.
@ GNUNET_CONVERSATION_EC_CALLER_SUSPEND
We are the callee and the caller suspended the call.
@ GNUNET_CONVERSATION_EC_PHONE_HUNG_UP
The conversation was terminated by the caller.
@ GNUNET_CONVERSATION_EC_PHONE_RING
We are the callee and the phone is ringing.
@ GNUNET_CONVERSATION_EC_CALL_SUSPENDED
We are the caller and the callee suspended the call.
@ GNUNET_CONVERSATION_EC_CALL_GNS_FAIL
We are the caller and failed to locate a phone record in GNS.
@ GNUNET_CONVERSATION_EC_CALL_PICKED_UP
We are the caller and are now ready to talk as the callee picked up.
@ GNUNET_CONVERSATION_EC_CALL_RESUMED
We are the caller and the callee suspended the call.
@ GNUNET_CONVERSATION_EC_CALL_RINGING
We are the caller and are now ringing the other party (GNS lookup succeeded).
@ GNUNET_CONVERSATION_EC_CALL_ERROR
We had an error handing the call, and are now restarting it (back to lookup).
@ GNUNET_CONVERSATION_EC_CALL_HUNG_UP
We are the caller and the callee called GNUNET_CONVERSATION_caller_hang_up.
struct GNUNET_DISK_FileHandle * GNUNET_DISK_get_handle_from_int_fd(int fno)
Get a handle from a native integer FD.
Definition: disk.c:1311
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_string(char shortName, const char *name, const char *argumentHelp, const char *description, char **str)
Allow user to specify a string.
const char * GNUNET_GNSRECORD_pkey_to_zkey(const struct GNUNET_CRYPTO_PublicKey *pkey)
Convert public key to the respective absolute domain name in the ".zkey" pTLD.
char * GNUNET_GNSRECORD_value_to_string(uint32_t type, const void *data, size_t data_size)
Convert the binary value data of a record of type type to a human-readable string.
Definition: gnsrecord.c:147
struct GNUNET_IDENTITY_Handle * GNUNET_IDENTITY_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_IDENTITY_Callback cb, void *cb_cls)
Connect to the identity service.
Definition: identity_api.c:487
void GNUNET_IDENTITY_disconnect(struct GNUNET_IDENTITY_Handle *h)
Disconnect from identity service.
Definition: identity_api.c:732
@ GNUNET_SCHEDULER_PRIORITY_UI
Run with priority for interactive tasks.
@ GNUNET_OK
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
#define GNUNET_log_strerror(level, cmd)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
@ GNUNET_ERROR_TYPE_WARNING
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
int GNUNET_snprintf(char *buf, size_t size, const char *format,...) __attribute__((format(printf
Like snprintf, just aborts if the buffer is of insufficient size.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_MICROPHONE_destroy(struct GNUNET_MICROPHONE_Handle *microphone)
Destroy a microphone.
Definition: microphone.c:195
struct GNUNET_MICROPHONE_Handle * GNUNET_MICROPHONE_create_from_hardware(const struct GNUNET_CONFIGURATION_Handle *cfg)
Create a microphone that corresponds to the microphone hardware of our system.
Definition: microphone.c:172
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run(const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
Run a standard GNUnet command startup sequence (initialize loggers and configuration,...
Definition: program.c:407
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:567
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_read_file(struct GNUNET_TIME_Relative delay, const struct GNUNET_DISK_FileHandle *rfd, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified delay or when the specified file descriptor is ready f...
Definition: scheduler.c:1661
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
Definition: scheduler.c:1339
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:980
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_with_priority(enum GNUNET_SCHEDULER_Priority prio, GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run with a specified priority.
Definition: scheduler.c:1231
struct GNUNET_SPEAKER_Handle * GNUNET_SPEAKER_create_from_hardware(const struct GNUNET_CONFIGURATION_Handle *cfg)
Create a speaker that corresponds to the speaker hardware of our system.
Definition: speaker.c:160
void GNUNET_SPEAKER_destroy(struct GNUNET_SPEAKER_Handle *speaker)
Destroy a speaker.
Definition: speaker.c:184
#define GNUNET_TIME_UNIT_FOREVER_REL
Constant used to specify "forever".
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
List of incoming calls.
unsigned int caller_num
Unique number of the call.
struct GNUNET_CRYPTO_PublicKey caller_id
Public key identifying the caller.
struct CallList * next
A DLL.
struct GNUNET_CONVERSATION_Caller * caller
Handle to hang up or activate.
struct CallList * prev
A DLL.
Handle for an outgoing call.
A caller is the handle we have for an incoming call.
A phone is a device that can ring to signal an incoming call and that you can pick up to answer the c...
An identity key as per LSD0001.
Handle used to access files (and pipes).
Definition of a command line option.
uint32_t record_type
Type of the GNS/DNS record.
const void * data
Binary value stored in the DNS record.
size_t data_size
Number of bytes in data.
Handle for an ego.
Definition: identity.h:37
Handle for the service.
Definition: identity_api.c:97
A microphone is a device that can capture or otherwise produce audio data.
Entry in list of pending tasks.
Definition: scheduler.c:136
A speaker is a device that can play or record audio data.
Structure which defines a command.
const char * helptext
Help text for the command.
const char * command
Command the user needs to enter.
ActionFunction Action
Function to call on command.