use NULL value in load_path_suffix to NOT load any files
[oweals/gnunet.git] / src / arm / mockup-service.c
1 /*
2      This file is part of GNUnet.
3      Copyright (C) 2007, 2008, 2009, 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 #include <stdlib.h>
22 #include "platform.h"
23 #include "gnunet_util_lib.h"
24 #include "gnunet_protocols.h"
25
26
27 static int special_ret = 0;
28
29 /**
30  * Handler for STOP message.
31  *
32  * @param cls client identification of the client
33  * @param message the actual message
34  */
35 static void
36 handle_stop (void *cls, const struct GNUNET_MessageHeader *message)
37 {
38   struct GNUNET_SERVICE_Client *client = cls;
39
40   (void) message;
41   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
42               _ ("Initiating shutdown as requested by client.\n"));
43   GNUNET_SERVICE_client_persist (client);
44   GNUNET_SCHEDULER_shutdown ();
45   /* ARM won't exponentially increase restart delay if we
46    * terminate normally. This changes the return code.
47    */
48   special_ret = 1;
49 }
50
51
52 /**
53  * Callback called when a client connects to the service.
54  *
55  * @param cls closure for the service
56  * @param c the new client that connected to the service
57  * @param mq the message queue used to send messages to the client
58  * @return @a c
59  */
60 static void *
61 client_connect_cb (void *cls,
62                    struct GNUNET_SERVICE_Client *c,
63                    struct GNUNET_MQ_Handle *mq)
64 {
65   (void) cls;
66   (void) mq;
67   return c;
68 }
69
70
71 /**
72  * Callback called when a client disconnected from the service
73  *
74  * @param cls closure for the service
75  * @param c the client that disconnected
76  * @param internal_cls should be equal to @a c
77  */
78 static void
79 client_disconnect_cb (void *cls,
80                       struct GNUNET_SERVICE_Client *c,
81                       void *internal_cls)
82 {
83   (void) cls;
84   GNUNET_assert (c == internal_cls);
85 }
86
87
88 static void
89 run (void *cls,
90      const struct GNUNET_CONFIGURATION_Handle *cfg,
91      struct GNUNET_SERVICE_Handle *service)
92 {
93   (void) cls;
94   (void) cfg;
95   (void) service;
96   /* nothing to do */
97 }
98
99
100 /**
101  * Define "main" method using service macro.
102  */
103 GNUNET_SERVICE_MAIN ("do-nothing",
104                      GNUNET_SERVICE_OPTION_NONE,
105                      &run,
106                      &client_connect_cb,
107                      &client_disconnect_cb,
108                      NULL,
109                      GNUNET_MQ_hd_fixed_size (stop,
110                                               GNUNET_MESSAGE_TYPE_ARM_STOP,
111                                               struct GNUNET_MessageHeader,
112                                               NULL),
113                      GNUNET_MQ_handler_end ());
114
115
116 /**
117  * MINIMIZE heap size (way below 128k) since this process doesn't need much.
118  */
119 void __attribute__ ((destructor))
120 GNUNET_mockup_done ()
121 {
122   _exit (special_ret);
123 }