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

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 56 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 126 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().

134 {
135  struct CommandContext cc;
136 
137 #if ENABLE_NLS
138  char *path;
139 #endif
140  char *loglev;
141  char *logfile;
142  char *cfg_fn;
143  const char *xdg;
145  int iret;
146  unsigned int cnt;
147  unsigned long long skew_offset;
148  unsigned long long skew_variance;
149  long long clock_offset;
152  struct GNUNET_GETOPT_CommandLineOption defoptions[] =
153  { GNUNET_GETOPT_option_cfgfile (&cc.cfgfile),
154  GNUNET_GETOPT_option_help (binaryHelp),
156  GNUNET_GETOPT_option_logfile (&logfile),
158  struct GNUNET_GETOPT_CommandLineOption *allopts;
159  const char *gargs;
160  char *lpfx;
161  char *spc;
162 
163  logfile = NULL;
164  gargs = getenv ("GNUNET_ARGS");
165  if (NULL != gargs)
166  {
167  char **gargv;
168  unsigned int gargc;
169  char *cargs;
170 
171  gargv = NULL;
172  gargc = 0;
173  for (int i = 0; i < argc; i++)
174  GNUNET_array_append (gargv, gargc, GNUNET_strdup (argv[i]));
175  cargs = GNUNET_strdup (gargs);
176  for (char *tok = strtok (cargs, " "); NULL != tok; tok = strtok (NULL, " "))
177  GNUNET_array_append (gargv, gargc, GNUNET_strdup (tok));
178  GNUNET_free (cargs);
179  GNUNET_array_append (gargv, gargc, NULL);
180  argv = (char *const *) gargv;
181  argc = gargc - 1;
182  }
183  memset (&cc, 0, sizeof(cc));
184  loglev = NULL;
185  cc.task = task;
186  cc.task_cls = task_cls;
187  cc.cfg = cfg = GNUNET_CONFIGURATION_create ();
188  /* prepare */
189 #if ENABLE_NLS
190  if (NULL != pd->gettext_domain)
191  {
192  setlocale (LC_ALL, "");
193  path = (NULL == pd->gettext_path)
195  : GNUNET_strdup (pd->gettext_path);
196  if (NULL != path)
197  {
198  bindtextdomain (pd->gettext_domain, path);
199  GNUNET_free (path);
200  }
202  }
203 #endif
204  cnt = 0;
205  while (NULL != options[cnt].name)
206  cnt++;
207  allopts =
208  GNUNET_malloc ((cnt + 1) * sizeof(struct GNUNET_GETOPT_CommandLineOption)
209  + sizeof(defoptions));
210  GNUNET_memcpy (allopts, defoptions, sizeof(defoptions));
211  GNUNET_memcpy (&allopts[sizeof(defoptions)
212  / sizeof(struct GNUNET_GETOPT_CommandLineOption)],
213  options,
214  (cnt + 1) * sizeof(struct GNUNET_GETOPT_CommandLineOption));
215  cnt += sizeof(defoptions) / sizeof(struct GNUNET_GETOPT_CommandLineOption);
216  qsort (allopts,
217  cnt,
218  sizeof(struct GNUNET_GETOPT_CommandLineOption),
219  &cmd_sorter);
220  loglev = NULL;
221  if ((NULL != pd->config_file) && (NULL != pd->user_config_file))
222  {
223  xdg = getenv ("XDG_CONFIG_HOME");
224  if (NULL != xdg)
225  GNUNET_asprintf (&cfg_fn,
226  "%s%s%s",
227  xdg,
229  pd->config_file);
230  else
231  cfg_fn = GNUNET_strdup (pd->user_config_file);
232  }
233  else
234  cfg_fn = NULL;
235  lpfx = GNUNET_strdup (binaryName);
236  if (NULL != (spc = strstr (lpfx, " ")))
237  *spc = '\0';
238  iret = GNUNET_GETOPT_run (binaryName,
239  allopts,
240  (unsigned int) argc,
241  argv);
242  if ((GNUNET_OK > iret) ||
243  (GNUNET_OK != GNUNET_log_setup (lpfx,
244  loglev,
245  logfile)))
246  {
247  GNUNET_free (allopts);
248  GNUNET_free (lpfx);
249  ret = (enum GNUNET_GenericReturnValue) iret;
250  goto cleanup;
251  }
252  if (NULL != cc.cfgfile)
253  {
254  if ((GNUNET_YES != GNUNET_DISK_file_test (cc.cfgfile)) ||
255  (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cc.cfgfile)))
256  {
258  _ (
259  "Unreadable or malformed configuration file `%s', exit ...\n"),
260  cc.cfgfile);
261  ret = GNUNET_SYSERR;
262  GNUNET_free (allopts);
263  GNUNET_free (lpfx);
264  goto cleanup;
265  }
266  }
267  else
268  {
269  if ((NULL != cfg_fn) && (GNUNET_YES == GNUNET_DISK_file_test (cfg_fn)))
270  {
271  if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cfg_fn))
272  {
273  GNUNET_log (
275  _ (
276  "Unreadable or malformed default configuration file `%s', exit ...\n"),
277  cfg_fn);
278  ret = GNUNET_SYSERR;
279  GNUNET_free (allopts);
280  GNUNET_free (lpfx);
281  goto cleanup;
282  }
283  }
284  else if (NULL != cfg_fn)
285  {
286  GNUNET_free (cfg_fn);
287  cfg_fn = NULL;
288  if (GNUNET_OK != GNUNET_CONFIGURATION_load (cfg, NULL))
289  {
291  _ ("Unreadable or malformed configuration, exit ...\n"));
292  ret = GNUNET_SYSERR;
293  GNUNET_free (allopts);
294  GNUNET_free (lpfx);
295  goto cleanup;
296  }
297  }
298  }
299  GNUNET_free (allopts);
300  GNUNET_free (lpfx);
301  if ((GNUNET_OK ==
303  "testing",
304  "skew_offset",
305  &skew_offset)) &&
306  (GNUNET_OK ==
308  "testing",
309  "skew_variance",
310  &skew_variance)))
311  {
312  clock_offset = skew_offset - skew_variance;
313  GNUNET_TIME_set_offset (clock_offset);
314  }
315  /* ARM needs to know which configuration file to use when starting
316  services. If we got a command-line option *and* if nothing is
317  specified in the configuration, remember the command-line option
318  in "cfg". This is typically really only having an effect if we
319  are running code in src/arm/, as obviously the rest of the code
320  has little business with ARM-specific options. */
321  if (GNUNET_YES !=
323  "arm",
324  "CONFIG"))
325  {
326  if (NULL != cc.cfgfile)
328  "arm",
329  "CONFIG",
330  cc.cfgfile);
331  else if (NULL != cfg_fn)
333  "arm",
334  "CONFIG",
335  cfg_fn);
336  }
337 
338  /* run */
339  cc.args = &argv[iret];
340  if ((NULL == cc.cfgfile) && (NULL != cfg_fn))
341  cc.cfgfile = GNUNET_strdup (cfg_fn);
342  if (GNUNET_NO == run_without_scheduler)
343  {
345  }
346  else
347  {
348  GNUNET_RESOLVER_connect (cc.cfg);
349  cc.task (cc.task_cls, cc.args, cc.cfgfile, cc.cfg);
350  }
351  ret = GNUNET_OK;
352 cleanup:
354  GNUNET_free (cc.cfgfile);
355  GNUNET_free (cfg_fn);
356  GNUNET_free (loglev);
357  GNUNET_free (logfile);
358  return ret;
359 }
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.
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.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_load(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Load configuration.
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
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.
GNUNET_GenericReturnValue
Named constants for return values.
Definition: gnunet_common.h:83
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:48
#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)
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
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:165
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:883
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.
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
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:437
#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()

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

References GNUNET_NO, and GNUNET_PROGRAM_run2().

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

370 {
371  return GNUNET_PROGRAM_run2 (argc,
372  argv,
373  binaryName,
374  binaryHelp,
375  options,
376  task,
377  task_cls,
378  GNUNET_NO);
379 }
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).
Definition: program.c:126
Here is the call graph for this function:
Here is the caller graph for this function: