diff options
Diffstat (limited to 'src/util/program.c')
-rw-r--r-- | src/util/program.c | 349 |
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 | */ |
42 | struct CommandContext { | 42 | struct 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 | */ |
73 | static void | 74 | static void |
74 | shutdown_task(void *cls) | 75 | shutdown_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 | */ |
85 | static void | 86 | static void |
86 | program_main(void *cls) | 87 | program_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 | */ |
104 | static int | 105 | static int |
105 | cmd_sorter(const void *a1, const void *a2) | 106 | cmd_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 | */ |
139 | int | 140 | int |
140 | GNUNET_PROGRAM_run2(int argc, | 141 | GNUNET_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; |
343 | cleanup: | 344 | cleanup: |
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 | */ |
366 | int | 367 | int |
367 | GNUNET_PROGRAM_run(int argc, | 368 | GNUNET_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 | ||