-getting rid of silly, stupid, useless, often wrong DEFAULTCONFIG setting
[oweals/gnunet.git] / src / core / gnunet-service-core.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 core/gnunet-service-core.c
23  * @brief high-level P2P messaging
24  * @author Christian Grothoff
25  */
26 #include "platform.h"
27 #include "gnunet_util_lib.h"
28 #include "gnunet-service-core.h"
29 #include "gnunet-service-core_clients.h"
30 #include "gnunet-service-core_kx.h"
31 #include "gnunet-service-core_neighbours.h"
32 #include "gnunet-service-core_sessions.h"
33 #include "gnunet-service-core_typemap.h"
34
35
36 /**
37  * Our identity.
38  */
39 struct GNUNET_PeerIdentity GSC_my_identity;
40
41 /**
42  * Our configuration.
43  */
44 const struct GNUNET_CONFIGURATION_Handle *GSC_cfg;
45
46 /**
47  * For creating statistics.
48  */
49 struct GNUNET_STATISTICS_Handle *GSC_stats;
50
51 /**
52  * Handle to the server of the core service.
53  */
54 static struct GNUNET_SERVER_Handle *GSC_server;
55
56 /**
57  * Hostkey generation context
58  */
59 struct GNUNET_CRYPTO_RsaKeyGenerationContext *GST_keygen;
60
61
62 /**
63  * Last task run during shutdown.  Disconnects us from
64  * the transport.
65  * 
66  * @param cls NULL, unused
67  * @param tc scheduler context, unused
68  */
69 static void
70 shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
71 {
72   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Core service shutting down.\n");
73   if (NULL != GST_keygen)
74   {
75     GNUNET_CRYPTO_rsa_key_create_stop (GST_keygen);
76     GST_keygen = NULL;
77   }
78   GSC_CLIENTS_done ();
79   GSC_NEIGHBOURS_done ();
80   GSC_SESSIONS_done ();
81   GSC_KX_done ();
82   GSC_TYPEMAP_done ();
83   if (NULL != GSC_stats)
84   {
85     GNUNET_STATISTICS_destroy (GSC_stats, GNUNET_NO);
86     GSC_stats = NULL;
87   }
88   GSC_cfg = NULL;
89 }
90
91
92
93 /**
94  * Callback for hostkey read/generation
95  *
96  * @param cls NULL
97  * @param pk the private key
98  * @param emsg error message
99  */
100 static void
101 key_generation_cb (void *cls,
102                    struct GNUNET_CRYPTO_RsaPrivateKey *pk,
103                    const char *emsg)
104 {
105   GST_keygen = NULL;
106   if (NULL == pk)
107   {
108     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
109                 _("Failed to read hostkey: %s\n"),
110                 emsg);
111     GNUNET_SCHEDULER_shutdown ();
112     return;
113   }
114   if ((GNUNET_OK != GSC_KX_init (pk)) || 
115       (GNUNET_OK != GSC_NEIGHBOURS_init ()))
116   {
117     GNUNET_SCHEDULER_shutdown ();
118     return;
119   }
120   GSC_SESSIONS_init ();
121   GSC_CLIENTS_init (GSC_server);
122   GNUNET_SERVER_resume (GSC_server);
123   GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Core service of `%4s' ready.\n"),
124               GNUNET_i2s (&GSC_my_identity));
125 }
126
127
128 /**
129  * Initiate core service.
130  *
131  * @param cls closure
132  * @param server the initialized server
133  * @param c configuration to use
134  */
135 static void
136 run (void *cls, struct GNUNET_SERVER_Handle *server,
137      const struct GNUNET_CONFIGURATION_Handle *c)
138 {
139   char *keyfile;
140
141   GSC_cfg = c;
142   GSC_server = server;
143   if (GNUNET_OK !=
144       GNUNET_CONFIGURATION_get_value_filename (GSC_cfg, "GNUNETD", "HOSTKEY",
145                                                &keyfile))
146   {
147     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
148                 _
149                 ("Core service is lacking HOSTKEY configuration setting.  Exiting.\n"));
150     GNUNET_SCHEDULER_shutdown ();
151     return;
152   }
153   GSC_stats = GNUNET_STATISTICS_create ("core", GSC_cfg);
154   GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task,
155                                 NULL);
156   GNUNET_SERVER_suspend (server);
157   GSC_TYPEMAP_init ();
158   GST_keygen = GNUNET_CRYPTO_rsa_key_create_start (keyfile, &key_generation_cb, NULL);
159   GNUNET_free (keyfile);
160   if (NULL == GST_keygen)
161   {
162     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
163                 _("Transport service is unable to access hostkey. Exiting.\n"));
164     GNUNET_SCHEDULER_shutdown ();
165   }
166 }
167
168
169 /**
170  * The main function for the transport service.
171  *
172  * @param argc number of arguments from the command line
173  * @param argv command line arguments
174  * @return 0 ok, 1 on error
175  */
176 int
177 main (int argc, char *const *argv)
178 {
179   return (GNUNET_OK ==
180           GNUNET_SERVICE_run (argc, argv, "core", GNUNET_SERVICE_OPTION_NONE,
181                               &run, NULL)) ? 0 : 1;
182 }
183
184 /* end of gnunet-service-core.c */