aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Schanzenbach <schanzen@gnunet.org>2023-10-26 15:55:34 +0200
committerMartin Schanzenbach <schanzen@gnunet.org>2023-10-26 15:55:34 +0200
commitf5a3caba524371b1b1b257cb3ff0fd9f833b39c3 (patch)
treefdf59d3dd82e8f8cfbb2d4daa838f608ce1bc8ff
parent5ace916d7aecdb43a473c4fb3212d40b0dadc5e1 (diff)
downloadgnunet-f5a3caba524371b1b1b257cb3ff0fd9f833b39c3.tar.gz
gnunet-f5a3caba524371b1b1b257cb3ff0fd9f833b39c3.zip
libgnunet: Add a new daemon main macro for daemons/servers in libgnunet.
-rw-r--r--src/include/gnunet_program_lib.h39
-rw-r--r--src/lib/util/program.c34
-rw-r--r--src/service/rest/gnunet-rest-server.c48
3 files changed, 81 insertions, 40 deletions
diff --git a/src/include/gnunet_program_lib.h b/src/include/gnunet_program_lib.h
index 0c51d6cf7..6290ec3d4 100644
--- a/src/include/gnunet_program_lib.h
+++ b/src/include/gnunet_program_lib.h
@@ -122,6 +122,45 @@ GNUNET_PROGRAM_run (int argc,
122 GNUNET_PROGRAM_Main task, 122 GNUNET_PROGRAM_Main task,
123 void *task_cls); 123 void *task_cls);
124 124
125enum GNUNET_GenericReturnValue
126GNUNET_DAEMON_register (const char *daemon_name,
127 const char *daemon_desc,
128 GNUNET_PROGRAM_Main task);
129
130#ifndef HAVE_GNUNET_MONOLITH
131#define GNUNET_DAEMON_MAIN(daemon_name, daemon_help, init_cb) \
132 int \
133 main (int argc, \
134 char *const *argv) \
135 { \
136 int ret; \
137 struct GNUNET_GETOPT_CommandLineOption options[] = { \
138 GNUNET_GETOPT_OPTION_END \
139 };\
140 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv)) \
141 return 2; \
142 ret = GNUNET_PROGRAM_run (argc, \
143 argv, \
144 daemon_name, \
145 daemon_help, \
146 options, \
147 init_cb, \
148 NULL); \
149 GNUNET_free_nz ((void*) argv); \
150 return ret; \
151 }
152#else
153#define GNUNET_DAEMON_MAIN(daemon_name, daemon_help, init_cb) \
154 static int __attribute__ ((constructor)) \
155 init (void) \
156 { \
157 return GNUNET_DAEMON_register (daemon_name, \
158 daemon_help, \
159 init_cb); \
160 }
161#endif
162
163
125 164
126#if 0 /* keep Emacsens' auto-indent happy */ 165#if 0 /* keep Emacsens' auto-indent happy */
127{ 166{
diff --git a/src/lib/util/program.c b/src/lib/util/program.c
index 21b616ee2..d492c9a07 100644
--- a/src/lib/util/program.c
+++ b/src/lib/util/program.c
@@ -415,5 +415,39 @@ GNUNET_PROGRAM_run (int argc,
415 GNUNET_NO); 415 GNUNET_NO);
416} 416}
417 417
418/* A list of daemons to be launched when GNUNET_main()
419 * is called
420 */
421struct DaemonHandleList
422{
423 /* DLL */
424 struct DaemonHandleList *prev;
425
426 /* DLL */
427 struct DaemonHandleList *next;
428
429 /* Program to launch */
430 GNUNET_PROGRAM_Main d;
431};
432
433/* The daemon list */
434static struct DaemonHandleList *hll_head = NULL;
435
436/* The daemon list */
437static struct DaemonHandleList *hll_tail = NULL;
438
439enum GNUNET_GenericReturnValue
440GNUNET_DAEMON_register (const char *daemon_name,
441 const char *daemon_help,
442 GNUNET_PROGRAM_Main task)
443{
444 struct DaemonHandleList *hle;
445
446 hle = GNUNET_new (struct DaemonHandleList);
447 hle->d = task;
448 GNUNET_CONTAINER_DLL_insert (hll_head, hll_tail, hle);
449 return GNUNET_OK;
450}
451
418 452
419/* end of program.c */ 453/* end of program.c */
diff --git a/src/service/rest/gnunet-rest-server.c b/src/service/rest/gnunet-rest-server.c
index 7cc4025b0..c4b59de96 100644
--- a/src/service/rest/gnunet-rest-server.c
+++ b/src/service/rest/gnunet-rest-server.c
@@ -1028,6 +1028,7 @@ do_shutdown (void *cls)
1028 kill_httpd (); 1028 kill_httpd ();
1029 GNUNET_free (allow_credentials); 1029 GNUNET_free (allow_credentials);
1030 GNUNET_free (allow_headers); 1030 GNUNET_free (allow_headers);
1031 MHD_destroy_response (failure_response);
1031} 1032}
1032 1033
1033 1034
@@ -1145,10 +1146,10 @@ setup_plugin (const char *name,
1145 */ 1146 */
1146static void 1147static void
1147run (void *cls, 1148run (void *cls,
1148 char *const *args, 1149 const struct GNUNET_CONFIGURATION_Handle *c,
1149 const char *cfgfile, 1150 struct GNUNET_SERVICE_Handle *service)
1150 const struct GNUNET_CONFIGURATION_Handle *c)
1151{ 1151{
1152 static const char *err_page = "{}";
1152 char *addr_str; 1153 char *addr_str;
1153 char *basic_auth_file; 1154 char *basic_auth_file;
1154 uint64_t secret; 1155 uint64_t secret;
@@ -1156,6 +1157,9 @@ run (void *cls,
1156 cfg = c; 1157 cfg = c;
1157 plugins_head = NULL; 1158 plugins_head = NULL;
1158 plugins_tail = NULL; 1159 plugins_tail = NULL;
1160 failure_response = MHD_create_response_from_buffer (strlen (err_page),
1161 (void *) err_page,
1162 MHD_RESPMEM_PERSISTENT);
1159 /* Get port to bind to */ 1163 /* Get port to bind to */
1160 if (GNUNET_OK != 1164 if (GNUNET_OK !=
1161 GNUNET_CONFIGURATION_get_value_number (cfg, "rest", "HTTP_PORT", &port)) 1165 GNUNET_CONFIGURATION_get_value_number (cfg, "rest", "HTTP_PORT", &port))
@@ -1419,42 +1423,6 @@ run (void *cls,
1419} 1423}
1420 1424
1421 1425
1422/** 1426GNUNET_DAEMON_MAIN("rest", _("GNUnet REST service"), &run)
1423 *
1424 * The main function for gnunet-rest-service
1425 *
1426 * @param argc number of arguments from the cli
1427 * @param argv command line arguments
1428 * @return 0 ok, 1 on error
1429 *
1430 */
1431int
1432main (int argc, char *const *argv)
1433{
1434 struct GNUNET_GETOPT_CommandLineOption options[] =
1435 { GNUNET_GETOPT_OPTION_END };
1436 static const char *err_page = "{}";
1437 int ret;
1438
1439 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
1440 return 2;
1441 GNUNET_log_setup ("gnunet-rest-server", "WARNING", NULL);
1442 failure_response = MHD_create_response_from_buffer (strlen (err_page),
1443 (void *) err_page,
1444 MHD_RESPMEM_PERSISTENT);
1445 ret = (GNUNET_OK == GNUNET_PROGRAM_run (argc,
1446 argv,
1447 "gnunet-rest-server",
1448 _ ("GNUnet REST server"),
1449 options,
1450 &run,
1451 NULL))
1452 ? 0
1453 : 1;
1454 MHD_destroy_response (failure_response);
1455 GNUNET_free_nz ((char *) argv);
1456 return ret;
1457}
1458
1459 1427
1460/* end of gnunet-rest-server.c */ 1428/* end of gnunet-rest-server.c */