GNUnet  0.20.0
Program library

Start command-line programs. More...

Collaboration diagram for Program library:

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 (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 (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...
 

Detailed Description

Start command-line programs.

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 ( 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
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 111 of file program.c.

140 {
141  struct CommandContext cc;
142 
143 #if ENABLE_NLS
144  char *path;
145 #endif
146  char *loglev;
147  char *logfile;
148  char *cfg_fn;
150  int iret;
151  unsigned int cnt;
152  unsigned long long skew_offset;
153  unsigned long long skew_variance;
154  long long clock_offset;
157  const struct GNUNET_GETOPT_CommandLineOption defoptions[] = {
158  GNUNET_GETOPT_option_cfgfile (&cc.cfgfile),
159  GNUNET_GETOPT_option_help (binaryHelp),
161  GNUNET_GETOPT_option_logfile (&logfile),
163  };
164  unsigned int deflen = sizeof(defoptions) / sizeof(defoptions[0]);
165  struct GNUNET_GETOPT_CommandLineOption *allopts;
166  const char *gargs;
167  char *lpfx;
168  char *spc;
169 
170  logfile = NULL;
171  gargs = getenv ("GNUNET_ARGS");
172  if (NULL != gargs)
173  {
174  char **gargv;
175  unsigned int gargc;
176  char *cargs;
177 
178  gargv = NULL;
179  gargc = 0;
180  for (int i = 0; i < argc; i++)
181  GNUNET_array_append (gargv,
182  gargc,
183  GNUNET_strdup (argv[i]));
184  cargs = GNUNET_strdup (gargs);
185  for (char *tok = strtok (cargs, " ");
186  NULL != tok;
187  tok = strtok (NULL, " "))
188  GNUNET_array_append (gargv, gargc, GNUNET_strdup (tok));
189  GNUNET_free (cargs);
190  GNUNET_array_append (gargv, gargc, NULL);
191  argv = (char *const *) gargv;
192  argc = gargc - 1;
193  }
194  memset (&cc, 0, sizeof(cc));
195  loglev = NULL;
196  cc.task = task;
197  cc.task_cls = task_cls;
198  cc.cfg = cfg = GNUNET_CONFIGURATION_create ();
199  /* prepare */
200 #if ENABLE_NLS
201  if (NULL != pd->gettext_domain)
202  {
203  setlocale (LC_ALL, "");
204  path = (NULL == pd->gettext_path)
206  : GNUNET_strdup (pd->gettext_path);
207  if (NULL != path)
208  {
209  bindtextdomain (pd->gettext_domain, path);
210  GNUNET_free (path);
211  }
213  }
214 #endif
215  cnt = 0;
216  while (NULL != options[cnt].name)
217  cnt++;
218  allopts = GNUNET_new_array (cnt + deflen + 1,
220  GNUNET_memcpy (allopts,
221  options,
222  cnt * sizeof(struct GNUNET_GETOPT_CommandLineOption));
223  {
224  unsigned int xtra = 0;
225 
226  for (unsigned int i = 0;
227  i<sizeof (defoptions) / sizeof(struct GNUNET_GETOPT_CommandLineOption);
228  i++)
229  {
230  bool found = false;
231 
232  for (unsigned int j = 0; j<cnt; j++)
233  {
234  found |= ( (options[j].shortName == defoptions[i].shortName) &&
235  (0 != options[j].shortName) );
236  found |= ( (NULL != options[j].name) &&
237  (NULL != defoptions[i].name) &&
238  (0 == strcmp (options[j].name,
239  defoptions[i].name)) );
240  if (found)
241  break;
242  }
243  if (found)
244  continue;
245  GNUNET_memcpy (&allopts[cnt + xtra],
246  &defoptions[i],
247  sizeof (struct GNUNET_GETOPT_CommandLineOption));
248  xtra++;
249  }
250  cnt += xtra;
251  }
252  qsort (allopts,
253  cnt,
254  sizeof(struct GNUNET_GETOPT_CommandLineOption),
255  &cmd_sorter);
256  loglev = NULL;
257  if ((NULL != pd->config_file) && (NULL != pd->user_config_file))
259  else
260  cfg_fn = NULL;
261  lpfx = GNUNET_strdup (binaryName);
262  if (NULL != (spc = strstr (lpfx, " ")))
263  *spc = '\0';
264  iret = GNUNET_GETOPT_run (binaryName,
265  allopts,
266  (unsigned int) argc,
267  argv);
268  if ((GNUNET_OK > iret) ||
269  (GNUNET_OK != GNUNET_log_setup (lpfx,
270  loglev,
271  logfile)))
272  {
273  GNUNET_free (allopts);
274  GNUNET_free (lpfx);
275  ret = (enum GNUNET_GenericReturnValue) iret;
276  goto cleanup;
277  }
278  if (NULL != cc.cfgfile)
279  {
281  "Loading configuration from entry point specified as option (%s)\n",
282  cc.cfgfile);
283  if (GNUNET_YES !=
284  GNUNET_DISK_file_test (cc.cfgfile))
285  {
287  _ ("Unreadable configuration file `%s', exiting ...\n"),
288  cc.cfgfile);
289  ret = GNUNET_SYSERR;
290  GNUNET_free (allopts);
291  GNUNET_free (lpfx);
292  goto cleanup;
293  }
294  if (GNUNET_SYSERR ==
296  cc.cfgfile))
297  {
299  _ ("Malformed configuration file `%s', exiting ...\n"),
300  cc.cfgfile);
301  ret = GNUNET_SYSERR;
302  GNUNET_free (allopts);
303  GNUNET_free (lpfx);
304  goto cleanup;
305  }
306  }
307  else
308  {
309  if ( (NULL != cfg_fn) &&
310  (GNUNET_YES !=
311  GNUNET_DISK_file_test (cfg_fn)) )
312  {
314  _ ("Unreadable configuration file `%s'. Exiting ...\n"),
315  cfg_fn);
316  ret = GNUNET_SYSERR;
317  GNUNET_free (allopts);
318  GNUNET_free (lpfx);
319  goto cleanup;
320  }
322  "Loading configuration from entry point `%s'\n",
323  cc.cfgfile);
324  if (GNUNET_SYSERR ==
326  cfg_fn))
327  {
329  _ ("Malformed configuration. Exiting ...\n"));
330  ret = GNUNET_SYSERR;
331  GNUNET_free (allopts);
332  GNUNET_free (lpfx);
333  goto cleanup;
334  }
335  }
336  GNUNET_free (allopts);
337  GNUNET_free (lpfx);
338  if ((GNUNET_OK ==
340  "testing",
341  "skew_offset",
342  &skew_offset)) &&
343  (GNUNET_OK ==
345  "testing",
346  "skew_variance",
347  &skew_variance)))
348  {
349  clock_offset = skew_offset - skew_variance;
350  GNUNET_TIME_set_offset (clock_offset);
351  }
352  /* ARM needs to know which configuration file to use when starting
353  services. If we got a command-line option *and* if nothing is
354  specified in the configuration, remember the command-line option
355  in "cfg". This is typically really only having an effect if we
356  are running code in src/arm/, as obviously the rest of the code
357  has little business with ARM-specific options. */
358  if (GNUNET_YES !=
360  "arm",
361  "CONFIG"))
362  {
363  if (NULL != cc.cfgfile)
365  "arm",
366  "CONFIG",
367  cc.cfgfile);
368  else if (NULL != cfg_fn)
370  "arm",
371  "CONFIG",
372  cfg_fn);
373  }
374 
375  /* run */
376  cc.args = &argv[iret];
377  if ((NULL == cc.cfgfile) && (NULL != cfg_fn))
378  cc.cfgfile = GNUNET_strdup (cfg_fn);
379  if (GNUNET_NO == run_without_scheduler)
380  {
382  }
383  else
384  {
385  GNUNET_RESOLVER_connect (cc.cfg);
386  cc.task (cc.task_cls, cc.args, cc.cfgfile, cc.cfg);
387  }
388  ret = GNUNET_OK;
389 cleanup:
391  GNUNET_free (cc.cfgfile);
392  GNUNET_free (cfg_fn);
393  GNUNET_free (loglev);
394  GNUNET_free (logfile);
395  return ret;
396 }
struct GNUNET_GETOPT_CommandLineOption options[]
Definition: 002.c:5
char * getenv()
#define textdomain(Domainname)
Definition: gettext.h:57
#define bindtextdomain(Domainname, Dirname)
Definition: gettext.h:58
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-abd.c:36
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
static void cleanup(void *cls)
Function scheduled as very last function, cleans up after us.
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.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(void)
Create a new configuration object.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_load(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Load configuration.
char * GNUNET_CONFIGURATION_default_filename(void)
Return the filename of the default configuration filename that is used when no explicit 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:482
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 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
int 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.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_get(void)
char * GNUNET_OS_installation_get_path(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:720
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
const char * name
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
Definition of a command line option.
const char * name
Long name of the option (may not be NULL)
const char shortName
Short name of the option.
Project-specific data used to help the OS subsystem find installation paths.
char * gettext_path
Gettext directory, 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.
char * gettext_domain
Gettext domain for localisation, e.g.
const char * version
String identifying the current project version.

Referenced by main().

Here is the caller graph for this function:

◆ GNUNET_PROGRAM_run()

enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run ( 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
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 111 of file program.c.

407 {
408  return GNUNET_PROGRAM_run2 (argc,
409  argv,
410  binaryName,
411  binaryHelp,
412  options,
413  task,
414  task_cls,
415  GNUNET_NO);
416 }
enum GNUNET_GenericReturnValue GNUNET_PROGRAM_run2(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

Referenced by GNUNET_TESTBED_test_run(), GNUNET_TRANSPORT_TESTING_connect_check(), and main().

Here is the caller graph for this function: