loprefix,
quotedbinary,
"-d", /* do daemonize */
- lopostfix, NULL);
+ lopostfix,
+ NULL);
else
proc = GNUNET_OS_start_process_s (GNUNET_NO,
std_inheritance,
{
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
"Will attempt to remove configuration file %s and service directory %s\n",
- config_file, dir);
-
+ config_file,
+ dir);
if (0 != UNLINK (config_file))
{
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
_("Failed to remove servicehome directory %s\n"),
dir);
-
}
}
static void
run (void *cls,
char *const *args,
- const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *c)
{
char *armconfig;
cfg = GNUNET_CONFIGURATION_dup (c);
- config_file = cfgfile;
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg,
"PATHS",
"GNUNET_HOME");
return;
}
- if (NULL != cfgfile)
- {
- if (GNUNET_OK !=
- GNUNET_CONFIGURATION_get_value_filename (cfg,
- "arm",
- "CONFIG",
- &armconfig))
- {
- GNUNET_CONFIGURATION_set_value_string (cfg,
- "arm",
- "CONFIG",
- cfgfile);
- }
- else
- GNUNET_free (armconfig);
- }
+ (void) GNUNET_CONFIGURATION_get_value_filename (cfg,
+ "arm",
+ "CONFIG",
+ &config_file);
if (NULL == (h = GNUNET_ARM_connect (cfg,
&conn_status,
NULL)))
return;
if (monitor)
m = GNUNET_ARM_monitor_start (cfg,
- &srv_status,
- NULL);
+ &srv_status,
+ NULL);
al_task = GNUNET_SCHEDULER_add_now (&action_loop,
NULL);
GNUNET_SCHEDULER_add_shutdown (&shutdown_task,
* @return 0 ok, 1 on error, 2 on timeout
*/
int
-main (int argc, char *const *argv)
+main (int argc,
+ char *const *argv)
{
struct GNUNET_GETOPT_CommandLineOption options[] = {
-
GNUNET_GETOPT_option_flag ('e',
- "end",
- gettext_noop ("stop all GNUnet services"),
- &end),
-
+ "end",
+ gettext_noop ("stop all GNUnet services"),
+ &end),
GNUNET_GETOPT_option_string ('i',
"init",
"SERVICE",
gettext_noop ("start a particular service"),
&init),
-
GNUNET_GETOPT_option_string ('k',
"kill",
"SERVICE",
gettext_noop ("stop a particular service"),
&term),
-
GNUNET_GETOPT_option_flag ('s',
- "start",
- gettext_noop ("start all GNUnet default services"),
- &start),
-
+ "start",
+ gettext_noop ("start all GNUnet default services"),
+ &start),
GNUNET_GETOPT_option_flag ('r',
- "restart",
- gettext_noop ("stop and start all GNUnet default services"),
- &restart),
+ "restart",
+ gettext_noop ("stop and start all GNUnet default services"),
+ &restart),
GNUNET_GETOPT_option_flag ('d',
- "delete",
- gettext_noop ("delete config file and directory on exit"),
- &delete),
-
+ "delete",
+ gettext_noop ("delete config file and directory on exit"),
+ &delete),
GNUNET_GETOPT_option_flag ('m',
- "monitor",
- gettext_noop ("monitor ARM activities"),
- &monitor),
-
+ "monitor",
+ gettext_noop ("monitor ARM activities"),
+ &monitor),
GNUNET_GETOPT_option_flag ('q',
- "quiet",
- gettext_noop ("don't print status messages"),
- &quiet),
-
+ "quiet",
+ gettext_noop ("don't print status messages"),
+ &quiet),
GNUNET_GETOPT_option_relative_time ('T',
- "timeout",
- "DELAY",
- gettext_noop ("exit with error status if operation does not finish after DELAY"),
- &timeout),
-
+ "timeout",
+ "DELAY",
+ gettext_noop ("exit with error status if operation does not finish after DELAY"),
+ &timeout),
GNUNET_GETOPT_option_flag ('I',
- "info",
- gettext_noop ("list currently running services"),
- &list),
-
+ "info",
+ gettext_noop ("list currently running services"),
+ &list),
GNUNET_GETOPT_option_flag ('O',
- "no-stdout",
- gettext_noop ("don't let gnunet-service-arm inherit standard output"),
- &no_stdout),
-
+ "no-stdout",
+ gettext_noop ("don't let gnunet-service-arm inherit standard output"),
+ &no_stdout),
GNUNET_GETOPT_option_flag ('E',
- "no-stderr",
- gettext_noop ("don't let gnunet-service-arm inherit standard error"),
- &no_stderr),
-
+ "no-stderr",
+ gettext_noop ("don't let gnunet-service-arm inherit standard error"),
+ &no_stderr),
GNUNET_GETOPT_OPTION_END
};
- if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv,
- &argc, &argv))
+ if (GNUNET_OK !=
+ GNUNET_STRINGS_get_utf8_args (argc, argv,
+ &argc, &argv))
return 2;
if (GNUNET_OK ==
- GNUNET_PROGRAM_run (argc, argv, "gnunet-arm",
+ GNUNET_PROGRAM_run (argc,
+ argv,
+ "gnunet-arm",
gettext_noop
("Control services and the Automated Restart Manager (ARM)"),
- options, &run, NULL))
+ options,
+ &run, NULL))
{
GNUNET_free ((void *) argv);
return ret;
{
struct GNUNET_CONFIGURATION_Handle *out = NULL;
struct GNUNET_CONFIGURATION_Handle *diff = NULL;
+ char *cfg_fn;
(void) cls;
(void) args;
option,
value);
}
+ cfg_fn = NULL;
+ if (NULL == cfgfile)
+ {
+ const char *xdg = getenv ("XDG_CONFIG_HOME");
+ if (NULL != xdg)
+ GNUNET_asprintf (&cfg_fn,
+ "%s%s%s",
+ xdg,
+ DIR_SEPARATOR_STR,
+ GNUNET_OS_project_data_get ()->config_file);
+ else
+ cfg_fn = GNUNET_strdup (GNUNET_OS_project_data_get ()->user_config_file);
+ cfgfile = cfg_fn;
+ }
if ( (NULL != diff) || (NULL != out) )
{
if (GNUNET_OK !=
cfgfile))
ret = 2;
}
+ GNUNET_free_non_null (cfg_fn);
if (NULL != out)
GNUNET_CONFIGURATION_destroy (out);
cleanup:
struct CommandContext *cc = cls;
GNUNET_SPEEDUP_start_(cc->cfg);
- GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
+ GNUNET_SCHEDULER_add_shutdown (&shutdown_task,
+ NULL);
GNUNET_RESOLVER_connect (cc->cfg);
- cc->task (cc->task_cls, cc->args, cc->cfgfile, cc->cfg);
+ cc->task (cc->task_cls,
+ cc->args,
+ cc->cfgfile,
+ cc->cfg);
}
* @param a2 second command line option
*/
static int
-cmd_sorter (const void *a1, const void *a2)
+cmd_sorter (const void *a1,
+ const void *a2)
{
const struct GNUNET_GETOPT_CommandLineOption *c1 = a1;
const struct GNUNET_GETOPT_CommandLineOption *c2 = a2;
GNUNET_free (lpfx);
goto cleanup;
}
- if (NULL == cc.cfgfile)
- cc.cfgfile = GNUNET_strdup (cfg_fn);
- if (GNUNET_YES ==
- GNUNET_DISK_file_test (cc.cfgfile))
+ if (NULL != cc.cfgfile)
{
- if (GNUNET_SYSERR ==
- GNUNET_CONFIGURATION_load (cfg,
- cc.cfgfile))
+ if ( (GNUNET_YES !=
+ GNUNET_DISK_file_test (cc.cfgfile)) ||
+ (GNUNET_SYSERR ==
+ GNUNET_CONFIGURATION_load (cfg,
+ cc.cfgfile)) )
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _("Malformed configuration file `%s', exit ...\n"),
- cc.cfgfile);
+ _("Unreadable or malformed configuration file `%s', exit ...\n"),
+ cc.cfgfile);
ret = GNUNET_SYSERR;
GNUNET_free (allopts);
GNUNET_free (lpfx);
}
else
{
- if (0 != strcmp (cc.cfgfile,
- cfg_fn))
+ if (GNUNET_YES ==
+ GNUNET_DISK_file_test (cfg_fn))
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _("Could not access configuration file `%s'\n"),
- cc.cfgfile);
- ret = GNUNET_SYSERR;
- GNUNET_free (allopts);
- GNUNET_free (lpfx);
- goto cleanup;
+ if (GNUNET_SYSERR ==
+ GNUNET_CONFIGURATION_load (cfg,
+ cfg_fn))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Unreadable or malformed default configuration file `%s', exit ...\n"),
+ cfg_fn);
+ ret = GNUNET_SYSERR;
+ GNUNET_free (allopts);
+ GNUNET_free (lpfx);
+ goto cleanup;
+ }
+ }
+ else
+ {
+ GNUNET_free (cfg_fn);
+ cfg_fn = NULL;
+ if (GNUNET_OK !=
+ GNUNET_CONFIGURATION_load (cfg,
+ NULL))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Unreadable or malformed configuration, exit ...\n"));
+ ret = GNUNET_SYSERR;
+ GNUNET_free (allopts);
+ GNUNET_free (lpfx);
+ goto cleanup;
+ }
}
}
GNUNET_free (allopts);
has little business with ARM-specific options. */
if (GNUNET_YES !=
GNUNET_CONFIGURATION_have_value (cfg,
- "arm",
- "CONFIG"))
+ "arm",
+ "CONFIG"))
{
- GNUNET_CONFIGURATION_set_value_string (cfg,
- "arm",
- "CONFIG",
- cc.cfgfile);
+ if (NULL != cc.cfgfile)
+ GNUNET_CONFIGURATION_set_value_string (cfg,
+ "arm",
+ "CONFIG",
+ cc.cfgfile);
+ else if (NULL != cfg_fn)
+ GNUNET_CONFIGURATION_set_value_string (cfg,
+ "arm",
+ "CONFIG",
+ cfg_fn);
}
/* run */
cc.args = &argv[ret];
+ if ( (NULL == cc.cfgfile) &&
+ (NULL != cfg_fn) )
+ cc.cfgfile = GNUNET_strdup (cfg_fn);
if (GNUNET_NO == run_without_scheduler)
{
- GNUNET_SCHEDULER_run (&program_main, &cc);
+ GNUNET_SCHEDULER_run (&program_main,
+ &cc);
}
else
{
cleanup:
GNUNET_CONFIGURATION_destroy (cfg);
GNUNET_free_non_null (cc.cfgfile);
- GNUNET_free (cfg_fn);
+ GNUNET_free_non_null (cfg_fn);
GNUNET_free_non_null (loglev);
GNUNET_free_non_null (logfile);
return ret;
struct GNUNET_MessageHeader *res;
size_t slen;
+ (void) msg;
slen = strlen (GNUNET_AGPL_URL) + 1;
env = GNUNET_MQ_msg_extra (res,
GNUNET_MESSAGE_TYPE_RESPONSE_AGPL,
GNUNET_break (0);
goto shutdown;
}
- if (NULL == opt_cfg_filename)
- opt_cfg_filename = GNUNET_strdup (cfg_filename);
- if (GNUNET_YES == GNUNET_DISK_file_test (opt_cfg_filename))
+ if (NULL != opt_cfg_filename)
{
- if (GNUNET_SYSERR ==
- GNUNET_CONFIGURATION_load (cfg,
- opt_cfg_filename))
+ if ( (GNUNET_YES !=
+ GNUNET_DISK_file_test (opt_cfg_filename)) ||
+ (GNUNET_SYSERR ==
+ GNUNET_CONFIGURATION_load (cfg,
+ opt_cfg_filename)) )
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _("Malformed configuration file `%s', exit ...\n"),
- opt_cfg_filename);
+ _("Malformed configuration file `%s', exit ...\n"),
+ opt_cfg_filename);
goto shutdown;
}
}
else
{
- if (GNUNET_SYSERR ==
- GNUNET_CONFIGURATION_load (cfg,
- NULL))
+ if (GNUNET_YES ==
+ GNUNET_DISK_file_test (cfg_filename))
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _("Malformed configuration, exit ...\n"));
- goto shutdown;
+ if (GNUNET_SYSERR ==
+ GNUNET_CONFIGURATION_load (cfg,
+ cfg_filename))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Malformed configuration file `%s', exit ...\n"),
+ cfg_filename);
+ goto shutdown;
+ }
}
- if (0 != strcmp (opt_cfg_filename,
- cfg_filename))
+ else
{
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _("Could not access configuration file `%s'\n"),
- opt_cfg_filename);
- goto shutdown;
+ if (GNUNET_SYSERR ==
+ GNUNET_CONFIGURATION_load (cfg,
+ NULL))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _("Malformed configuration, exit ...\n"));
+ goto shutdown;
+ }
}
}
if (GNUNET_OK != setup_service (&sh))
LOG (GNUNET_ERROR_TYPE_DEBUG,
"Service `%s' runs with configuration from `%s'\n",
service_name,
- opt_cfg_filename);
+ (NULL != opt_cfg_filename) ? opt_cfg_filename : cfg_filename);
if ((GNUNET_OK ==
GNUNET_CONFIGURATION_get_value_number (sh.cfg,
"TESTING",