REST: nothing triggers rest
[oweals/gnunet.git] / src / dht / gnunet-service-dht.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2009, 2010, 2011, 2016 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 */
20
21 /**
22  * @file dht/gnunet-service-dht.c
23  * @brief GNUnet DHT service
24  * @author Christian Grothoff
25  * @author Nathan Evans
26  */
27 #include "platform.h"
28 #include "gnunet_block_lib.h"
29 #include "gnunet_util_lib.h"
30 #include "gnunet_transport_service.h"
31 #include "gnunet_transport_hello_service.h"
32 #include "gnunet_hello_lib.h"
33 #include "gnunet_dht_service.h"
34 #include "gnunet_statistics_service.h"
35 #include "gnunet-service-dht.h"
36 #include "gnunet-service-dht_datacache.h"
37 #include "gnunet-service-dht_hello.h"
38 #include "gnunet-service-dht_neighbours.h"
39 #include "gnunet-service-dht_nse.h"
40 #include "gnunet-service-dht_routing.h"
41
42 /**
43  * Our HELLO
44  */
45 struct GNUNET_MessageHeader *GDS_my_hello;
46
47 /**
48  * Handle to get our current HELLO.
49  */
50 static struct GNUNET_TRANSPORT_HelloGetHandle *ghh;
51
52 /**
53  * Hello address expiration
54  */
55 struct GNUNET_TIME_Relative hello_expiration;
56
57
58 #include "gnunet-service-dht_clients.c"
59
60
61 /**
62  * Receive the HELLO from transport service, free current and replace
63  * if necessary.
64  *
65  * @param cls NULL
66  * @param message HELLO message of peer
67  */
68 static void
69 process_hello (void *cls,
70                const struct GNUNET_MessageHeader *message)
71 {
72   GNUNET_free_non_null (GDS_my_hello);
73   GDS_my_hello = GNUNET_malloc (ntohs (message->size));
74   GNUNET_memcpy (GDS_my_hello,
75                  message,
76                  ntohs (message->size));
77 }
78
79
80 /**
81  * Task run during shutdown.
82  *
83  * @param cls unused
84  */
85 static void
86 shutdown_task (void *cls)
87 {
88   if (NULL != ghh)
89   {
90     GNUNET_TRANSPORT_hello_get_cancel (ghh);
91     ghh = NULL;
92   }
93   GDS_NEIGHBOURS_done ();
94   GDS_DATACACHE_done ();
95   GDS_ROUTING_done ();
96   GDS_HELLO_done ();
97   GDS_NSE_done ();
98   if (NULL != GDS_block_context)
99   {
100     GNUNET_BLOCK_context_destroy (GDS_block_context);
101     GDS_block_context = NULL;
102   }
103   if (NULL != GDS_stats)
104   {
105     GNUNET_STATISTICS_destroy (GDS_stats,
106                                GNUNET_YES);
107     GDS_stats = NULL;
108   }
109   GNUNET_free_non_null (GDS_my_hello);
110   GDS_my_hello = NULL;
111   GDS_CLIENTS_stop ();
112 }
113
114
115 /**
116  * Process dht requests.
117  *
118  * @param cls closure
119  * @param c configuration to use
120  * @param service the initialized service
121  */
122 static void
123 run (void *cls,
124      const struct GNUNET_CONFIGURATION_Handle *c,
125      struct GNUNET_SERVICE_Handle *service)
126 {
127   GDS_cfg = c;
128   GDS_service = service;
129   if (GNUNET_OK !=
130       GNUNET_CONFIGURATION_get_value_time (c,
131                                            "transport",
132                                            "HELLO_EXPIRATION",
133                                            &hello_expiration))
134   {
135     hello_expiration = GNUNET_CONSTANTS_HELLO_ADDRESS_EXPIRATION;
136   }
137   GDS_block_context = GNUNET_BLOCK_context_create (GDS_cfg);
138   GDS_stats = GNUNET_STATISTICS_create ("dht",
139                                         GDS_cfg);
140   GNUNET_SERVICE_suspend (GDS_service);
141   GDS_CLIENTS_init ();
142   GDS_ROUTING_init ();
143   GDS_NSE_init ();
144   GDS_DATACACHE_init ();
145   GDS_HELLO_init ();
146   if (GNUNET_OK != GDS_NEIGHBOURS_init ())
147   {
148     shutdown_task (NULL);
149     return;
150   }
151   GNUNET_SCHEDULER_add_shutdown (&shutdown_task,
152                                  NULL);
153   ghh = GNUNET_TRANSPORT_hello_get (GDS_cfg,
154                                     GNUNET_TRANSPORT_AC_GLOBAL,
155                                     &process_hello,
156                                     NULL);
157 }
158
159
160 /* Finally, define the main method */
161 GDS_DHT_SERVICE_INIT("dht", &run);
162
163
164
165
166 /* end of gnunet-service-dht.c */