gnunet_program_lib.h (7412B)
1 /* 2 This file is part of GNUnet. 3 Copyright (C) 2001-2013 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 #if ! defined (__GNUNET_UTIL_LIB_H_INSIDE__) 22 #error "Only <gnunet_util_lib.h> can be included directly." 23 #endif 24 25 /** 26 * @addtogroup libgnunetutil 27 * Multi-function utilities library for GNUnet programs 28 * @{ 29 * 30 * @author Christian Grothoff 31 * 32 * @file 33 * Functions related to starting programs 34 * 35 * @defgroup program Program library 36 * Start command-line programs. 37 * @{ 38 */ 39 40 #ifndef GNUNET_PROGRAM_LIB_H 41 #define GNUNET_PROGRAM_LIB_H 42 43 #ifdef __cplusplus 44 extern "C" 45 { 46 #if 0 /* keep Emacsens' auto-indent happy */ 47 } 48 #endif 49 #endif 50 51 52 #include "gnunet_configuration_lib.h" 53 #include "gnunet_getopt_lib.h" 54 #include "gnunet_scheduler_lib.h" 55 56 /** 57 * Main function that will be run. 58 * 59 * @param cls closure 60 * @param args remaining command-line arguments 61 * @param cfgfile name of the configuration file used (for saving, can be NULL!) 62 * @param cfg configuration 63 */ 64 typedef void 65 (*GNUNET_PROGRAM_Main) (void *cls, 66 char *const *args, 67 const char *cfgfile, 68 const struct GNUNET_CONFIGURATION_Handle *cfg); 69 70 71 /** 72 * Run a standard GNUnet command startup sequence (initialize loggers 73 * and configuration, parse options). 74 * 75 * @param pd project data for the project the program belongs to 76 * @param argc number of command line arguments in @a argv 77 * @param argv command line arguments 78 * @param binaryName our expected name 79 * @param binaryHelp help text for the program 80 * @param options command line options 81 * @param task main function to run 82 * @param task_cls closure for @a task 83 * @param run_without_scheduler #GNUNET_NO start the scheduler, 84 * #GNUNET_YES do not start the scheduler just run the main task 85 * @return #GNUNET_SYSERR on error, 86 * #GNUNET_NO if successful option processing called 87 * for the program to terminate, 88 * #GNUNET_OK on success (#a task was invoked) 89 */ 90 enum GNUNET_GenericReturnValue 91 GNUNET_PROGRAM_run2 (const struct GNUNET_OS_ProjectData *pd, 92 int argc, 93 char *const *argv, 94 const char *binaryName, 95 const char *binaryHelp, 96 const struct GNUNET_GETOPT_CommandLineOption *options, 97 GNUNET_PROGRAM_Main task, 98 void *task_cls, 99 int run_without_scheduler); 100 101 102 /** 103 * Run a standard GNUnet command startup sequence (initialize loggers 104 * and configuration, parse options). 105 * 106 * @param pd project data for the project the program belongs to 107 * @param argc number of command line arguments 108 * @param argv command line arguments 109 * @param binaryName our expected name 110 * @param binaryHelp helptext for "-h" option (about the app) 111 * @param options command line options 112 * @param task main function to run 113 * @param task_cls closure for @a task 114 * @return #GNUNET_SYSERR on error, 115 * #GNUNET_NO if successful option processing called 116 * for the program to terminate, 117 * #GNUNET_OK on success (#a task was invoked) 118 */ 119 enum GNUNET_GenericReturnValue 120 GNUNET_PROGRAM_run (const struct GNUNET_OS_ProjectData *pd, 121 int argc, 122 char *const *argv, 123 const char *binaryName, 124 const char *binaryHelp, 125 const struct GNUNET_GETOPT_CommandLineOption *options, 126 GNUNET_PROGRAM_Main task, 127 void *task_cls); 128 129 130 enum GNUNET_GenericReturnValue 131 GNUNET_DAEMON_register (const char *daemon_name, 132 const char *daemon_desc, 133 GNUNET_PROGRAM_Main task); 134 135 136 /** 137 * Start all services and daemons in a single process. 138 * 139 * @param pd project data for the project the program belongs to 140 * @param argc number of command line arguments 141 * @param argv command line arguments 142 */ 143 void 144 GNUNET_PROGRAM_monolith_main (const struct GNUNET_OS_ProjectData *pd, 145 int argc, 146 char *const *argv, 147 struct GNUNET_CONFIGURATION_Handle *cfg); 148 149 #ifndef HAVE_GNUNET_MONOLITH 150 #define GNUNET_DAEMON_MAIN(daemon_name, daemon_help, init_cb) \ 151 int \ 152 main (int argc, \ 153 char *const *argv) \ 154 { \ 155 int ret; \ 156 struct GNUNET_GETOPT_CommandLineOption options[] = { \ 157 GNUNET_GETOPT_OPTION_END \ 158 }; \ 159 ret = GNUNET_PROGRAM_run (GNUNET_OS_project_data_gnunet (), \ 160 argc, \ 161 argv, \ 162 daemon_name, \ 163 daemon_help, \ 164 options, \ 165 init_cb, \ 166 NULL); \ 167 return ret; \ 168 } 169 #else 170 #define GNUNET_DAEMON_MAIN(daemon_name, daemon_help, init_cb) \ 171 int init (void); \ 172 int __attribute__ ((constructor)) \ 173 init (void) \ 174 { \ 175 return GNUNET_DAEMON_register (daemon_name, \ 176 daemon_help, \ 177 init_cb); \ 178 } 179 #endif 180 181 182 /** 183 * Create configuration handle from options and configuration file. 184 * 185 * @param pd project data for the project the program belongs to 186 * @param argc number of command line arguments 187 * @param argv command line arguments 188 */ 189 enum GNUNET_GenericReturnValue 190 GNUNET_PROGRAM_conf_and_options (const struct GNUNET_OS_ProjectData *pd, 191 int argc, 192 char *const *argv, 193 struct GNUNET_CONFIGURATION_Handle *cfg); 194 195 196 /** 197 * Run the mainloop in a monolithic libgnunet. 198 * Must be called such that services are actually launched. 199 * 200 * @param pd project data for the project the program belongs to 201 * @param argc number of command line arguments 202 * @param argv command line arguments 203 */ 204 void 205 GNUNET_DAEMON_main (const struct GNUNET_OS_ProjectData *pd, 206 int argc, 207 char *const *argv, 208 struct GNUNET_CONFIGURATION_Handle *cfg, 209 enum GNUNET_GenericReturnValue with_scheduler); 210 211 212 #if 0 /* keep Emacsens' auto-indent happy */ 213 { 214 #endif 215 #ifdef __cplusplus 216 } 217 #endif 218 219 /* ifndef GNUNET_PROGRAM_LIB_H */ 220 #endif 221 222 /** @} */ /* end of group program */ 223 224 /** @} */ /* end of group addition */ 225 226 /* end of gnunet_program_lib.h */