uncrustify as demanded.
[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 */