- fix coverity
[oweals/gnunet.git] / src / cadet / gnunet-service-cadet.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2001-2013 GNUnet e.V.
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      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      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18      Boston, MA 02110-1301, USA.
19 */
20
21 /**
22  * @file cadet/gnunet-service-cadet.c
23  * @brief GNUnet CADET service with encryption
24  * @author Bartlomiej Polot
25  *
26  *  FIXME in progress:
27  * - rekey - reliability interaction
28  * - channel retransmit timing
29  *
30  * TODO:
31  * - relay corking down to core
32  * - set ttl relative to path length
33  * TODO END
34  *
35  * Dictionary:
36  * - peer: other cadet instance. If there is direct connection it's a neighbor.
37  * - tunnel: encrypted connection to a peer, neighbor or not.
38  * - channel: connection between two clients, on the same or different peers.
39  *            have properties like reliability.
40  * - path: series of directly connected peer from one peer to another.
41  * - connection: path which is being used in a tunnel.
42  */
43
44 #include "platform.h"
45 #include "gnunet_util_lib.h"
46 #include "cadet.h"
47 #include "gnunet_statistics_service.h"
48
49 #include "gnunet-service-cadet_local.h"
50 #include "gnunet-service-cadet_channel.h"
51 #include "gnunet-service-cadet_connection.h"
52 #include "gnunet-service-cadet_tunnel.h"
53 #include "gnunet-service-cadet_dht.h"
54 #include "gnunet-service-cadet_peer.h"
55 #include "gnunet-service-cadet_hello.h"
56
57
58 /******************************************************************************/
59 /***********************      GLOBAL VARIABLES     ****************************/
60 /******************************************************************************/
61
62 /****************************** Global variables ******************************/
63
64 /**
65  * Handle to the statistics service.
66  */
67 struct GNUNET_STATISTICS_Handle *stats;
68
69 /**
70  * Local peer own ID (memory efficient handle).
71  */
72 GNUNET_PEER_Id myid;
73
74 /**
75  * Local peer own ID (full value).
76  */
77 struct GNUNET_PeerIdentity my_full_id;
78
79
80 /**
81  * Signal that shutdown is happening: prevent recover measures.
82  */
83 int shutting_down;
84
85 /*************************** Static global variables **************************/
86
87 /**
88  * Own private key.
89  */
90 static struct GNUNET_CRYPTO_EddsaPrivateKey *my_private_key;
91
92
93 /******************************************************************************/
94 /************************      MAIN FUNCTIONS      ****************************/
95 /******************************************************************************/
96
97 /**
98  * Task run during shutdown.
99  *
100  * @param cls unused
101  */
102 static void
103 shutdown_task (void *cls)
104 {
105   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "shutting down\n");
106
107   shutting_down = GNUNET_YES;
108
109   GML_shutdown ();
110   GCH_shutdown ();
111   GCC_shutdown ();
112   GCT_shutdown ();
113   GCD_shutdown ();
114   GCP_shutdown ();
115
116   GNUNET_STATISTICS_destroy (stats, GNUNET_NO);
117   stats = NULL;
118   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "shut down\n");
119 }
120
121
122 /**
123  * Process cadet requests.
124  *
125  * @param cls closure
126  * @param server the initialized server
127  * @param c configuration to use
128  */
129 static void
130 run (void *cls, struct GNUNET_SERVER_Handle *server,
131      const struct GNUNET_CONFIGURATION_Handle *c)
132 {
133   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "starting to run\n");
134
135   stats = GNUNET_STATISTICS_create ("cadet", c);
136
137   /* Scheduled the task to clean up when shutdown is called */
138   GNUNET_SCHEDULER_add_shutdown (&shutdown_task,
139                                  NULL);
140   GNUNET_log (GNUNET_ERROR_TYPE_INFO, "reading key\n");
141   my_private_key = GNUNET_CRYPTO_eddsa_key_create_from_configuration (c);
142   GNUNET_assert (NULL != my_private_key);
143   GNUNET_CRYPTO_eddsa_key_get_public (my_private_key, &my_full_id.public_key);
144   myid = GNUNET_PEER_intern (&my_full_id);
145   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
146               "STARTING SERVICE (cadet) for peer [%s]\n",
147               GNUNET_i2s (&my_full_id));
148
149   GML_init (server);    /* Local clients */
150   GCH_init (c);         /* Hellos */
151   GCC_init (c);         /* Connections */
152   GCP_init (c);         /* Peers */
153   GCD_init (c);         /* DHT */
154   GCT_init (c, my_private_key); /* Tunnels */
155
156   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Cadet service running\n");
157 }
158
159
160 /**
161  * The main function for the cadet service.
162  *
163  * @param argc number of arguments from the command line
164  * @param argv command line arguments
165  * @return 0 ok, 1 on error
166  */
167 int
168 main (int argc, char *const *argv)
169 {
170   int r;
171
172   shutting_down = GNUNET_NO;
173   r = GNUNET_SERVICE_run (argc, argv, "cadet", GNUNET_SERVICE_OPTION_NONE, &run,
174                           NULL);
175   GNUNET_free (my_private_key);
176
177   if (GNUNET_OK != r)
178   {
179     FPRINTF (stderr, "GNUNET_SERVICE_run for CADET has failed!\n");
180     return 1;
181   }
182
183   return 0;
184 }