GNUnet  0.10.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, CommandContext::cfg, CommandContext::cfgfile, cleanup(), cmd_sorter(), config_file, DIR_SEPARATOR_STR, getenv(), 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_free_non_null, 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, and textdomain.

Referenced by GNUNET_PROGRAM_run(), and main().

149 {
150  struct CommandContext cc;
151 #if ENABLE_NLS
152  char *path;
153 #endif
154  char *loglev;
155  char *logfile;
156  char *cfg_fn;
157  const char *xdg;
158  int ret;
159  unsigned int cnt;
160  unsigned long long skew_offset;
161  unsigned long long skew_variance;
162  long long clock_offset;
164  struct GNUNET_GETOPT_CommandLineOption defoptions[] =
165  {GNUNET_GETOPT_option_cfgfile (&cc.cfgfile),
166  GNUNET_GETOPT_option_help (binaryHelp),
168  GNUNET_GETOPT_option_logfile (&logfile),
169  GNUNET_GETOPT_option_version (PACKAGE_VERSION " " VCS_VERSION)};
170  struct GNUNET_GETOPT_CommandLineOption *allopts;
171  const char *gargs;
172  char *lpfx;
173  char *spc;
174 
175  logfile = NULL;
176  gargs = getenv ("GNUNET_ARGS");
177  if (NULL != gargs)
178  {
179  char **gargv;
180  unsigned int gargc;
181  char *cargs;
182 
183  gargv = NULL;
184  gargc = 0;
185  for (int i = 0; i < argc; i++)
186  GNUNET_array_append (gargv, gargc, GNUNET_strdup (argv[i]));
187  cargs = GNUNET_strdup (gargs);
188  for (char *tok = strtok (cargs, " "); NULL != tok; tok = strtok (NULL, " "))
189  GNUNET_array_append (gargv, gargc, GNUNET_strdup (tok));
190  GNUNET_free (cargs);
191  GNUNET_array_append (gargv, gargc, NULL);
192  argv = (char *const *) gargv;
193  argc = gargc - 1;
194  }
195  memset (&cc, 0, sizeof (cc));
196  loglev = NULL;
197  cc.task = task;
198  cc.task_cls = task_cls;
199  cc.cfg = cfg = GNUNET_CONFIGURATION_create ();
200  /* prepare */
201 #if ENABLE_NLS
202  setlocale (LC_ALL, "");
204  if (NULL != path)
205  {
206  BINDTEXTDOMAIN ("GNUnet", path);
207  GNUNET_free (path);
208  }
209  textdomain ("GNUnet");
210 #endif
211  cnt = 0;
212  while (NULL != options[cnt].name)
213  cnt++;
214  allopts =
215  GNUNET_malloc ((cnt + 1) * sizeof (struct GNUNET_GETOPT_CommandLineOption) +
216  sizeof (defoptions));
217  GNUNET_memcpy (allopts, defoptions, sizeof (defoptions));
218  GNUNET_memcpy (&allopts[sizeof (defoptions) /
219  sizeof (struct GNUNET_GETOPT_CommandLineOption)],
220  options,
221  (cnt + 1) * sizeof (struct GNUNET_GETOPT_CommandLineOption));
222  cnt += sizeof (defoptions) / sizeof (struct GNUNET_GETOPT_CommandLineOption);
223  qsort (allopts,
224  cnt,
225  sizeof (struct GNUNET_GETOPT_CommandLineOption),
226  &cmd_sorter);
227  loglev = NULL;
228  xdg = getenv ("XDG_CONFIG_HOME");
229  if (NULL != xdg)
230  GNUNET_asprintf (&cfg_fn,
231  "%s%s%s",
232  xdg,
235  else
236  cfg_fn = GNUNET_strdup (GNUNET_OS_project_data_get ()->user_config_file);
237  lpfx = GNUNET_strdup (binaryName);
238  if (NULL != (spc = strstr (lpfx, " ")))
239  *spc = '\0';
240  ret = GNUNET_GETOPT_run (binaryName, allopts, (unsigned int) argc, argv);
241  if ((GNUNET_OK > ret) ||
242  (GNUNET_OK != GNUNET_log_setup (lpfx, loglev, logfile)))
243  {
244  GNUNET_free (allopts);
245  GNUNET_free (lpfx);
246  goto cleanup;
247  }
248  if (NULL != cc.cfgfile)
249  {
250  if ((GNUNET_YES != GNUNET_DISK_file_test (cc.cfgfile)) ||
251  (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cc.cfgfile)))
252  {
254  _ (
255  "Unreadable or malformed configuration file `%s', exit ...\n"),
256  cc.cfgfile);
257  ret = GNUNET_SYSERR;
258  GNUNET_free (allopts);
259  GNUNET_free (lpfx);
260  goto cleanup;
261  }
262  }
263  else
264  {
265  if (GNUNET_YES == GNUNET_DISK_file_test (cfg_fn))
266  {
267  if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cfg_fn))
268  {
269  GNUNET_log (
271  _ (
272  "Unreadable or malformed default configuration file `%s', exit ...\n"),
273  cfg_fn);
274  ret = GNUNET_SYSERR;
275  GNUNET_free (allopts);
276  GNUNET_free (lpfx);
277  goto cleanup;
278  }
279  }
280  else
281  {
282  GNUNET_free (cfg_fn);
283  cfg_fn = NULL;
284  if (GNUNET_OK != GNUNET_CONFIGURATION_load (cfg, NULL))
285  {
287  _ ("Unreadable or malformed configuration, exit ...\n"));
288  ret = GNUNET_SYSERR;
289  GNUNET_free (allopts);
290  GNUNET_free (lpfx);
291  goto cleanup;
292  }
293  }
294  }
295  GNUNET_free (allopts);
296  GNUNET_free (lpfx);
298  "testing",
299  "skew_offset",
300  &skew_offset) &&
302  "testing",
303  "skew_variance",
304  &skew_variance)))
305  {
306  clock_offset = skew_offset - skew_variance;
307  GNUNET_TIME_set_offset (clock_offset);
308  }
309  /* ARM needs to know which configuration file to use when starting
310  services. If we got a command-line option *and* if nothing is
311  specified in the configuration, remember the command-line option
312  in "cfg". This is typically really only having an effect if we
313  are running code in src/arm/, as obviously the rest of the code
314  has little business with ARM-specific options. */
315  if (GNUNET_YES != GNUNET_CONFIGURATION_have_value (cfg, "arm", "CONFIG"))
316  {
317  if (NULL != cc.cfgfile)
318  GNUNET_CONFIGURATION_set_value_string (cfg, "arm", "CONFIG", cc.cfgfile);
319  else if (NULL != cfg_fn)
320  GNUNET_CONFIGURATION_set_value_string (cfg, "arm", "CONFIG", cfg_fn);
321  }
322 
323  /* run */
324  cc.args = &argv[ret];
325  if ((NULL == cc.cfgfile) && (NULL != cfg_fn))
326  cc.cfgfile = GNUNET_strdup (cfg_fn);
327  if (GNUNET_NO == run_without_scheduler)
328  {
330  }
331  else
332  {
333  GNUNET_RESOLVER_connect (cc.cfg);
334  cc.task (cc.task_cls, cc.args, cc.cfgfile, cc.cfg);
335  }
336  ret = GNUNET_OK;
337 cleanup:
339  GNUNET_free_non_null (cc.cfgfile);
340  GNUNET_free_non_null (cfg_fn);
341  GNUNET_free_non_null (loglev);
342  GNUNET_free_non_null (logfile);
343  return ret;
344 }
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:669
Return the directory where translations are installed (share/locale/)
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.
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
static char * config_file
Set to the name of the config file used.
Definition: gnunet-arm.c:79
void GNUNET_SCHEDULER_run(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Initialize and run scheduler.
Definition: scheduler.c:716
#define GNUNET_NO
Definition: gnunet_common.h:81
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_free_non_null(ptr)
Free the memory pointed to by ptr if ptr is not NULL.
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
static int ret
Final status code.
Definition: gnunet-arm.c:89
#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:208
#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)
int GNUNET_asprintf(char **buf, const char *format,...)
Like asprintf, just portable.
#define GNUNET_memcpy(dst, src, n)
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
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.
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:104
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:893
#define GNUNET_SYSERR
Definition: gnunet_common.h:79
const char * name
char * getenv()
struct GNUNET_GETOPT_CommandLineOption GNUNET_GETOPT_option_cfgfile(char **fn)
Allow user to specify configuration file name (-c option)
#define GNUNET_array_append(arr, size, element)
Append an element to a list (growing the list by one).
configuration data
Definition: configuration.c:85
#define GNUNET_log(kind,...)
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_get(void)
#define GNUNET_YES
Definition: gnunet_common.h:80
#define DIR_SEPARATOR_STR
Definition: plibc.h:632
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:254
#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 361 of file program.c.

References GNUNET_NO, and GNUNET_PROGRAM_run2().

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

368 {
369  return GNUNET_PROGRAM_run2 (argc,
370  argv,
371  binaryName,
372  binaryHelp,
373  options,
374  task,
375  task_cls,
376  GNUNET_NO);
377 }
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
#define GNUNET_NO
Definition: gnunet_common.h:81
Here is the call graph for this function:
Here is the caller graph for this function: