gnunet-android

GNUnet for Android
Log | Files | Refs | README

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 */