diff options
author | Martin Schanzenbach <schanzen@gnunet.org> | 2023-10-26 15:55:34 +0200 |
---|---|---|
committer | Martin Schanzenbach <schanzen@gnunet.org> | 2023-10-26 15:55:34 +0200 |
commit | f5a3caba524371b1b1b257cb3ff0fd9f833b39c3 (patch) | |
tree | fdf59d3dd82e8f8cfbb2d4daa838f608ce1bc8ff | |
parent | 5ace916d7aecdb43a473c4fb3212d40b0dadc5e1 (diff) | |
download | gnunet-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.h | 39 | ||||
-rw-r--r-- | src/lib/util/program.c | 34 | ||||
-rw-r--r-- | src/service/rest/gnunet-rest-server.c | 48 |
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 | ||
125 | enum GNUNET_GenericReturnValue | ||
126 | GNUNET_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 | */ | ||
421 | struct 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 */ | ||
434 | static struct DaemonHandleList *hll_head = NULL; | ||
435 | |||
436 | /* The daemon list */ | ||
437 | static struct DaemonHandleList *hll_tail = NULL; | ||
438 | |||
439 | enum GNUNET_GenericReturnValue | ||
440 | GNUNET_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 | */ |
1146 | static void | 1147 | static void |
1147 | run (void *cls, | 1148 | run (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 | /** | 1426 | GNUNET_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 | */ | ||
1431 | int | ||
1432 | main (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 */ |