GNUnet  0.11.x
Typedefs | Functions
Program library

Start command-line programs. More...

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

int 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...
 
int 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 56 of file gnunet_program_lib.h.

Function Documentation

◆ GNUNET_PROGRAM_run2()

int 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_OK on success

Definition at line 141 of file program.c.

References _, CommandContext::args, bindtextdomain, CommandContext::cfg, CommandContext::cfgfile, cleanup(), cmd_sorter(), GNUNET_OS_ProjectData::config_file, DIR_SEPARATOR_STR, getenv(), GNUNET_OS_ProjectData::gettext_domain, GNUNET_OS_ProjectData::gettext_path, GNUNET_array_append, GNUNET_asprintf(), GNUNET_CONFIGURATION_create(), 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_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_malloc, GNUNET_memcpy, GNUNET_NO, GNUNET_OK, GNUNET_OS_installation_get_path(), GNUNET_OS_IPK_LOCALEDIR, GNUNET_OS_project_data_get(), GNUNET_RESOLVER_connect(), GNUNET_SCHEDULER_run(), GNUNET_strdup, GNUNET_SYSERR, GNUNET_TIME_set_offset(), GNUNET_YES, name, program_main(), ret, CommandContext::task, CommandContext::task_cls, textdomain, GNUNET_OS_ProjectData::user_config_file, and GNUNET_OS_ProjectData::version.

Referenced by GNUNET_PROGRAM_run(), and main().

149 {
150  struct CommandContext cc;
151 
152 #if ENABLE_NLS
153  char *path;
154 #endif
155  char *loglev;
156  char *logfile;
157  char *cfg_fn;
158  const char *xdg;
159  int ret;
160  unsigned int cnt;
161  unsigned long long skew_offset;
162  unsigned long long skew_variance;
163  long long clock_offset;
166  struct GNUNET_GETOPT_CommandLineOption defoptions[] =
167  { GNUNET_GETOPT_option_cfgfile (&cc.cfgfile),
168  GNUNET_GETOPT_option_help (binaryHelp),
170  GNUNET_GETOPT_option_logfile (&logfile),
172  struct GNUNET_GETOPT_CommandLineOption *allopts;
173  const char *gargs;
174  char *lpfx;
175  char *spc;
176 
177  logfile = NULL;
178  gargs = getenv ("GNUNET_ARGS");
179  if (NULL != gargs)
180  {
181  char **gargv;
182  unsigned int gargc;
183  char *cargs;
184 
185  gargv = NULL;
186  gargc = 0;
187  for (int i = 0; i < argc; i++)
188  GNUNET_array_append (gargv, gargc, GNUNET_strdup (argv[i]));
189  cargs = GNUNET_strdup (gargs);
190  for (char *tok = strtok (cargs, " "); NULL != tok; tok = strtok (NULL, " "))
191  GNUNET_array_append (gargv, gargc, GNUNET_strdup (tok));
192  GNUNET_free (cargs);
193  GNUNET_array_append (gargv, gargc, NULL);
194  argv = (char *const *) gargv;
195  argc = gargc - 1;
196  }
197  memset (&cc, 0, sizeof(cc));
198  loglev = NULL;
199  cc.task = task;
200  cc.task_cls = task_cls;
201  cc.cfg = cfg = GNUNET_CONFIGURATION_create ();
202  /* prepare */
203 #if ENABLE_NLS
204  if (NULL != pd->gettext_domain)
205  {
206  setlocale (LC_ALL, "");
207  path = (NULL == pd->gettext_path)
209  : GNUNET_strdup (pd->gettext_path);
210  if (NULL != path)
211  {
212  bindtextdomain (pd->gettext_domain, path);
213  GNUNET_free (path);
214  }
216  }
217 #endif
218  cnt = 0;
219  while (NULL != options[cnt].name)
220  cnt++;
221  allopts =
222  GNUNET_malloc ((cnt + 1) * sizeof(struct GNUNET_GETOPT_CommandLineOption)
223  + sizeof(defoptions));
224  GNUNET_memcpy (allopts, defoptions, sizeof(defoptions));
225  GNUNET_memcpy (&allopts[sizeof(defoptions)
226  / sizeof(struct GNUNET_GETOPT_CommandLineOption)],
227  options,
228  (cnt + 1) * sizeof(struct GNUNET_GETOPT_CommandLineOption));
229  cnt += sizeof(defoptions) / sizeof(struct GNUNET_GETOPT_CommandLineOption);
230  qsort (allopts,
231  cnt,
232  sizeof(struct GNUNET_GETOPT_CommandLineOption),
233  &cmd_sorter);
234  loglev = NULL;
235  if (NULL != pd->config_file && NULL != pd->user_config_file)
236  {
237  xdg = getenv ("XDG_CONFIG_HOME");
238  if (NULL != xdg)
239  GNUNET_asprintf (&cfg_fn,
240  "%s%s%s",
241  xdg,
243  pd->config_file);
244  else
245  cfg_fn = GNUNET_strdup (pd->user_config_file);
246  }
247  else
248  cfg_fn = NULL;
249  lpfx = GNUNET_strdup (binaryName);
250  if (NULL != (spc = strstr (lpfx, " ")))
251  *spc = '\0';
252  ret = GNUNET_GETOPT_run (binaryName, allopts, (unsigned int) argc, argv);
253  if ((GNUNET_OK > ret) ||
254  (GNUNET_OK != GNUNET_log_setup (lpfx, loglev, logfile)))
255  {
256  GNUNET_free (allopts);
257  GNUNET_free (lpfx);
258  goto cleanup;
259  }
260  if (NULL != cc.cfgfile)
261  {
262  if ((GNUNET_YES != GNUNET_DISK_file_test (cc.cfgfile)) ||
263  (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cc.cfgfile)))
264  {
266  _ (
267  "Unreadable or malformed configuration file `%s', exit ...\n"),
268  cc.cfgfile);
269  ret = GNUNET_SYSERR;
270  GNUNET_free (allopts);
271  GNUNET_free (lpfx);
272  goto cleanup;
273  }
274  }
275  else
276  {
277  if (NULL != cfg_fn && GNUNET_YES == GNUNET_DISK_file_test (cfg_fn))
278  {
279  if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cfg_fn))
280  {
281  GNUNET_log (
283  _ (
284  "Unreadable or malformed default configuration file `%s', exit ...\n"),
285  cfg_fn);
286  ret = GNUNET_SYSERR;
287  GNUNET_free (allopts);
288  GNUNET_free (lpfx);
289  goto cleanup;
290  }
291  }
292  else if (NULL != cfg_fn)
293  {
294  GNUNET_free (cfg_fn);
295  cfg_fn = NULL;
296  if (GNUNET_OK != GNUNET_CONFIGURATION_load (cfg, NULL))
297  {
299  _ ("Unreadable or malformed configuration, exit ...\n"));
300  ret = GNUNET_SYSERR;
301  GNUNET_free (allopts);
302  GNUNET_free (lpfx);
303  goto cleanup;
304  }
305  }
306  }
307  GNUNET_free (allopts);
308  GNUNET_free (lpfx);
310  "testing",
311  "skew_offset",
312  &skew_offset)) &&
314  "testing",
315  "skew_variance",
316  &skew_variance)))
317  {
318  clock_offset = skew_offset - skew_variance;
319  GNUNET_TIME_set_offset (clock_offset);
320  }
321  /* ARM needs to know which configuration file to use when starting
322  services. If we got a command-line option *and* if nothing is
323  specified in the configuration, remember the command-line option
324  in "cfg". This is typically really only having an effect if we
325  are running code in src/arm/, as obviously the rest of the code
326  has little business with ARM-specific options. */if (GNUNET_YES != GNUNET_CONFIGURATION_have_value (cfg, "arm", "CONFIG"))
327  {
328  if (NULL != cc.cfgfile)
329  GNUNET_CONFIGURATION_set_value_string (cfg, "arm", "CONFIG", cc.cfgfile);
330  else if (NULL != cfg_fn)
331  GNUNET_CONFIGURATION_set_value_string (cfg, "arm", "CONFIG", cfg_fn);
332  }
333 
334  /* run */
335  cc.args = &argv[ret];
336  if ((NULL == cc.cfgfile) && (NULL != cfg_fn))
337  cc.cfgfile = GNUNET_strdup (cfg_fn);
338  if (GNUNET_NO == run_without_scheduler)
339  {
341  }
342  else
343  {
344  GNUNET_RESOLVER_connect (cc.cfg);
345  cc.task (cc.task_cls, cc.args, cc.cfgfile, cc.cfg);
346  }
347  ret = GNUNET_OK;
348 cleanup:
350  GNUNET_free (cc.cfgfile);
351  GNUNET_free (cfg_fn);
352  GNUNET_free (loglev);
353  GNUNET_free (logfile);
354  return ret;
355 }
int 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:544
Return the directory where translations are installed (share/locale/)
const char * config_file
Configuration file name (in $XDG_CONFIG_HOME) to use.
char * gettext_domain
Gettext domain for localisation, e.g.
Project-specific data used to help the OS subsystem find installation paths.
int 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.
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-abd.c:36
#define GNUNET_array_append(arr, len, element)
Append an element to an array (growing the array by one).
char * gettext_path
Gettext directory, e.g.
Context for the command.
Definition: program.c:42
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_help(const char *about)
Defining the option to print the command line help text (-h option).
static void program_main(void *cls)
Initial task called by the scheduler for each program.
Definition: program.c:87
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
void GNUNET_SCHEDULER_run(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Initialize and run scheduler.
Definition: scheduler.c:720
const char * user_config_file
Configuration file name to use (if $XDG_CONFIG_HOME is not set).
#define bindtextdomain(Domainname, Dirname)
Definition: gettext.h:57
Definition of a command line option.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(void)
Create a new configuration object.
void GNUNET_TIME_set_offset(long long offset)
Set the timestamp offset for this instance.
Definition: time.c:53
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_logfile(char **logfn)
Allow user to specify log file name (-l option)
int GNUNET_CONFIGURATION_load(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Load configuration.
#define _(String)
GNU gettext support macro.
Definition: platform.h:184
const char * version
String identifying the current project version.
#define textdomain(Domainname)
Definition: gettext.h:56
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_version(const char *version)
Define the option to print the version of the application (-v option)
static int cmd_sorter(const void *a1, const void *a2)
Compare function for &#39;qsort&#39; to sort command-line arguments by the short option.
Definition: program.c:106
#define DIR_SEPARATOR_STR
Definition: platform.h:171
int 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.
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, the current running apps installation directory.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
static void cleanup(void *cls)
Function scheduled as very last function, cleans up after us.
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_loglevel(char **level)
Define the &#39;-L&#39; log level option.
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.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
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:892
char * getenv()
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_cfgfile(char **fn)
Allow user to specify configuration file name (-c option)
configuration data
Definition: configuration.c:84
const char * name
#define GNUNET_log(kind,...)
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_get(void)
int GNUNET_log_setup(const char *comp, const char *loglevel, const char *logfile)
Setup logging.
void GNUNET_RESOLVER_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Create the connection to the resolver service.
Definition: resolver_api.c:257
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_PROGRAM_run()

int 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_OK on success
Parameters
argcnumber of command line arguments
argvcommand line arguments
binaryNameour expected name
binaryHelphelp text for the program
optionscommand line options
taskmain function to run
task_clsclosure for task
Returns
GNUNET_SYSERR on error, GNUNET_OK on success

Definition at line 372 of file program.c.

References GNUNET_NO, and GNUNET_PROGRAM_run2().

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

379 {
380  return GNUNET_PROGRAM_run2 (argc,
381  argv,
382  binaryName,
383  binaryHelp,
384  options,
385  task,
386  task_cls,
387  GNUNET_NO);
388 }
int 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).
Definition: program.c:141
Here is the call graph for this function:
Here is the caller graph for this function: