-fix time assertion introduce in last patch
[oweals/gnunet.git] / src / dht / gnunet-service-xdht.c
1 /*
2      This file is part of GNUnet.
3      (C) 2009, 2010, 2011 Christian Grothoff (and other contributing authors)
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., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21 /**
22  * @file dht/gnunet-service-xdht.c
23  * @brief GNUnet DHT service
24  * @author Christian Grothoff
25  * @author Nathan Evans
26  */
27
28 #include "platform.h"
29 #include "gnunet_block_lib.h"
30 #include "gnunet_util_lib.h"
31 #include "gnunet_transport_service.h"
32 #include "gnunet_hello_lib.h"
33 #include "gnunet_dht_service.h"
34 #include "gnunet_statistics_service.h"
35 #include "gnunet-service-xdht.h"
36 #include "gnunet-service-xdht_clients.h"
37 #include "gnunet-service-xdht_datacache.h"
38 #include "gnunet-service-xdht_hello.h"
39 #include "gnunet-service-xdht_neighbours.h"
40 #include "gnunet-service-xdht_nse.h"
41 #include "gnunet-service-xdht_routing.h"
42
43
44
45 /**
46  * Handle for the statistics service.
47  */
48 struct GNUNET_STATISTICS_Handle *GDS_stats;
49
50 /**
51  * Our handle to the BLOCK library.
52  */
53 struct GNUNET_BLOCK_Context *GDS_block_context;
54
55 /**
56  * The configuration the DHT service is running with
57  */
58 const struct GNUNET_CONFIGURATION_Handle *GDS_cfg;
59
60 /**
61  * Our HELLO
62  */
63 struct GNUNET_MessageHeader *GDS_my_hello;
64
65 /**
66  * Handle to the transport service, for getting our hello
67  */
68 struct GNUNET_TRANSPORT_Handle *GDS_transport_handle;
69
70 /**
71  * Handle to get our current HELLO.
72  */
73 static struct GNUNET_TRANSPORT_GetHelloHandle *ghh;
74
75 /**
76  * Hello address expiration
77  */
78 struct GNUNET_TIME_Relative hello_expiration;
79
80 #if ENABLE_MALICIOUS
81 /**
82  * Should this peer act malicious?
83  */
84 unsigned int malicious;
85 #endif
86
87
88 /**
89  * Receive the HELLO from transport service, free current and replace
90  * if necessary.
91  *
92  * @param cls NULL
93  * @param message HELLO message of peer
94  */
95 static void
96 process_hello (void *cls, const struct GNUNET_MessageHeader *message)
97 {
98   GNUNET_assert (message != NULL);
99   GNUNET_free_non_null (GDS_my_hello);
100   GDS_my_hello = GNUNET_malloc (ntohs (message->size));
101   memcpy (GDS_my_hello, message, ntohs (message->size));
102 }
103
104
105 /**
106  * Task run during shutdown.
107  *
108  * @param cls unused
109  * @param tc unused
110  */
111 static void
112 shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
113 {
114   if (NULL != ghh)
115   {
116     GNUNET_TRANSPORT_get_hello_cancel (ghh);
117     ghh = NULL;
118   }
119   if (GDS_transport_handle != NULL)
120   {
121     GNUNET_TRANSPORT_disconnect (GDS_transport_handle);
122     GDS_transport_handle = NULL;
123   }
124
125   GDS_NEIGHBOURS_done ();
126   GDS_DATACACHE_done ();
127   GDS_ROUTING_done ();
128   GDS_HELLO_done ();
129   GDS_NSE_done ();
130   if (GDS_block_context != NULL)
131   {
132     GNUNET_BLOCK_context_destroy (GDS_block_context);
133     GDS_block_context = NULL;
134   }
135   if (GDS_stats != NULL)
136   {
137     GNUNET_STATISTICS_destroy (GDS_stats, GNUNET_YES);
138     GDS_stats = NULL;
139   }
140   GNUNET_free_non_null (GDS_my_hello);
141   GDS_my_hello = NULL;
142 }
143
144
145 /**
146  * Process dht requests.
147  *
148  * @param cls closure
149  * @param server the initialized server
150  * @param c configuration to use
151  */
152 static void
153 run (void *cls, struct GNUNET_SERVER_Handle *server,
154      const struct GNUNET_CONFIGURATION_Handle *c)
155 {
156   GDS_cfg = c;
157   if (GNUNET_OK !=
158       GNUNET_CONFIGURATION_get_value_time (c, "transport", "HELLO_EXPIRATION", &hello_expiration))
159   {
160     hello_expiration = GNUNET_CONSTANTS_HELLO_ADDRESS_EXPIRATION;
161   }
162   GDS_block_context = GNUNET_BLOCK_context_create (GDS_cfg);
163   GDS_stats = GNUNET_STATISTICS_create ("dht", GDS_cfg);
164
165   GDS_ROUTING_init ();
166   GDS_NSE_init ();
167   GDS_DATACACHE_init ();
168   GDS_HELLO_init ();
169   GDS_CLIENTS_init (server);
170
171   if (GNUNET_OK != GDS_NEIGHBOURS_init ())
172   {
173     shutdown_task (NULL, NULL);
174     return;
175   }
176   GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
177                                 NULL);
178   GDS_transport_handle =
179       GNUNET_TRANSPORT_connect (GDS_cfg, NULL, NULL, NULL, NULL, NULL);
180   if (GDS_transport_handle == NULL)
181   {
182     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
183                 _("Failed to connect to transport service!\n"));
184     return;
185   }
186   ghh = GNUNET_TRANSPORT_get_hello (GDS_transport_handle, &process_hello, NULL);
187 }
188
189
190 /**
191  * The main function for the dht service.
192  *
193  * @param argc number of arguments from the command line
194  * @param argv command line arguments
195  * @return 0 ok, 1 on error
196  */
197 int
198 main (int argc, char *const *argv)
199 {
200   int ret;
201
202   ret =
203       (GNUNET_OK ==
204        GNUNET_SERVICE_run (argc, argv, "dht", GNUNET_SERVICE_OPTION_NONE, &run,
205                            NULL)) ? 0 : 1;
206   GDS_CLIENTS_done ();
207   return ret;
208 }
209
210 /* end of gnunet-service-dht.c */