summaryrefslogtreecommitdiff
path: root/src/util/program.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/program.c')
-rw-r--r--src/util/program.c349
1 files changed, 175 insertions, 174 deletions
diff --git a/src/util/program.c b/src/util/program.c
index 9bd3d64f9..630ec6205 100644
--- a/src/util/program.c
+++ b/src/util/program.c
@@ -31,15 +31,16 @@
31#include "speedup.h" 31#include "speedup.h"
32#include <gcrypt.h> 32#include <gcrypt.h>
33 33
34#define LOG(kind, ...) GNUNET_log_from(kind, "util-program", __VA_ARGS__) 34#define LOG(kind, ...) GNUNET_log_from (kind, "util-program", __VA_ARGS__)
35 35
36#define LOG_STRERROR_FILE(kind, syscall, filename) \ 36#define LOG_STRERROR_FILE(kind, syscall, filename) \
37 GNUNET_log_from_strerror_file(kind, "util-program", syscall, filename) 37 GNUNET_log_from_strerror_file (kind, "util-program", syscall, filename)
38 38
39/** 39/**
40 * Context for the command. 40 * Context for the command.
41 */ 41 */
42struct CommandContext { 42struct CommandContext
43{
43 /** 44 /**
44 * Argv argument. 45 * Argv argument.
45 */ 46 */
@@ -71,10 +72,10 @@ struct CommandContext {
71 * task run when the scheduler shuts down 72 * task run when the scheduler shuts down
72 */ 73 */
73static void 74static void
74shutdown_task(void *cls) 75shutdown_task (void *cls)
75{ 76{
76 (void)cls; 77 (void) cls;
77 GNUNET_SPEEDUP_stop_(); 78 GNUNET_SPEEDUP_stop_ ();
78} 79}
79 80
80 81
@@ -83,14 +84,14 @@ shutdown_task(void *cls)
83 * program. Runs the program-specific main task. 84 * program. Runs the program-specific main task.
84 */ 85 */
85static void 86static void
86program_main(void *cls) 87program_main (void *cls)
87{ 88{
88 struct CommandContext *cc = cls; 89 struct CommandContext *cc = cls;
89 90
90 GNUNET_SPEEDUP_start_(cc->cfg); 91 GNUNET_SPEEDUP_start_ (cc->cfg);
91 GNUNET_SCHEDULER_add_shutdown(&shutdown_task, NULL); 92 GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
92 GNUNET_RESOLVER_connect(cc->cfg); 93 GNUNET_RESOLVER_connect (cc->cfg);
93 cc->task(cc->task_cls, cc->args, cc->cfgfile, cc->cfg); 94 cc->task (cc->task_cls, cc->args, cc->cfgfile, cc->cfg);
94} 95}
95 96
96 97
@@ -102,16 +103,16 @@ program_main(void *cls)
102 * @param a2 second command line option 103 * @param a2 second command line option
103 */ 104 */
104static int 105static int
105cmd_sorter(const void *a1, const void *a2) 106cmd_sorter (const void *a1, const void *a2)
106{ 107{
107 const struct GNUNET_GETOPT_CommandLineOption *c1 = a1; 108 const struct GNUNET_GETOPT_CommandLineOption *c1 = a1;
108 const struct GNUNET_GETOPT_CommandLineOption *c2 = a2; 109 const struct GNUNET_GETOPT_CommandLineOption *c2 = a2;
109 110
110 if (toupper((unsigned char)c1->shortName) > 111 if (toupper ((unsigned char) c1->shortName) >
111 toupper((unsigned char)c2->shortName)) 112 toupper ((unsigned char) c2->shortName))
112 return 1; 113 return 1;
113 if (toupper((unsigned char)c1->shortName) < 114 if (toupper ((unsigned char) c1->shortName) <
114 toupper((unsigned char)c2->shortName)) 115 toupper ((unsigned char) c2->shortName))
115 return -1; 116 return -1;
116 if (c1->shortName > c2->shortName) 117 if (c1->shortName > c2->shortName)
117 return 1; 118 return 1;
@@ -137,14 +138,14 @@ cmd_sorter(const void *a1, const void *a2)
137 * @return #GNUNET_SYSERR on error, #GNUNET_OK on success 138 * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
138 */ 139 */
139int 140int
140GNUNET_PROGRAM_run2(int argc, 141GNUNET_PROGRAM_run2 (int argc,
141 char *const *argv, 142 char *const *argv,
142 const char *binaryName, 143 const char *binaryName,
143 const char *binaryHelp, 144 const char *binaryHelp,
144 const struct GNUNET_GETOPT_CommandLineOption *options, 145 const struct GNUNET_GETOPT_CommandLineOption *options,
145 GNUNET_PROGRAM_Main task, 146 GNUNET_PROGRAM_Main task,
146 void *task_cls, 147 void *task_cls,
147 int run_without_scheduler) 148 int run_without_scheduler)
148{ 149{
149 struct CommandContext cc; 150 struct CommandContext cc;
150 151
@@ -161,191 +162,191 @@ GNUNET_PROGRAM_run2(int argc,
161 unsigned long long skew_variance; 162 unsigned long long skew_variance;
162 long long clock_offset; 163 long long clock_offset;
163 struct GNUNET_CONFIGURATION_Handle *cfg; 164 struct GNUNET_CONFIGURATION_Handle *cfg;
164 const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get(); 165 const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get ();
165 struct GNUNET_GETOPT_CommandLineOption defoptions[] = 166 struct GNUNET_GETOPT_CommandLineOption defoptions[] =
166 { GNUNET_GETOPT_option_cfgfile(&cc.cfgfile), 167 { GNUNET_GETOPT_option_cfgfile (&cc.cfgfile),
167 GNUNET_GETOPT_option_help(binaryHelp), 168 GNUNET_GETOPT_option_help (binaryHelp),
168 GNUNET_GETOPT_option_loglevel(&loglev), 169 GNUNET_GETOPT_option_loglevel (&loglev),
169 GNUNET_GETOPT_option_logfile(&logfile), 170 GNUNET_GETOPT_option_logfile (&logfile),
170 GNUNET_GETOPT_option_version(pd->version) }; 171 GNUNET_GETOPT_option_version (pd->version) };
171 struct GNUNET_GETOPT_CommandLineOption *allopts; 172 struct GNUNET_GETOPT_CommandLineOption *allopts;
172 const char *gargs; 173 const char *gargs;
173 char *lpfx; 174 char *lpfx;
174 char *spc; 175 char *spc;
175 176
176 logfile = NULL; 177 logfile = NULL;
177 gargs = getenv("GNUNET_ARGS"); 178 gargs = getenv ("GNUNET_ARGS");
178 if (NULL != gargs) 179 if (NULL != gargs)
179 { 180 {
180 char **gargv; 181 char **gargv;
181 unsigned int gargc; 182 unsigned int gargc;
182 char *cargs; 183 char *cargs;
183 184
184 gargv = NULL; 185 gargv = NULL;
185 gargc = 0; 186 gargc = 0;
186 for (int i = 0; i < argc; i++) 187 for (int i = 0; i < argc; i++)
187 GNUNET_array_append(gargv, gargc, GNUNET_strdup(argv[i])); 188 GNUNET_array_append (gargv, gargc, GNUNET_strdup (argv[i]));
188 cargs = GNUNET_strdup(gargs); 189 cargs = GNUNET_strdup (gargs);
189 for (char *tok = strtok(cargs, " "); NULL != tok; tok = strtok(NULL, " ")) 190 for (char *tok = strtok (cargs, " "); NULL != tok; tok = strtok (NULL, " "))
190 GNUNET_array_append(gargv, gargc, GNUNET_strdup(tok)); 191 GNUNET_array_append (gargv, gargc, GNUNET_strdup (tok));
191 GNUNET_free(cargs); 192 GNUNET_free (cargs);
192 GNUNET_array_append(gargv, gargc, NULL); 193 GNUNET_array_append (gargv, gargc, NULL);
193 argv = (char *const *)gargv; 194 argv = (char *const *) gargv;
194 argc = gargc - 1; 195 argc = gargc - 1;
195 } 196 }
196 memset(&cc, 0, sizeof(cc)); 197 memset (&cc, 0, sizeof(cc));
197 loglev = NULL; 198 loglev = NULL;
198 cc.task = task; 199 cc.task = task;
199 cc.task_cls = task_cls; 200 cc.task_cls = task_cls;
200 cc.cfg = cfg = GNUNET_CONFIGURATION_create(); 201 cc.cfg = cfg = GNUNET_CONFIGURATION_create ();
201 /* prepare */ 202 /* prepare */
202#if ENABLE_NLS 203#if ENABLE_NLS
203 if (NULL != pd->gettext_domain) 204 if (NULL != pd->gettext_domain)
205 {
206 setlocale (LC_ALL, "");
207 path = (NULL == pd->gettext_path)
208 ? GNUNET_OS_installation_get_path (GNUNET_OS_IPK_LOCALEDIR)
209 : GNUNET_strdup (pd->gettext_path);
210 if (NULL != path)
204 { 211 {
205 setlocale(LC_ALL, ""); 212 bindtextdomain (pd->gettext_domain, path);
206 path = (NULL == pd->gettext_path) 213 GNUNET_free (path);
207 ? GNUNET_OS_installation_get_path(GNUNET_OS_IPK_LOCALEDIR)
208 : GNUNET_strdup(pd->gettext_path);
209 if (NULL != path)
210 {
211 bindtextdomain(pd->gettext_domain, path);
212 GNUNET_free(path);
213 }
214 textdomain(pd->gettext_domain);
215 } 214 }
215 textdomain (pd->gettext_domain);
216 }
216#endif 217#endif
217 cnt = 0; 218 cnt = 0;
218 while (NULL != options[cnt].name) 219 while (NULL != options[cnt].name)
219 cnt++; 220 cnt++;
220 allopts = 221 allopts =
221 GNUNET_malloc((cnt + 1) * sizeof(struct GNUNET_GETOPT_CommandLineOption) + 222 GNUNET_malloc ((cnt + 1) * sizeof(struct GNUNET_GETOPT_CommandLineOption)
222 sizeof(defoptions)); 223 + sizeof(defoptions));
223 GNUNET_memcpy(allopts, defoptions, sizeof(defoptions)); 224 GNUNET_memcpy (allopts, defoptions, sizeof(defoptions));
224 GNUNET_memcpy(&allopts[sizeof(defoptions) / 225 GNUNET_memcpy (&allopts[sizeof(defoptions)
225 sizeof(struct GNUNET_GETOPT_CommandLineOption)], 226 / sizeof(struct GNUNET_GETOPT_CommandLineOption)],
226 options, 227 options,
227 (cnt + 1) * sizeof(struct GNUNET_GETOPT_CommandLineOption)); 228 (cnt + 1) * sizeof(struct GNUNET_GETOPT_CommandLineOption));
228 cnt += sizeof(defoptions) / sizeof(struct GNUNET_GETOPT_CommandLineOption); 229 cnt += sizeof(defoptions) / sizeof(struct GNUNET_GETOPT_CommandLineOption);
229 qsort(allopts, 230 qsort (allopts,
230 cnt, 231 cnt,
231 sizeof(struct GNUNET_GETOPT_CommandLineOption), 232 sizeof(struct GNUNET_GETOPT_CommandLineOption),
232 &cmd_sorter); 233 &cmd_sorter);
233 loglev = NULL; 234 loglev = NULL;
234 xdg = getenv("XDG_CONFIG_HOME"); 235 xdg = getenv ("XDG_CONFIG_HOME");
235 if (NULL != xdg) 236 if (NULL != xdg)
236 GNUNET_asprintf(&cfg_fn, 237 GNUNET_asprintf (&cfg_fn,
237 "%s%s%s", 238 "%s%s%s",
238 xdg, 239 xdg,
239 DIR_SEPARATOR_STR, 240 DIR_SEPARATOR_STR,
240 pd->config_file); 241 pd->config_file);
241 else 242 else
242 cfg_fn = GNUNET_strdup(pd->user_config_file); 243 cfg_fn = GNUNET_strdup (pd->user_config_file);
243 lpfx = GNUNET_strdup(binaryName); 244 lpfx = GNUNET_strdup (binaryName);
244 if (NULL != (spc = strstr(lpfx, " "))) 245 if (NULL != (spc = strstr (lpfx, " ")))
245 *spc = '\0'; 246 *spc = '\0';
246 ret = GNUNET_GETOPT_run(binaryName, allopts, (unsigned int)argc, argv); 247 ret = GNUNET_GETOPT_run (binaryName, allopts, (unsigned int) argc, argv);
247 if ((GNUNET_OK > ret) || 248 if ((GNUNET_OK > ret) ||
248 (GNUNET_OK != GNUNET_log_setup(lpfx, loglev, logfile))) 249 (GNUNET_OK != GNUNET_log_setup (lpfx, loglev, logfile)))
249 { 250 {
250 GNUNET_free(allopts); 251 GNUNET_free (allopts);
251 GNUNET_free(lpfx); 252 GNUNET_free (lpfx);
252 goto cleanup; 253 goto cleanup;
253 } 254 }
254 if (NULL != cc.cfgfile) 255 if (NULL != cc.cfgfile)
256 {
257 if ((GNUNET_YES != GNUNET_DISK_file_test (cc.cfgfile)) ||
258 (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cc.cfgfile)))
255 { 259 {
256 if ((GNUNET_YES != GNUNET_DISK_file_test(cc.cfgfile)) || 260 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
257 (GNUNET_SYSERR == GNUNET_CONFIGURATION_load(cfg, cc.cfgfile))) 261 _ (
258 { 262 "Unreadable or malformed configuration file `%s', exit ...\n"),
259 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, 263 cc.cfgfile);
260 _( 264 ret = GNUNET_SYSERR;
261 "Unreadable or malformed configuration file `%s', exit ...\n"), 265 GNUNET_free (allopts);
262 cc.cfgfile); 266 GNUNET_free (lpfx);
263 ret = GNUNET_SYSERR; 267 goto cleanup;
264 GNUNET_free(allopts);
265 GNUNET_free(lpfx);
266 goto cleanup;
267 }
268 } 268 }
269 }
269 else 270 else
271 {
272 if (GNUNET_YES == GNUNET_DISK_file_test (cfg_fn))
270 { 273 {
271 if (GNUNET_YES == GNUNET_DISK_file_test(cfg_fn)) 274 if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg, cfg_fn))
272 { 275 {
273 if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load(cfg, cfg_fn)) 276 GNUNET_log (
274 { 277 GNUNET_ERROR_TYPE_ERROR,
275 GNUNET_log( 278 _ (
276 GNUNET_ERROR_TYPE_ERROR, 279 "Unreadable or malformed default configuration file `%s', exit ...\n"),
277 _( 280 cfg_fn);
278 "Unreadable or malformed default configuration file `%s', exit ...\n"), 281 ret = GNUNET_SYSERR;
279 cfg_fn); 282 GNUNET_free (allopts);
280 ret = GNUNET_SYSERR; 283 GNUNET_free (lpfx);
281 GNUNET_free(allopts); 284 goto cleanup;
282 GNUNET_free(lpfx); 285 }
283 goto cleanup;
284 }
285 }
286 else
287 {
288 GNUNET_free(cfg_fn);
289 cfg_fn = NULL;
290 if (GNUNET_OK != GNUNET_CONFIGURATION_load(cfg, NULL))
291 {
292 GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
293 _("Unreadable or malformed configuration, exit ...\n"));
294 ret = GNUNET_SYSERR;
295 GNUNET_free(allopts);
296 GNUNET_free(lpfx);
297 goto cleanup;
298 }
299 }
300 } 286 }
301 GNUNET_free(allopts); 287 else
302 GNUNET_free(lpfx);
303 if (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cc.cfg,
304 "testing",
305 "skew_offset",
306 &skew_offset) &&
307 (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number(cc.cfg,
308 "testing",
309 "skew_variance",
310 &skew_variance)))
311 { 288 {
312 clock_offset = skew_offset - skew_variance; 289 GNUNET_free (cfg_fn);
313 GNUNET_TIME_set_offset(clock_offset); 290 cfg_fn = NULL;
291 if (GNUNET_OK != GNUNET_CONFIGURATION_load (cfg, NULL))
292 {
293 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
294 _ ("Unreadable or malformed configuration, exit ...\n"));
295 ret = GNUNET_SYSERR;
296 GNUNET_free (allopts);
297 GNUNET_free (lpfx);
298 goto cleanup;
299 }
314 } 300 }
301 }
302 GNUNET_free (allopts);
303 GNUNET_free (lpfx);
304 if ((GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (cc.cfg,
305 "testing",
306 "skew_offset",
307 &skew_offset)) &&
308 (GNUNET_OK == GNUNET_CONFIGURATION_get_value_number (cc.cfg,
309 "testing",
310 "skew_variance",
311 &skew_variance)))
312 {
313 clock_offset = skew_offset - skew_variance;
314 GNUNET_TIME_set_offset (clock_offset);
315 }
315 /* ARM needs to know which configuration file to use when starting 316 /* 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 services. If we got a command-line option *and* if nothing is
317 specified in the configuration, remember the command-line option 318 specified in the configuration, remember the command-line option
318 in "cfg". This is typically really only having an effect if we 319 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 are running code in src/arm/, as obviously the rest of the code
320 has little business with ARM-specific options. */ 321 has little business with ARM-specific options. */
321 if (GNUNET_YES != GNUNET_CONFIGURATION_have_value(cfg, "arm", "CONFIG")) 322 if (GNUNET_YES != GNUNET_CONFIGURATION_have_value (cfg, "arm", "CONFIG"))
322 { 323 {
323 if (NULL != cc.cfgfile) 324 if (NULL != cc.cfgfile)
324 GNUNET_CONFIGURATION_set_value_string(cfg, "arm", "CONFIG", cc.cfgfile); 325 GNUNET_CONFIGURATION_set_value_string (cfg, "arm", "CONFIG", cc.cfgfile);
325 else if (NULL != cfg_fn) 326 else if (NULL != cfg_fn)
326 GNUNET_CONFIGURATION_set_value_string(cfg, "arm", "CONFIG", cfg_fn); 327 GNUNET_CONFIGURATION_set_value_string (cfg, "arm", "CONFIG", cfg_fn);
327 } 328 }
328 329
329 /* run */ 330 /* run */
330 cc.args = &argv[ret]; 331 cc.args = &argv[ret];
331 if ((NULL == cc.cfgfile) && (NULL != cfg_fn)) 332 if ((NULL == cc.cfgfile) && (NULL != cfg_fn))
332 cc.cfgfile = GNUNET_strdup(cfg_fn); 333 cc.cfgfile = GNUNET_strdup (cfg_fn);
333 if (GNUNET_NO == run_without_scheduler) 334 if (GNUNET_NO == run_without_scheduler)
334 { 335 {
335 GNUNET_SCHEDULER_run(&program_main, &cc); 336 GNUNET_SCHEDULER_run (&program_main, &cc);
336 } 337 }
337 else 338 else
338 { 339 {
339 GNUNET_RESOLVER_connect(cc.cfg); 340 GNUNET_RESOLVER_connect (cc.cfg);
340 cc.task(cc.task_cls, cc.args, cc.cfgfile, cc.cfg); 341 cc.task (cc.task_cls, cc.args, cc.cfgfile, cc.cfg);
341 } 342 }
342 ret = GNUNET_OK; 343 ret = GNUNET_OK;
343cleanup: 344cleanup:
344 GNUNET_CONFIGURATION_destroy(cfg); 345 GNUNET_CONFIGURATION_destroy (cfg);
345 GNUNET_free_non_null(cc.cfgfile); 346 GNUNET_free_non_null (cc.cfgfile);
346 GNUNET_free_non_null(cfg_fn); 347 GNUNET_free_non_null (cfg_fn);
347 GNUNET_free_non_null(loglev); 348 GNUNET_free_non_null (loglev);
348 GNUNET_free_non_null(logfile); 349 GNUNET_free_non_null (logfile);
349 return ret; 350 return ret;
350} 351}
351 352
@@ -364,22 +365,22 @@ cleanup:
364 * @return #GNUNET_SYSERR on error, #GNUNET_OK on success 365 * @return #GNUNET_SYSERR on error, #GNUNET_OK on success
365 */ 366 */
366int 367int
367GNUNET_PROGRAM_run(int argc, 368GNUNET_PROGRAM_run (int argc,
368 char *const *argv, 369 char *const *argv,
369 const char *binaryName, 370 const char *binaryName,
370 const char *binaryHelp, 371 const char *binaryHelp,
371 const struct GNUNET_GETOPT_CommandLineOption *options, 372 const struct GNUNET_GETOPT_CommandLineOption *options,
372 GNUNET_PROGRAM_Main task, 373 GNUNET_PROGRAM_Main task,
373 void *task_cls) 374 void *task_cls)
374{ 375{
375 return GNUNET_PROGRAM_run2(argc, 376 return GNUNET_PROGRAM_run2 (argc,
376 argv, 377 argv,
377 binaryName, 378 binaryName,
378 binaryHelp, 379 binaryHelp,
379 options, 380 options,
380 task, 381 task,
381 task_cls, 382 task_cls,
382 GNUNET_NO); 383 GNUNET_NO);
383} 384}
384 385
385 386