GNUnet 0.22.2
Program library

Start command-line programs. More...

Collaboration diagram for Program library:

Macros

#define GNUNET_DAEMON_MAIN(daemon_name, daemon_help, init_cb)
 

Typedefs

typedef void(* GNUNET_PROGRAM_Main) (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
 Main function that will be run. More...
 

Functions

enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run2 (const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls, int run_without_scheduler)
 Run a standard GNUnet command startup sequence (initialize loggers and configuration, parse options). More...
 
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run (const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
 Run a standard GNUnet command startup sequence (initialize loggers and configuration, parse options). More...
 
enum GNUNET_GenericReturnValue GNUNET_DAEMON_register (const char *daemon_name, const char *daemon_desc, GNUNET_PROGRAM_Main task)
 
void GNUNET_PROGRAM_monolith_main (const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, struct GNUNET_CONFIGURATION_Handle *cfg)
 Start all services and daemons in a single process. More...
 
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_conf_and_options (const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, struct GNUNET_CONFIGURATION_Handle *cfg)
 Create configuration handle from options and configuration file. More...
 
void GNUNET_DAEMON_main (const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, struct GNUNET_CONFIGURATION_Handle *cfg, enum GNUNET_GenericReturnValue with_scheduler)
 Run the mainloop in a monolithic libgnunet. More...
 

Detailed Description

Start command-line programs.

Macro Definition Documentation

◆ GNUNET_DAEMON_MAIN

#define GNUNET_DAEMON_MAIN (   daemon_name,
  daemon_help,
  init_cb 
)
Value:
main (int argc, \
char *const *argv) \
{ \
int ret; \
GNUNET_GETOPT_OPTION_END \
}; \
argc, \
argv, \
daemon_name, \
daemon_help, \
NULL); \
return ret; \
}
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
static int ret
Final status code.
Definition: gnunet-arm.c:93
int main(int argc, char *const *argv)
The main function to obtain arm from gnunetd.
Definition: gnunet-arm.c:970
static void init_cb(void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg, struct GNUNET_SERVICE_Handle *sh)
Service is starting, initialize everything.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run(const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls)
Run a standard GNUnet command startup sequence (initialize loggers and configuration,...
Definition: program.c:407
Definition of a command line option.

Definition at line 150 of file gnunet_program_lib.h.

Typedef Documentation

◆ GNUNET_PROGRAM_Main

typedef void(* GNUNET_PROGRAM_Main) (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)

Main function that will be run.

Parameters
clsclosure
argsremaining command-line arguments
cfgfilename of the configuration file used (for saving, can be NULL!)
cfgconfiguration

Definition at line 64 of file gnunet_program_lib.h.

Function Documentation

◆ GNUNET_PROGRAM_run2()

enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run2 ( const struct GNUNET_OS_ProjectData pd,
int  argc,
char *const *  argv,
const char *  binaryName,
const char *  binaryHelp,
const struct GNUNET_GETOPT_CommandLineOption options,
GNUNET_PROGRAM_Main  task,
void *  task_cls,
int  run_without_scheduler 
)

Run a standard GNUnet command startup sequence (initialize loggers and configuration, parse options).

Parameters
pdproject data for the project the program belongs to
argcnumber of command line arguments in argv
argvcommand line arguments
binaryNameour expected name
binaryHelphelp text for the program
optionscommand line options
taskmain function to run
task_clsclosure for task
run_without_schedulerGNUNET_NO start the scheduler, GNUNET_YES do not start the scheduler just run the main task
Returns
GNUNET_SYSERR on error, GNUNET_NO if successful option processing called for the program to terminate, GNUNET_OK on success (#a task was invoked)

Definition at line 132 of file program.c.

141{
142 struct CommandContext cc;
143
144#if ENABLE_NLS
145 char *path;
146#endif
147 char *loglev;
148 char *logfile;
149 char *cfg_fn;
151 int iret;
152 unsigned int cnt;
153 unsigned long long skew_offset;
154 unsigned long long skew_variance;
155 long long clock_offset;
157 const struct GNUNET_GETOPT_CommandLineOption defoptions[] = {
158 GNUNET_GETOPT_option_cfgfile (&cc.cfgfile),
160 binaryHelp),
164 };
165 unsigned int deflen = sizeof(defoptions) / sizeof(defoptions[0]);
166 struct GNUNET_GETOPT_CommandLineOption *allopts;
167 const char *gargs;
168 char *lpfx;
169 char *spc;
170
171 logfile = NULL;
172 gargs = getenv ("GNUNET_ARGS");
173 if (NULL != gargs)
174 {
175 char **gargv;
176 unsigned int gargc;
177 char *cargs;
178
179 gargv = NULL;
180 gargc = 0;
181 for (int i = 0; i < argc; i++)
182 GNUNET_array_append (gargv,
183 gargc,
184 GNUNET_strdup (argv[i]));
185 cargs = GNUNET_strdup (gargs);
186 for (char *tok = strtok (cargs, " ");
187 NULL != tok;
188 tok = strtok (NULL, " "))
189 GNUNET_array_append (gargv,
190 gargc,
191 GNUNET_strdup (tok));
192 GNUNET_free (cargs);
193 GNUNET_array_append (gargv,
194 gargc,
195 NULL);
196 argv = (char *const *) gargv;
197 argc = gargc - 1;
198 }
199 memset (&cc, 0, sizeof(cc));
200 loglev = NULL;
201 cc.task = task;
202 cc.task_cls = task_cls;
203 cc.cfg = cfg = GNUNET_CONFIGURATION_create (pd);
204 /* prepare */
205#if ENABLE_NLS
206 if (NULL != pd->gettext_domain)
207 {
208 setlocale (LC_ALL, "");
209 path = (NULL == pd->gettext_path)
213 if (NULL != path)
214 {
216 path);
217 GNUNET_free (path);
218 }
220 }
221#endif
222 cnt = 0;
223 while (NULL != options[cnt].name)
224 cnt++;
225 allopts = GNUNET_new_array (cnt + deflen + 1,
227 GNUNET_memcpy (allopts,
228 options,
229 cnt * sizeof(struct GNUNET_GETOPT_CommandLineOption));
230 {
231 unsigned int xtra = 0;
232
233 for (unsigned int i = 0;
234 i<sizeof (defoptions) / sizeof(struct GNUNET_GETOPT_CommandLineOption);
235 i++)
236 {
237 bool found = false;
238
239 for (unsigned int j = 0; j<cnt; j++)
240 {
241 found |= ( (options[j].shortName == defoptions[i].shortName) &&
242 (0 != options[j].shortName) );
243 found |= ( (NULL != options[j].name) &&
244 (NULL != defoptions[i].name) &&
245 (0 == strcmp (options[j].name,
246 defoptions[i].name)) );
247 if (found)
248 break;
249 }
250 if (found)
251 continue;
252 GNUNET_memcpy (&allopts[cnt + xtra],
253 &defoptions[i],
254 sizeof (struct GNUNET_GETOPT_CommandLineOption));
255 xtra++;
256 }
257 cnt += xtra;
258 }
259 qsort (allopts,
260 cnt,
261 sizeof(struct GNUNET_GETOPT_CommandLineOption),
262 &cmd_sorter);
263 loglev = NULL;
264 if ((NULL != pd->config_file) && (NULL != pd->user_config_file))
266 else
267 cfg_fn = NULL;
268 lpfx = GNUNET_strdup (binaryName);
269 if (NULL != (spc = strstr (lpfx, " ")))
270 *spc = '\0';
271 iret = GNUNET_GETOPT_run (binaryName,
272 allopts,
273 (unsigned int) argc,
274 argv);
275 if ((GNUNET_OK > iret) ||
276 (GNUNET_OK != GNUNET_log_setup (lpfx,
277 loglev,
278 logfile)))
279 {
280 GNUNET_free (allopts);
281 GNUNET_free (lpfx);
282 ret = (enum GNUNET_GenericReturnValue) iret;
283 goto cleanup;
284 }
285 if (NULL != cc.cfgfile)
286 {
288 "Loading configuration from entry point specified as option (%s)\n",
289 cc.cfgfile);
290 if (GNUNET_YES !=
291 GNUNET_DISK_file_test (cc.cfgfile))
292 {
294 _ ("Unreadable configuration file `%s', exiting ...\n"),
295 cc.cfgfile);
297 GNUNET_free (allopts);
298 GNUNET_free (lpfx);
299 goto cleanup;
300 }
301 if (GNUNET_SYSERR ==
303 cc.cfgfile))
304 {
306 _ ("Malformed configuration file `%s', exiting ...\n"),
307 cc.cfgfile);
309 GNUNET_free (allopts);
310 GNUNET_free (lpfx);
311 goto cleanup;
312 }
313 }
314 else
315 {
316 if ( (NULL != cfg_fn) &&
317 (GNUNET_YES !=
318 GNUNET_DISK_file_test (cfg_fn)) )
319 {
321 _ ("Unreadable configuration file `%s'. Exiting ...\n"),
322 cfg_fn);
324 GNUNET_free (allopts);
325 GNUNET_free (lpfx);
326 goto cleanup;
327 }
329 "Loading configuration from entry point `%s'\n",
330 cc.cfgfile);
331 if (GNUNET_SYSERR ==
333 cfg_fn))
334 {
336 _ ("Malformed configuration. Exiting ...\n"));
338 GNUNET_free (allopts);
339 GNUNET_free (lpfx);
340 goto cleanup;
341 }
342 }
343 GNUNET_free (allopts);
344 GNUNET_free (lpfx);
345 if ((GNUNET_OK ==
347 "testing",
348 "skew_offset",
349 &skew_offset)) &&
350 (GNUNET_OK ==
352 "testing",
353 "skew_variance",
354 &skew_variance)))
355 {
356 clock_offset = skew_offset - skew_variance;
357 GNUNET_TIME_set_offset (clock_offset);
358 }
359 /* ARM needs to know which configuration file to use when starting
360 services. If we got a command-line option *and* if nothing is
361 specified in the configuration, remember the command-line option
362 in "cfg". This is typically really only having an effect if we
363 are running code in src/arm/, as obviously the rest of the code
364 has little business with ARM-specific options. */
365 if (GNUNET_YES !=
367 "arm",
368 "CONFIG"))
369 {
370 if (NULL != cc.cfgfile)
372 "arm",
373 "CONFIG",
374 cc.cfgfile);
375 else if (NULL != cfg_fn)
377 "arm",
378 "CONFIG",
379 cfg_fn);
380 }
381
382 /* run */
383 cc.args = &argv[iret];
384 if ((NULL == cc.cfgfile) && (NULL != cfg_fn))
385 cc.cfgfile = GNUNET_strdup (cfg_fn);
386 if (GNUNET_NO == run_without_scheduler)
387 {
389 }
390 else
391 {
393 cc.task (cc.task_cls, cc.args, cc.cfgfile, cc.cfg);
394 }
395 ret = GNUNET_OK;
396cleanup:
398 GNUNET_free (cc.cfgfile);
399 GNUNET_free (cfg_fn);
400 GNUNET_free (loglev);
401 GNUNET_free (logfile);
402 return ret;
403}
char * getenv()
#define textdomain(Domainname)
Definition: gettext.h:61
#define bindtextdomain(Domainname, Dirname)
Definition: gettext.h:62
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:108
static void cleanup(void *cls)
Disconnect and shutdown.
Definition: gnunet-did.c:130
static char * name
Name (label) of the records to list.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(const struct GNUNET_OS_ProjectData *pd)
Create a new configuration object.
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
char * GNUNET_CONFIGURATION_default_filename(const struct GNUNET_OS_ProjectData *pd)
Return the filename of the default configuration filename that is used when no explicit configuration...
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_load(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Load configuration.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_have_value(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option)
Test if we have a value for a particular option.
enum GNUNET_GenericReturnValue GNUNET_DISK_file_test(const char *fil)
Check that fil corresponds to a filename (of a file that exists and that is not a directory).
Definition: disk.c:506
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_cfgfile(char **fn)
Allow user to specify configuration file name (-c option)
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_logfile(char **logfn)
Allow user to specify log file name (-l option)
int GNUNET_GETOPT_run(const char *binaryOptions, const struct GNUNET_GETOPT_CommandLineOption *allOptions, unsigned int argc, char *const *argv)
Parse the command line.
Definition: getopt.c:884
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_help(const struct GNUNET_OS_ProjectData *pd, const char *about)
Defining the option to print the command line help text (-h option).
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_loglevel(char **level)
Define the '-L' log level option.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_version(const char *version)
Define the option to print the version of the application (-v option)
#define GNUNET_log(kind,...)
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
enum GNUNET_GenericReturnValue GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.
#define GNUNET_array_append(arr, len, element)
Append an element to an array (growing the array by one).
#define GNUNET_free(ptr)
Wrapper around free.
char * GNUNET_OS_installation_get_path(const struct GNUNET_OS_ProjectData *pd, enum GNUNET_OS_InstallationPathKind dirkind)
Get the path to a specific GNUnet installation directory or, with GNUNET_OS_IPK_SELF_PREFIX,...
@ GNUNET_OS_IPK_LOCALEDIR
Return the directory where translations are installed (share/locale/)
void GNUNET_RESOLVER_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Create the connection to the resolver service.
Definition: resolver_api.c:258
void GNUNET_SCHEDULER_run(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Initialize and run scheduler.
Definition: scheduler.c:725
void GNUNET_TIME_set_offset(long long offset)
Set the timestamp offset for this instance.
Definition: time.c:49
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
static void program_main(void *cls)
Initial task called by the scheduler for each program.
Definition: program.c:88
static int cmd_sorter(const void *a1, const void *a2)
Compare function for 'qsort' to sort command-line arguments by the short option.
Definition: program.c:111
Context for the command.
Definition: program.c:44
const char * name
Long name of the option (may not be NULL)
const char shortName
Short name of the option.
const char * gettext_path
Gettext directory, e.g.
const char * gettext_domain
Gettext domain for localisation, e.g.
const char * user_config_file
Configuration file name to use (if $XDG_CONFIG_HOME is not set).
const char * config_file
Configuration file name (in $XDG_CONFIG_HOME) to use.
const char * version
String identifying the current project version.

References _, CommandContext::args, bindtextdomain, cfg, CommandContext::cfg, CommandContext::cfgfile, cleanup(), cmd_sorter(), GNUNET_OS_ProjectData::config_file, getenv(), GNUNET_OS_ProjectData::gettext_domain, GNUNET_OS_ProjectData::gettext_path, GNUNET_array_append, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_default_filename(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_have_value(), GNUNET_CONFIGURATION_load(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_DISK_file_test(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_GETOPT_option_cfgfile(), GNUNET_GETOPT_option_help(), GNUNET_GETOPT_option_logfile(), GNUNET_GETOPT_option_loglevel(), GNUNET_GETOPT_option_version(), GNUNET_GETOPT_run(), GNUNET_log, GNUNET_log_setup(), GNUNET_memcpy, GNUNET_new_array, GNUNET_NO, GNUNET_OK, GNUNET_OS_installation_get_path(), GNUNET_OS_IPK_LOCALEDIR, GNUNET_RESOLVER_connect(), GNUNET_SCHEDULER_run(), GNUNET_strdup, GNUNET_SYSERR, GNUNET_TIME_set_offset(), GNUNET_YES, name, GNUNET_GETOPT_CommandLineOption::name, options, program_main(), ret, GNUNET_GETOPT_CommandLineOption::shortName, CommandContext::task, CommandContext::task_cls, textdomain, GNUNET_OS_ProjectData::user_config_file, and GNUNET_OS_ProjectData::version.

Referenced by GNUNET_PROGRAM_run(), and main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_PROGRAM_run()

enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run ( const struct GNUNET_OS_ProjectData pd,
int  argc,
char *const *  argv,
const char *  binaryName,
const char *  binaryHelp,
const struct GNUNET_GETOPT_CommandLineOption options,
GNUNET_PROGRAM_Main  task,
void *  task_cls 
)

Run a standard GNUnet command startup sequence (initialize loggers and configuration, parse options).

Parameters
pdproject data for the project the program belongs to
argcnumber of command line arguments
argvcommand line arguments
binaryNameour expected name
binaryHelphelptext for "-h" option (about the app)
optionscommand line options
taskmain function to run
task_clsclosure for task
Returns
GNUNET_SYSERR on error, GNUNET_NO if successful option processing called for the program to terminate, GNUNET_OK on success (#a task was invoked)

Definition at line 407 of file program.c.

415{
416 return GNUNET_PROGRAM_run2 (pd,
417 argc,
418 argv,
419 binaryName,
420 binaryHelp,
421 options,
422 task,
423 task_cls,
424 GNUNET_NO);
425}
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run2(const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, const char *binaryName, const char *binaryHelp, const struct GNUNET_GETOPT_CommandLineOption *options, GNUNET_PROGRAM_Main task, void *task_cls, int run_without_scheduler)
Run a standard GNUnet command startup sequence (initialize loggers and configuration,...
Definition: program.c:132

References GNUNET_NO, GNUNET_PROGRAM_run2(), and options.

Referenced by GNUNET_TRANSPORT_TESTING_connect_check(), and main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_DAEMON_register()

enum GNUNET_GenericReturnValue GNUNET_DAEMON_register ( const char *  daemon_name,
const char *  daemon_desc,
GNUNET_PROGRAM_Main  task 
)

Definition at line 683 of file program.c.

686{
687 struct DaemonHandleList *hle;
688
690 "registering daemon %s\n",
692 hle = GNUNET_new (struct DaemonHandleList);
693 hle->d = task;
696 hll_tail,
697 hle);
698 return GNUNET_OK;
699}
#define GNUNET_CONTAINER_DLL_insert(head, tail, element)
Insert an element at the head of a DLL.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static struct DaemonHandleList * hll_tail
Definition: program.c:626
static struct DaemonHandleList * hll_head
Definition: program.c:623
#define LOG(kind,...)
Definition: program.c:35
GNUNET_PROGRAM_Main d
Definition: program.c:615
const char * daemon_name
Definition: program.c:619

References DaemonHandleList::d, DaemonHandleList::daemon_name, GNUNET_CONTAINER_DLL_insert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_new, GNUNET_OK, hll_head, hll_tail, and LOG.

◆ GNUNET_PROGRAM_monolith_main()

void GNUNET_PROGRAM_monolith_main ( const struct GNUNET_OS_ProjectData pd,
int  argc,
char *const *  argv,
struct GNUNET_CONFIGURATION_Handle cfg 
)

Start all services and daemons in a single process.

Parameters
pdproject data for the project the program belongs to
argcnumber of command line arguments
argvcommand line arguments

Definition at line 582 of file program.c.

586{
587 struct MonoContext mc = {
588 .cfg = cfg,
589 .pd = pd
590 };
591
592 if (GNUNET_YES !=
594 argc,
595 argv,
596 cfg))
597 return;
599 &mc);
600}
static struct GNUNET_TESTBED_Controller * mc
Handle to the master controller.
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_conf_and_options(const struct GNUNET_OS_ProjectData *pd, int argc, char *const *argv, struct GNUNET_CONFIGURATION_Handle *cfg)
Create configuration handle from options and configuration file.
Definition: program.c:429
static void monolith_main(void *cls)
Definition: program.c:564
const struct GNUNET_OS_ProjectData * pd
Project data for this configuration object.
const struct GNUNET_OS_ProjectData * pd
Definition: program.c:559

References cfg, GNUNET_PROGRAM_conf_and_options(), GNUNET_SCHEDULER_run(), GNUNET_YES, mc, monolith_main(), GNUNET_CONFIGURATION_Handle::pd, and MonoContext::pd.

Here is the call graph for this function:

◆ GNUNET_PROGRAM_conf_and_options()

enum GNUNET_GenericReturnValue GNUNET_PROGRAM_conf_and_options ( const struct GNUNET_OS_ProjectData pd,
int  argc,
char *const *  argv,
struct GNUNET_CONFIGURATION_Handle cfg 
)

Create configuration handle from options and configuration file.

Parameters
pdproject data for the project the program belongs to
argcnumber of command line arguments
argvcommand line arguments

Definition at line 429 of file program.c.

433{
434 char *cfg_filename;
435 char *opt_cfg_filename;
436 char *logfile;
437 char *loglev;
438 const char *xdg;
439 int do_daemonize;
440 int ret;
441 struct GNUNET_GETOPT_CommandLineOption service_options[] = {
442 GNUNET_GETOPT_option_cfgfile (&opt_cfg_filename),
444 "daemonize",
446 "do daemonize (detach from terminal)"),
447 &do_daemonize),
449 NULL),
454 };
455
456 xdg = getenv ("XDG_CONFIG_HOME");
457 if (NULL != xdg)
459 "%s%s%s",
460 xdg,
462 pd->config_file);
463 else
465
466 loglev = NULL;
467 logfile = NULL;
468 opt_cfg_filename = NULL;
469 // FIXME we need to set this up for each service!
470 ret = GNUNET_GETOPT_run ("libgnunet",
471 service_options,
472 argc,
473 argv);
474 if (GNUNET_SYSERR == ret)
475 goto error;
476 if (GNUNET_NO == ret)
477 {
478 goto error;
479 }
480 // FIXME we need to set this up for each service!
481 // NOTE: that was not the idea. What are you proposing? -CG
482 if (GNUNET_OK !=
483 GNUNET_log_setup ("libgnunet",
484 "DEBUG",// loglev,
485 logfile))
486 {
487 GNUNET_break (0);
488 goto error;
489 }
490 if (NULL == cfg)
491 {
493 if (NULL != opt_cfg_filename)
494 {
495 if ( (GNUNET_YES !=
496 GNUNET_DISK_file_test (opt_cfg_filename)) ||
497 (GNUNET_SYSERR ==
499 opt_cfg_filename)) )
500 {
502 _ ("Malformed configuration file `%s', exit ...\n"),
503 opt_cfg_filename);
504 goto error;
505 }
506 }
507 else
508 {
509 if (GNUNET_YES ==
511 {
512 if (GNUNET_SYSERR ==
515 {
517 _ ("Malformed configuration file `%s', exit ...\n"),
520 goto error;;
521 }
522 }
523 else
524 {
525 if (GNUNET_SYSERR ==
527 NULL))
528 {
530 _ ("Malformed configuration, exit ...\n"));
532 goto error;
533 }
534 }
535 }
536 }
537
538 GNUNET_free (logfile);
539 GNUNET_free (loglev);
541 GNUNET_free (opt_cfg_filename);
542
543 return GNUNET_OK;
544
545error:
548 GNUNET_free (logfile);
549 GNUNET_free (loglev);
551 GNUNET_free (opt_cfg_filename);
552
553 return GNUNET_SYSERR;
554}
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_OPTION_END
Definition: 002.c:13
#define gettext_noop(String)
Definition: gettext.h:74
static char * cfg_filename
Name of the configuration file.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_flag(char shortName, const char *name, const char *description, int *val)
Allow user to specify a flag (which internally means setting an integer to 1/GNUNET_YES/GNUNET_OK.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define DIR_SEPARATOR_STR
Definition: platform.h:166
void GNUNET_SPEEDUP_stop_()
Stop tasks that modify clock behavior.
Definition: speedup.c:100

References _, cfg, cfg_filename, GNUNET_OS_ProjectData::config_file, DIR_SEPARATOR_STR, getenv(), gettext_noop, GNUNET_asprintf(), GNUNET_break, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_load(), GNUNET_DISK_file_test(), GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_GETOPT_option_cfgfile(), GNUNET_GETOPT_OPTION_END, GNUNET_GETOPT_option_flag(), GNUNET_GETOPT_option_help(), GNUNET_GETOPT_option_logfile(), GNUNET_GETOPT_option_loglevel(), GNUNET_GETOPT_option_version(), GNUNET_GETOPT_run(), GNUNET_log, GNUNET_log_setup(), GNUNET_NO, GNUNET_OK, GNUNET_SPEEDUP_stop_(), GNUNET_strdup, GNUNET_SYSERR, GNUNET_YES, ret, GNUNET_OS_ProjectData::user_config_file, and GNUNET_OS_ProjectData::version.

Referenced by GNUNET_DAEMON_main(), GNUNET_PROGRAM_monolith_main(), and GNUNET_SERVICE_main().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_DAEMON_main()

void GNUNET_DAEMON_main ( const struct GNUNET_OS_ProjectData pd,
int  argc,
char *const *  argv,
struct GNUNET_CONFIGURATION_Handle cfg,
enum GNUNET_GenericReturnValue  with_scheduler 
)

Run the mainloop in a monolithic libgnunet.

Must be called such that services are actually launched.

Parameters
pdproject data for the project the program belongs to
argcnumber of command line arguments
argvcommand line arguments

Definition at line 658 of file program.c.

663{
665 "Entering GNUNET_DAEMON_main\n");
666 if (GNUNET_YES == with_scheduler)
667 {
668 if (GNUNET_YES !=
670 argc,
671 argv,
672 cfg))
673 return;
675 cfg);
676 }
677 else
679}
static void launch_daemons(void *cls)
Definition: program.c:639

References cfg, GNUNET_ERROR_TYPE_DEBUG, GNUNET_PROGRAM_conf_and_options(), GNUNET_SCHEDULER_run(), GNUNET_YES, launch_daemons(), LOG, and GNUNET_CONFIGURATION_Handle::pd.

Referenced by monolith_main().

Here is the call graph for this function:
Here is the caller graph for this function: