aboutsummaryrefslogtreecommitdiff
path: root/src/arm/gnunet-arm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arm/gnunet-arm.c')
-rw-r--r--src/arm/gnunet-arm.c79
1 files changed, 50 insertions, 29 deletions
diff --git a/src/arm/gnunet-arm.c b/src/arm/gnunet-arm.c
index af85372d8..4501ed036 100644
--- a/src/arm/gnunet-arm.c
+++ b/src/arm/gnunet-arm.c
@@ -145,6 +145,11 @@ static unsigned int no_stdout;
145 */ 145 */
146static unsigned int no_stderr; 146static unsigned int no_stderr;
147 147
148/**
149 * Handle for the task running the #action_loop().
150 */
151static struct GNUNET_SCHEDULER_Task *al_task;
152
148 153
149/** 154/**
150 * Attempts to delete configuration file and GNUNET_HOME 155 * Attempts to delete configuration file and GNUNET_HOME
@@ -183,6 +188,11 @@ delete_files ()
183static void 188static void
184shutdown_task (void *cls) 189shutdown_task (void *cls)
185{ 190{
191 if (NULL != al_task)
192 {
193 GNUNET_SCHEDULER_cancel (al_task);
194 al_task = NULL;
195 }
186 if (NULL != h) 196 if (NULL != h)
187 { 197 {
188 GNUNET_ARM_disconnect_and_free (h); 198 GNUNET_ARM_disconnect_and_free (h);
@@ -314,7 +324,8 @@ conn_status (void *cls,
314 */ 324 */
315static void 325static void
316start_callback (void *cls, 326start_callback (void *cls,
317 enum GNUNET_ARM_RequestStatus rs, const char *service, 327 enum GNUNET_ARM_RequestStatus rs,
328 const char *service,
318 enum GNUNET_ARM_Result result) 329 enum GNUNET_ARM_Result result)
319{ 330{
320 char *msg; 331 char *msg;
@@ -336,9 +347,10 @@ start_callback (void *cls,
336 GNUNET_SCHEDULER_shutdown (); 347 GNUNET_SCHEDULER_shutdown ();
337 return; 348 return;
338 } 349 }
339 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "ARM service [re]start successful\n"); 350 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
351 "ARM service [re]start successful\n");
340 start = 0; 352 start = 0;
341 GNUNET_SCHEDULER_add_now (action_loop, NULL); 353 al_task = GNUNET_SCHEDULER_add_now (&action_loop, NULL);
342} 354}
343 355
344 356
@@ -356,7 +368,8 @@ start_callback (void *cls,
356 */ 368 */
357static void 369static void
358stop_callback (void *cls, 370stop_callback (void *cls,
359 enum GNUNET_ARM_RequestStatus rs, const char *service, 371 enum GNUNET_ARM_RequestStatus rs,
372 const char *service,
360 enum GNUNET_ARM_Result result) 373 enum GNUNET_ARM_Result result)
361{ 374{
362 char *msg; 375 char *msg;
@@ -374,7 +387,8 @@ stop_callback (void *cls,
374 (GNUNET_ARM_RESULT_STOPPED != result) && 387 (GNUNET_ARM_RESULT_STOPPED != result) &&
375 (GNUNET_ARM_RESULT_IS_STOPPED_ALREADY != result)) 388 (GNUNET_ARM_RESULT_IS_STOPPED_ALREADY != result))
376 { 389 {
377 GNUNET_asprintf (&msg, "%s", _("Failed to stop the ARM service: %s\n")); 390 GNUNET_asprintf (&msg, "%s",
391 _("Failed to stop the ARM service: %s\n"));
378 FPRINTF (stdout, msg, ret_string (result)); 392 FPRINTF (stdout, msg, ret_string (result));
379 GNUNET_free (msg); 393 GNUNET_free (msg);
380 GNUNET_SCHEDULER_shutdown (); 394 GNUNET_SCHEDULER_shutdown ();
@@ -390,7 +404,7 @@ stop_callback (void *cls,
390 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 404 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
391 "Initiating an ARM restart\n"); 405 "Initiating an ARM restart\n");
392 } 406 }
393 GNUNET_SCHEDULER_add_now (&action_loop, NULL); 407 al_task = GNUNET_SCHEDULER_add_now (&action_loop, NULL);
394} 408}
395 409
396 410
@@ -408,7 +422,8 @@ stop_callback (void *cls,
408 */ 422 */
409static void 423static void
410init_callback (void *cls, 424init_callback (void *cls,
411 enum GNUNET_ARM_RequestStatus rs, const char *service, 425 enum GNUNET_ARM_RequestStatus rs,
426 const char *service,
412 enum GNUNET_ARM_Result result) 427 enum GNUNET_ARM_Result result)
413{ 428{
414 char *msg; 429 char *msg;
@@ -438,7 +453,7 @@ init_callback (void *cls,
438 init); 453 init);
439 GNUNET_free (init); 454 GNUNET_free (init);
440 init = NULL; 455 init = NULL;
441 GNUNET_SCHEDULER_add_now (&action_loop, NULL); 456 al_task = GNUNET_SCHEDULER_add_now (&action_loop, NULL);
442} 457}
443 458
444 459
@@ -456,7 +471,8 @@ init_callback (void *cls,
456 */ 471 */
457static void 472static void
458term_callback (void *cls, 473term_callback (void *cls,
459 enum GNUNET_ARM_RequestStatus rs, const char *service, 474 enum GNUNET_ARM_RequestStatus rs,
475 const char *service,
460 enum GNUNET_ARM_Result result) 476 enum GNUNET_ARM_Result result)
461{ 477{
462 char *msg; 478 char *msg;
@@ -487,7 +503,7 @@ term_callback (void *cls,
487 term); 503 term);
488 GNUNET_free (term); 504 GNUNET_free (term);
489 term = NULL; 505 term = NULL;
490 GNUNET_SCHEDULER_add_now (&action_loop, NULL); 506 al_task = GNUNET_SCHEDULER_add_now (&action_loop, NULL);
491} 507}
492 508
493 509
@@ -503,7 +519,8 @@ term_callback (void *cls,
503 */ 519 */
504static void 520static void
505list_callback (void *cls, 521list_callback (void *cls,
506 enum GNUNET_ARM_RequestStatus rs, unsigned int count, 522 enum GNUNET_ARM_RequestStatus rs,
523 unsigned int count,
507 const char *const*list) 524 const char *const*list)
508{ 525{
509 unsigned int i; 526 unsigned int i;
@@ -512,7 +529,8 @@ list_callback (void *cls,
512 { 529 {
513 char *msg; 530 char *msg;
514 531
515 GNUNET_asprintf (&msg, "%s", _("Failed to request a list of services: %s\n")); 532 GNUNET_asprintf (&msg, "%s",
533 _("Failed to request a list of services: %s\n"));
516 FPRINTF (stdout, msg, req_string (rs)); 534 FPRINTF (stdout, msg, req_string (rs));
517 GNUNET_free (msg); 535 GNUNET_free (msg);
518 ret = 3; 536 ret = 3;
@@ -520,7 +538,8 @@ list_callback (void *cls,
520 } 538 }
521 if (NULL == list) 539 if (NULL == list)
522 { 540 {
523 FPRINTF (stderr, "%s", _("Error communicating with ARM. ARM not running?\n")); 541 FPRINTF (stderr, "%s",
542 _("Error communicating with ARM. ARM not running?\n"));
524 GNUNET_SCHEDULER_shutdown (); 543 GNUNET_SCHEDULER_shutdown ();
525 ret = 3; 544 ret = 3;
526 return; 545 return;
@@ -528,7 +547,7 @@ list_callback (void *cls,
528 FPRINTF (stdout, "%s", _("Running services:\n")); 547 FPRINTF (stdout, "%s", _("Running services:\n"));
529 for (i = 0; i < count; i++) 548 for (i = 0; i < count; i++)
530 FPRINTF (stdout, "%s\n", list[i]); 549 FPRINTF (stdout, "%s\n", list[i]);
531 GNUNET_SCHEDULER_add_now (&action_loop, NULL); 550 al_task = GNUNET_SCHEDULER_add_now (&action_loop, NULL);
532} 551}
533 552
534 553
@@ -541,12 +560,9 @@ list_callback (void *cls,
541static void 560static void
542action_loop (void *cls) 561action_loop (void *cls)
543{ 562{
544 const struct GNUNET_SCHEDULER_TaskContext *tc; 563 al_task = NULL;
545 564 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
546 tc = GNUNET_SCHEDULER_get_task_context (); 565 "Running requested actions\n");
547 if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN))
548 return;
549 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Running requested actions\n");
550 while (1) 566 while (1)
551 { 567 {
552 switch (phase++) 568 switch (phase++)
@@ -554,7 +570,8 @@ action_loop (void *cls)
554 case 0: 570 case 0:
555 if (NULL != term) 571 if (NULL != term)
556 { 572 {
557 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Termination action\n"); 573 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
574 "Termination action\n");
558 GNUNET_ARM_request_service_stop (h, term, 575 GNUNET_ARM_request_service_stop (h, term,
559 (0 == timeout.rel_value_us) ? STOP_TIMEOUT : timeout, 576 (0 == timeout.rel_value_us) ? STOP_TIMEOUT : timeout,
560 &term_callback, NULL); 577 &term_callback, NULL);
@@ -564,7 +581,8 @@ action_loop (void *cls)
564 case 1: 581 case 1:
565 if (end || restart) 582 if (end || restart)
566 { 583 {
567 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "End action\n"); 584 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
585 "End action\n");
568 GNUNET_ARM_request_service_stop (h, "arm", 586 GNUNET_ARM_request_service_stop (h, "arm",
569 (0 == timeout.rel_value_us) ? STOP_TIMEOUT_ARM : timeout, 587 (0 == timeout.rel_value_us) ? STOP_TIMEOUT_ARM : timeout,
570 &stop_callback, NULL); 588 &stop_callback, NULL);
@@ -574,7 +592,8 @@ action_loop (void *cls)
574 case 2: 592 case 2:
575 if (start) 593 if (start)
576 { 594 {
577 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Start action\n"); 595 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
596 "Start action\n");
578 GNUNET_ARM_request_service_start (h, "arm", 597 GNUNET_ARM_request_service_start (h, "arm",
579 (no_stdout ? 0 : GNUNET_OS_INHERIT_STD_OUT) | 598 (no_stdout ? 0 : GNUNET_OS_INHERIT_STD_OUT) |
580 (no_stderr ? 0 : GNUNET_OS_INHERIT_STD_ERR), 599 (no_stderr ? 0 : GNUNET_OS_INHERIT_STD_ERR),
@@ -586,8 +605,10 @@ action_loop (void *cls)
586 case 3: 605 case 3:
587 if (NULL != init) 606 if (NULL != init)
588 { 607 {
589 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Initialization action\n"); 608 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
590 GNUNET_ARM_request_service_start (h, init, GNUNET_OS_INHERIT_STD_NONE, 609 "Initialization action\n");
610 GNUNET_ARM_request_service_start (h, init,
611 GNUNET_OS_INHERIT_STD_NONE,
591 (0 == timeout.rel_value_us) ? STOP_TIMEOUT : timeout, 612 (0 == timeout.rel_value_us) ? STOP_TIMEOUT : timeout,
592 &init_callback, NULL); 613 &init_callback, NULL);
593 return; 614 return;
@@ -631,7 +652,8 @@ action_loop (void *cls)
631 */ 652 */
632static void 653static void
633srv_status (void *cls, 654srv_status (void *cls,
634 const char *service, enum GNUNET_ARM_ServiceStatus status) 655 const char *service,
656 enum GNUNET_ARM_ServiceStatus status)
635{ 657{
636 const char *msg; 658 const char *msg;
637 659
@@ -704,9 +726,8 @@ run (void *cls,
704 return; 726 return;
705 if (monitor) 727 if (monitor)
706 m = GNUNET_ARM_monitor (cfg, &srv_status, NULL); 728 m = GNUNET_ARM_monitor (cfg, &srv_status, NULL);
707 GNUNET_SCHEDULER_add_now (&action_loop, NULL); 729 al_task = GNUNET_SCHEDULER_add_now (&action_loop, NULL);
708 GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, 730 GNUNET_SCHEDULER_add_shutdown (&shutdown_task, NULL);
709 &shutdown_task, NULL);
710} 731}
711 732
712 733