GNUnet  0.10.x
Macros | Typedefs | Enumerations | Functions
ARM service

Automatic Restart Manager. More...

Macros

#define GNUNET_ARM_VERSION   0x00000003
 Version of the arm API. More...
 

Typedefs

typedef void(* GNUNET_ARM_ConnectionStatusCallback) (void *cls, int connected)
 Function called whenever we connect to or disconnect from ARM. More...
 
typedef void(* GNUNET_ARM_ResultCallback) (void *cls, enum GNUNET_ARM_RequestStatus rs, enum GNUNET_ARM_Result result)
 Function called in response to a start/stop request. More...
 
typedef void(* GNUNET_ARM_ServiceListCallback) (void *cls, enum GNUNET_ARM_RequestStatus rs, unsigned int count, const char *const *list)
 Callback function invoked when list operation is complete. More...
 
typedef void(* GNUNET_ARM_ServiceStatusCallback) (void *cls, const char *service, enum GNUNET_ARM_ServiceStatus status)
 Function called in when a status update arrives. More...
 

Enumerations

enum  GNUNET_ARM_RequestStatus { GNUNET_ARM_REQUEST_SENT_OK = 0, GNUNET_ARM_REQUEST_DISCONNECTED = 2 }
 Statuses of the requests that client can send to ARM. More...
 
enum  GNUNET_ARM_ServiceStatus { GNUNET_ARM_SERVICE_MONITORING_STARTED = 0, GNUNET_ARM_SERVICE_STOPPED = 1, GNUNET_ARM_SERVICE_STARTING = 2, GNUNET_ARM_SERVICE_STOPPING = 3 }
 Statuses of services. More...
 
enum  GNUNET_ARM_Result {
  GNUNET_ARM_RESULT_STOPPED = 0, GNUNET_ARM_RESULT_STOPPING = 1, GNUNET_ARM_RESULT_STARTING = 2, GNUNET_ARM_RESULT_IS_STARTING_ALREADY = 3,
  GNUNET_ARM_RESULT_IS_STOPPING_ALREADY = 4, GNUNET_ARM_RESULT_IS_STARTED_ALREADY = 5, GNUNET_ARM_RESULT_IS_STOPPED_ALREADY = 6, GNUNET_ARM_RESULT_IS_NOT_KNOWN = 7,
  GNUNET_ARM_RESULT_START_FAILED = 8, GNUNET_ARM_RESULT_IN_SHUTDOWN = 9
}
 Replies to ARM requests. More...
 

Functions

struct GNUNET_ARM_HandleGNUNET_ARM_connect (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_ARM_ConnectionStatusCallback conn_status, void *conn_status_cls)
 Set up a context for communicating with ARM, then start connecting to the ARM service using that context. More...
 
void GNUNET_ARM_disconnect (struct GNUNET_ARM_Handle *h)
 Disconnect from the ARM service and destroy the handle. More...
 
void GNUNET_ARM_operation_cancel (struct GNUNET_ARM_Operation *op)
 Abort an operation. More...
 
struct GNUNET_ARM_OperationGNUNET_ARM_request_service_list (struct GNUNET_ARM_Handle *h, GNUNET_ARM_ServiceListCallback cont, void *cont_cls)
 Request a list of running services. More...
 
struct GNUNET_ARM_OperationGNUNET_ARM_request_service_stop (struct GNUNET_ARM_Handle *h, const char *service_name, GNUNET_ARM_ResultCallback cont, void *cont_cls)
 Request a service to be stopped. More...
 
struct GNUNET_ARM_OperationGNUNET_ARM_request_service_start (struct GNUNET_ARM_Handle *h, const char *service_name, enum GNUNET_OS_InheritStdioFlags std_inheritance, GNUNET_ARM_ResultCallback cont, void *cont_cls)
 Request for a service to be started. More...
 
struct GNUNET_ARM_MonitorHandleGNUNET_ARM_monitor_start (const struct GNUNET_CONFIGURATION_Handle *cfg, GNUNET_ARM_ServiceStatusCallback cont, void *cont_cls)
 Setup a context for monitoring ARM, then start connecting to the ARM service for monitoring using that context. More...
 
void GNUNET_ARM_monitor_stop (struct GNUNET_ARM_MonitorHandle *h)
 Disconnect from the ARM service and destroy the handle. More...
 

Detailed Description

Automatic Restart Manager.

See also
Documentation

Macro Definition Documentation

◆ GNUNET_ARM_VERSION

#define GNUNET_ARM_VERSION   0x00000003

Version of the arm API.

Definition at line 51 of file gnunet_arm_service.h.

Typedef Documentation

◆ GNUNET_ARM_ConnectionStatusCallback

typedef void(* GNUNET_ARM_ConnectionStatusCallback) (void *cls, int connected)

Function called whenever we connect to or disconnect from ARM.

Parameters
clsclosure
connectedGNUNET_YES if connected, GNUNET_NO if disconnected, GNUNET_SYSERR if there was an error.

Definition at line 175 of file gnunet_arm_service.h.

◆ GNUNET_ARM_ResultCallback

typedef void(* GNUNET_ARM_ResultCallback) (void *cls, enum GNUNET_ARM_RequestStatus rs, enum GNUNET_ARM_Result result)

Function called in response to a start/stop request.

Will be called when request was not sent successfully, or when a reply comes. If the request was not sent successfully, rs will indicate that, and result will be undefined.

Parameters
clsclosure
rsstatus of the request
resultresult of the operation

Definition at line 190 of file gnunet_arm_service.h.

◆ GNUNET_ARM_ServiceListCallback

typedef void(* GNUNET_ARM_ServiceListCallback) (void *cls, enum GNUNET_ARM_RequestStatus rs, unsigned int count, const char *const *list)

Callback function invoked when list operation is complete.

Will be called when request was not sent successfully, or when a reply comes. If the request was not sent successfully, rs will indicate that, and count and list will be undefined.

Parameters
clsclosure
rsstatus of the request
countnumber of strings in the list
listlist of running services

Definition at line 207 of file gnunet_arm_service.h.

◆ GNUNET_ARM_ServiceStatusCallback

typedef void(* GNUNET_ARM_ServiceStatusCallback) (void *cls, const char *service, enum GNUNET_ARM_ServiceStatus status)

Function called in when a status update arrives.

Parameters
clsclosure
serviceservice name
statusstatus of the service

Definition at line 316 of file gnunet_arm_service.h.

Enumeration Type Documentation

◆ GNUNET_ARM_RequestStatus

Statuses of the requests that client can send to ARM.

Enumerator
GNUNET_ARM_REQUEST_SENT_OK 

Message was sent successfully.

GNUNET_ARM_REQUEST_DISCONNECTED 

We disconnected from ARM, and request was not sent.

Definition at line 57 of file gnunet_arm_service.h.

58 {
63 
68 
69 };
We disconnected from ARM, and request was not sent.
Message was sent successfully.

◆ GNUNET_ARM_ServiceStatus

Statuses of services.

Enumerator
GNUNET_ARM_SERVICE_MONITORING_STARTED 

Dummy message.

GNUNET_ARM_SERVICE_STOPPED 

Service was stopped.

GNUNET_ARM_SERVICE_STARTING 

Service starting was initiated.

GNUNET_ARM_SERVICE_STOPPING 

Service stopping was initiated.

Definition at line 75 of file gnunet_arm_service.h.

76 {
81 
86 
91 
96 };
Service starting was initiated.
Service was stopped.
Service stopping was initiated.

◆ GNUNET_ARM_Result

Replies to ARM requests.

Enumerator
GNUNET_ARM_RESULT_STOPPED 

Service was stopped (never sent for ARM itself).

GNUNET_ARM_RESULT_STOPPING 

ARM stopping was initiated (there's no "stopped" for ARM itself).

GNUNET_ARM_RESULT_STARTING 

Service starting was initiated.

GNUNET_ARM_RESULT_IS_STARTING_ALREADY 

Asked to start it, but it's already starting.

GNUNET_ARM_RESULT_IS_STOPPING_ALREADY 

Asked to stop it, but it's already stopping.

GNUNET_ARM_RESULT_IS_STARTED_ALREADY 

Asked to start it, but it's already started.

GNUNET_ARM_RESULT_IS_STOPPED_ALREADY 

Asked to stop it, but it's already stopped.

GNUNET_ARM_RESULT_IS_NOT_KNOWN 

Asked to start or stop a service, but it's not known.

GNUNET_ARM_RESULT_START_FAILED 

Tried to start a service, but that failed for some reason.

GNUNET_ARM_RESULT_IN_SHUTDOWN 

Asked to start something, but ARM is shutting down and can't comply.

Definition at line 102 of file gnunet_arm_service.h.

103 {
108 
113 
118 
123 
128 
133 
138 
143 
148 
153 };
ARM stopping was initiated (there's no "stopped" for ARM itself).
Asked to stop it, but it's already stopping.
Asked to start it, but it's already started.
Tried to start a service, but that failed for some reason.
Service starting was initiated.
Asked to start it, but it's already starting.
Asked to start something, but ARM is shutting down and can't comply.
Asked to stop it, but it's already stopped.
Asked to start or stop a service, but it's not known.
Service was stopped (never sent for ARM itself).

Function Documentation

◆ GNUNET_ARM_connect()

struct GNUNET_ARM_Handle* GNUNET_ARM_connect ( const struct GNUNET_CONFIGURATION_Handle cfg,
GNUNET_ARM_ConnectionStatusCallback  conn_status,
void *  conn_status_cls 
)

Set up a context for communicating with ARM, then start connecting to the ARM service using that context.

Parameters
cfgconfiguration to use (needed to contact ARM; the ARM service may internally use a different configuration to determine how to start the service).
conn_statuswill be called when connecting/disconnecting
conn_status_clsclosure for conn_status
Returns
context to use for further ARM operations, NULL on error.

Definition at line 482 of file arm_api.c.

References cfg, GNUNET_ARM_Handle::cfg, GNUNET_ARM_Handle::conn_status, conn_status(), GNUNET_ARM_Handle::conn_status_cls, GNUNET_free, GNUNET_new, GNUNET_OK, GNUNET_ARM_Operation::h, and reconnect_arm().

Referenced by GNUNET_TESTING_peer_stop_async(), handle_manage_peer_service(), and run().

485 {
486  struct GNUNET_ARM_Handle *h;
487 
488  h = GNUNET_new (struct GNUNET_ARM_Handle);
489  h->cfg = cfg;
492  if (GNUNET_OK != reconnect_arm (h))
493  {
494  GNUNET_free (h);
495  return NULL;
496  }
497  return h;
498 }
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration that we are using.
Definition: arm_api.c:107
Handle for interacting with ARM.
Definition: arm_api.c:97
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
GNUNET_ARM_ConnectionStatusCallback conn_status
Callback to invoke on connection/disconnection.
Definition: arm_api.c:122
static void conn_status(void *cls, int connected)
Function called whenever we connect to or disconnect from ARM.
Definition: gnunet-arm.c:286
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:104
void * conn_status_cls
Closure for conn_status.
Definition: arm_api.c:127
static int reconnect_arm(struct GNUNET_ARM_Handle *h)
Connect to arm.
Definition: arm_api.c:433
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ARM_disconnect()

void GNUNET_ARM_disconnect ( struct GNUNET_ARM_Handle h)

Disconnect from the ARM service and destroy the handle.

Parameters
hthe handle that was being used

Disconnect from the ARM service and destroy the handle.

Parameters
hthe handle that was being used

Definition at line 507 of file arm_api.c.

References GNUNET_ARM_Operation::async, GNUNET_ARM_Operation::cont_cls, GNUNET_ARM_REQUEST_DISCONNECTED, GNUNET_CONTAINER_DLL_remove, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_MQ_destroy(), GNUNET_SCHEDULER_cancel(), GNUNET_ARM_Operation::list_cont, LOG, GNUNET_ARM_Handle::mq, op, GNUNET_ARM_Handle::operation_pending_head, GNUNET_ARM_Handle::operation_pending_tail, GNUNET_ARM_Handle::reconnect_task, and GNUNET_ARM_Operation::result_cont.

Referenced by cleanup_mctx(), disconn_status(), GNUNET_TESTING_peer_destroy(), GNUNET_TESTING_peer_stop_async_cancel(), and shutdown_task().

508 {
509  struct GNUNET_ARM_Operation *op;
510 
511  LOG (GNUNET_ERROR_TYPE_DEBUG, "Disconnecting from ARM service\n");
512  while (NULL != (op = h->operation_pending_head))
513  {
516  op);
517  if (NULL != op->result_cont)
519  if (NULL != op->list_cont)
521  if (NULL != op->async)
522  {
524  op->async = NULL;
525  }
526  GNUNET_free (op);
527  }
528  if (NULL != h->mq)
529  {
530  GNUNET_MQ_destroy (h->mq);
531  h->mq = NULL;
532  }
533  if (NULL != h->reconnect_task)
534  {
536  h->reconnect_task = NULL;
537  }
538  GNUNET_free (h);
539 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
struct GNUNET_SCHEDULER_Task * reconnect_task
ID of the reconnect task (if any).
Definition: arm_api.c:142
#define LOG(kind,...)
Definition: arm_api.c:33
Entry in a doubly-linked list of operations awaiting for replies (in-order) from the ARM service...
Definition: arm_api.c:40
We disconnected from ARM, and request was not sent.
struct GNUNET_MQ_Handle * mq
Our connection to the ARM service.
Definition: arm_api.c:102
void * cont_cls
Closure for result_cont or list_cont.
Definition: arm_api.c:70
struct GNUNET_SCHEDULER_Task * async
Task for async completion.
Definition: arm_api.c:75
GNUNET_ARM_ServiceListCallback list_cont
Callback for service list requests.
Definition: arm_api.c:65
struct GNUNET_ARM_Operation * operation_pending_head
Head of doubly-linked list of pending operations.
Definition: arm_api.c:112
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:824
struct GNUNET_ARM_Operation * operation_pending_tail
Tail of doubly-linked list of pending operations.
Definition: arm_api.c:117
static struct GNUNET_ARM_Operation * op
Current operation.
Definition: gnunet-arm.c:139
GNUNET_ARM_ResultCallback result_cont
Callback for service state change requests.
Definition: arm_api.c:60
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:965
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ARM_operation_cancel()

void GNUNET_ARM_operation_cancel ( struct GNUNET_ARM_Operation op)

Abort an operation.

Only prevents the callback from being called, the operation may still complete.

Parameters
opoperation to cancel

Definition at line 665 of file arm_api.c.

References GNUNET_CONTAINER_DLL_remove, GNUNET_free, GNUNET_ARM_Operation::h, GNUNET_ARM_Handle::operation_pending_head, GNUNET_ARM_Handle::operation_pending_tail, GNUNET_ARM_Operation::result_cont, and GNUNET_ARM_Handle::thm.

Referenced by handle_arm_list_result(), handle_arm_result(), reconnect_arm_later(), and shutdown_task().

666 {
667  struct GNUNET_ARM_Handle *h = op->h;
668 
669  if (h->thm == op)
670  {
671  op->result_cont = NULL;
672  return;
673  }
676  op);
677  GNUNET_free (op);
678 }
#define GNUNET_CONTAINER_DLL_remove(head, tail, element)
Remove an element from a DLL.
Handle for interacting with ARM.
Definition: arm_api.c:97
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
struct GNUNET_ARM_Operation * operation_pending_head
Head of doubly-linked list of pending operations.
Definition: arm_api.c:112
struct GNUNET_ARM_Operation * thm
ARM operation where the goal is to wait for ARM shutdown to complete.
Definition: arm_api.c:137
struct GNUNET_ARM_Handle * h
ARM handle.
Definition: arm_api.c:55
struct GNUNET_ARM_Operation * operation_pending_tail
Tail of doubly-linked list of pending operations.
Definition: arm_api.c:117
GNUNET_ARM_ResultCallback result_cont
Callback for service state change requests.
Definition: arm_api.c:60
#define GNUNET_free(ptr)
Wrapper around free.
Here is the caller graph for this function:

◆ GNUNET_ARM_request_service_list()

struct GNUNET_ARM_Operation* GNUNET_ARM_request_service_list ( struct GNUNET_ARM_Handle h,
GNUNET_ARM_ServiceListCallback  cont,
void *  cont_cls 
)

Request a list of running services.

Parameters
hhandle to ARM
contcallback to invoke after request is sent or is not sent
cont_clsclosure for cont
Returns
handle for the operation, NULL on error

Definition at line 896 of file arm_api.c.

References GNUNET_ARM_Operation::cont_cls, env, GNUNET_CONTAINER_DLL_insert_tail, GNUNET_ERROR_TYPE_DEBUG, GNUNET_htonll(), GNUNET_MESSAGE_TYPE_ARM_LIST, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_new, GNUNET_ARM_Operation::h, GNUNET_ARM_Operation::id, GNUNET_ARM_Operation::list_cont, LOG, GNUNET_ARM_Handle::mq, msg, op, GNUNET_ARM_Handle::operation_pending_head, GNUNET_ARM_Handle::operation_pending_tail, GNUNET_ARM_Message::request_id, GNUNET_ARM_Handle::request_id_counter, and GNUNET_ARM_Message::reserved.

Referenced by action_loop().

899 {
900  struct GNUNET_ARM_Operation *op;
901  struct GNUNET_MQ_Envelope *env;
902  struct GNUNET_ARM_Message *msg;
903 
904  LOG (GNUNET_ERROR_TYPE_DEBUG, "Requesting LIST from ARM service\n");
905  if (0 == h->request_id_counter)
906  h->request_id_counter++;
907  op = GNUNET_new (struct GNUNET_ARM_Operation);
908  op->h = h;
909  op->list_cont = cont;
910  op->cont_cls = cont_cls;
911  op->id = h->request_id_counter++;
914  op);
916  msg->reserved = htonl (0);
917  msg->request_id = GNUNET_htonll (op->id);
918  GNUNET_MQ_send (h->mq, env);
919  return op;
920 }
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
uint64_t request_id
ID of a request that is being replied to.
Definition: arm.h:78
#define LOG(kind,...)
Definition: arm_api.c:33
Entry in a doubly-linked list of operations awaiting for replies (in-order) from the ARM service...
Definition: arm_api.c:40
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
struct GNUNET_MQ_Handle * mq
Our connection to the ARM service.
Definition: arm_api.c:102
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void * cont_cls
Closure for result_cont or list_cont.
Definition: arm_api.c:70
uint32_t reserved
For alignment.
Definition: arm.h:71
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
GNUNET_ARM_ServiceListCallback list_cont
Callback for service list requests.
Definition: arm_api.c:65
struct GNUNET_ARM_Operation * operation_pending_head
Head of doubly-linked list of pending operations.
Definition: arm_api.c:112
uint64_t GNUNET_htonll(uint64_t n)
Convert unsigned 64-bit integer to network byte order.
Definition: common_endian.c:35
#define GNUNET_MESSAGE_TYPE_ARM_LIST
Request to ARM to list all currently running services.
uint64_t id
Unique ID for the request.
Definition: arm_api.c:80
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
struct GNUNET_ARM_Handle * h
ARM handle.
Definition: arm_api.c:55
uint64_t request_id_counter
Counter for request identifiers.
Definition: arm_api.c:153
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:353
struct GNUNET_ARM_Operation * operation_pending_tail
Tail of doubly-linked list of pending operations.
Definition: arm_api.c:117
static struct GNUNET_ARM_Operation * op
Current operation.
Definition: gnunet-arm.c:139
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ARM_request_service_stop()

struct GNUNET_ARM_Operation* GNUNET_ARM_request_service_stop ( struct GNUNET_ARM_Handle h,
const char *  service_name,
GNUNET_ARM_ResultCallback  cont,
void *  cont_cls 
)

Request a service to be stopped.

Stopping arm itself will not invalidate its handle, and ARM API will try to restore connection to the ARM service, even if ARM connection was lost because you asked for ARM to be stopped. Call GNUNET_ARM_disconnect() to free the handle and prevent further connection attempts.

Parameters
hhandle to ARM
service_namename of the service
contcallback to invoke after request is sent or is not sent
cont_clsclosure for cont
Returns
handle for the operation, NULL on error

Definition at line 864 of file arm_api.c.

References change_service(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_MESSAGE_TYPE_ARM_STOP, GNUNET_YES, GNUNET_ARM_Operation::is_arm_stop, LOG, and op.

Referenced by action_loop(), and handle_manage_peer_service().

868 {
869  struct GNUNET_ARM_Operation *op;
870 
871  LOG (GNUNET_ERROR_TYPE_DEBUG, "Stopping service `%s'\n", service_name);
872  op = change_service (h,
873  service_name,
874  cont,
875  cont_cls,
877  if (NULL == op)
878  return NULL;
879  /* If the service is ARM, set a flag as we will use MQ errors
880  to detect that the process is really gone. */
881  if (0 == strcasecmp (service_name, "arm"))
882  op->is_arm_stop = GNUNET_YES;
883  return op;
884 }
#define LOG(kind,...)
Definition: arm_api.c:33
Entry in a doubly-linked list of operations awaiting for replies (in-order) from the ARM service...
Definition: arm_api.c:40
#define GNUNET_MESSAGE_TYPE_ARM_STOP
Request to ARM to stop a service.
void * cont_cls
Closure for result_cont or list_cont.
Definition: arm_api.c:70
static struct GNUNET_ARM_Operation * change_service(struct GNUNET_ARM_Handle *h, const char *service_name, GNUNET_ARM_ResultCallback cb, void *cb_cls, uint16_t type)
Start or stop a service.
Definition: arm_api.c:692
static char * service_name
Option -s: service name (hash to get service descriptor)
Definition: gnunet-vpn.c:51
int is_arm_stop
Is this an operation to stop the ARM service?
Definition: arm_api.c:90
#define GNUNET_YES
Definition: gnunet_common.h:80
static struct GNUNET_ARM_Operation * op
Current operation.
Definition: gnunet-arm.c:139
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ARM_request_service_start()

struct GNUNET_ARM_Operation* GNUNET_ARM_request_service_start ( struct GNUNET_ARM_Handle h,
const char *  service_name,
enum GNUNET_OS_InheritStdioFlags  std_inheritance,
GNUNET_ARM_ResultCallback  cont,
void *  cont_cls 
)

Request for a service to be started.

Parameters
hhandle to ARM
service_namename of the service
std_inheritanceinheritance of std streams
contcallback to invoke after request is sent or not sent
cont_clsclosure for cont
Returns
handle for the operation, NULL on error

Definition at line 789 of file arm_api.c.

References GNUNET_ARM_Operation::async, change_service(), GNUNET_ARM_Operation::cont_cls, GNUNET_ARM_Handle::currently_up, GNUNET_ARM_RESULT_STARTING, GNUNET_CONTAINER_DLL_insert_tail, GNUNET_ERROR_TYPE_DEBUG, GNUNET_MESSAGE_TYPE_ARM_START, GNUNET_new, GNUNET_SCHEDULER_add_now(), GNUNET_YES, GNUNET_ARM_Operation::h, LOG, notify_running(), notify_starting(), op, GNUNET_ARM_Handle::operation_pending_head, GNUNET_ARM_Handle::operation_pending_tail, reconnect_arm(), GNUNET_ARM_Operation::result_cont, ret, start_arm_service(), and GNUNET_ARM_Operation::starting_ret.

Referenced by action_loop(), and handle_manage_peer_service().

795 {
796  struct GNUNET_ARM_Operation *op;
797  enum GNUNET_ARM_Result ret;
798 
799  LOG (GNUNET_ERROR_TYPE_DEBUG, "Starting service `%s'\n", service_name);
800  if (0 != strcasecmp ("arm", service_name))
801  return change_service (h,
802  service_name,
803  cont,
804  cont_cls,
806 
807  /* Possible cases:
808  * 1) We're connected to ARM already. Invoke the callback immediately.
809  * 2) We're not connected to ARM.
810  * Cancel any reconnection attempts temporarily, then perform
811  * a service test.
812  */
813  if (GNUNET_YES == h->currently_up)
814  {
815  LOG (GNUNET_ERROR_TYPE_DEBUG, "ARM is already running\n");
816  op = GNUNET_new (struct GNUNET_ARM_Operation);
817  op->h = h;
818  op->result_cont = cont;
819  op->cont_cls = cont_cls;
822  op);
824  return op;
825  }
826  /* This is an inherently uncertain choice, as it is of course
827  theoretically possible that ARM is up and we just did not
828  yet complete the MQ handshake. However, given that users
829  are unlikely to hammer 'gnunet-arm -s' on a busy system,
830  the above check should catch 99.99% of the cases where ARM
831  is already running. */
832  LOG (GNUNET_ERROR_TYPE_DEBUG, "Starting ARM service\n");
833  ret = start_arm_service (h, std_inheritance);
834  if (GNUNET_ARM_RESULT_STARTING == ret)
835  reconnect_arm (h);
836  op = GNUNET_new (struct GNUNET_ARM_Operation);
837  op->h = h;
838  op->result_cont = cont;
839  op->cont_cls = cont_cls;
842  op);
843  op->starting_ret = ret;
845  return op;
846 }
static void notify_starting(void *cls)
Task run to notify application that ARM is being started.
Definition: arm_api.c:759
#define LOG(kind,...)
Definition: arm_api.c:33
Entry in a doubly-linked list of operations awaiting for replies (in-order) from the ARM service...
Definition: arm_api.c:40
#define GNUNET_MESSAGE_TYPE_ARM_START
Request to ARM to start a service.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
GNUNET_ARM_Result
Replies to ARM requests.
void * cont_cls
Closure for result_cont or list_cont.
Definition: arm_api.c:70
static int ret
Final status code.
Definition: gnunet-arm.c:89
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
struct GNUNET_SCHEDULER_Task * async
Task for async completion.
Definition: arm_api.c:75
static void notify_running(void *cls)
Task run to notify application that ARM is already up.
Definition: arm_api.c:734
Service starting was initiated.
static struct GNUNET_ARM_Operation * change_service(struct GNUNET_ARM_Handle *h, const char *service_name, GNUNET_ARM_ResultCallback cb, void *cb_cls, uint16_t type)
Start or stop a service.
Definition: arm_api.c:692
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_now(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run as soon as possible.
Definition: scheduler.c:1273
static char * service_name
Option -s: service name (hash to get service descriptor)
Definition: gnunet-vpn.c:51
struct GNUNET_ARM_Operation * operation_pending_head
Head of doubly-linked list of pending operations.
Definition: arm_api.c:112
static enum GNUNET_ARM_Result start_arm_service(struct GNUNET_ARM_Handle *h, enum GNUNET_OS_InheritStdioFlags std_inheritance)
A client specifically requested starting of ARM itself.
Definition: arm_api.c:551
#define GNUNET_CONTAINER_DLL_insert_tail(head, tail, element)
Insert an element at the tail of a DLL.
struct GNUNET_ARM_Handle * h
ARM handle.
Definition: arm_api.c:55
int currently_up
Have we detected that ARM is up?
Definition: arm_api.c:158
enum GNUNET_ARM_Result starting_ret
Result of this operation for notify_starting().
Definition: arm_api.c:85
#define GNUNET_YES
Definition: gnunet_common.h:80
struct GNUNET_ARM_Operation * operation_pending_tail
Tail of doubly-linked list of pending operations.
Definition: arm_api.c:117
static struct GNUNET_ARM_Operation * op
Current operation.
Definition: gnunet-arm.c:139
static int reconnect_arm(struct GNUNET_ARM_Handle *h)
Connect to arm.
Definition: arm_api.c:433
GNUNET_ARM_ResultCallback result_cont
Callback for service state change requests.
Definition: arm_api.c:60
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ARM_monitor_start()

struct GNUNET_ARM_MonitorHandle* GNUNET_ARM_monitor_start ( const struct GNUNET_CONFIGURATION_Handle cfg,
GNUNET_ARM_ServiceStatusCallback  cont,
void *  cont_cls 
)

Setup a context for monitoring ARM, then start connecting to the ARM service for monitoring using that context.

Parameters
cfgconfiguration to use (needed to contact ARM; the ARM service may internally use a different configuration to determine how to start the service).
contcallback to invoke on status updates
cont_clsclosure for cont
Returns
context to use for further ARM monitor operations, NULL on error.

Definition at line 234 of file arm_monitor_api.c.

References GNUNET_ARM_MonitorHandle::cfg, GNUNET_free, GNUNET_new, GNUNET_OK, h, reconnect_arm_monitor(), GNUNET_ARM_MonitorHandle::service_status, and GNUNET_ARM_MonitorHandle::service_status_cls.

Referenced by run().

237 {
238  struct GNUNET_ARM_MonitorHandle *h;
239 
241  h->cfg = cfg;
242  h->service_status = cont;
243  h->service_status_cls = cont_cls;
244  if (GNUNET_OK != reconnect_arm_monitor (h))
245  {
246  GNUNET_free (h);
247  return NULL;
248  }
249  return h;
250 }
void * service_status_cls
Closure for service_status.
const struct GNUNET_CONFIGURATION_Handle * cfg
The configuration that we are using.
#define GNUNET_OK
Named constants for return values.
Definition: gnunet_common.h:78
#define GNUNET_new(type)
Allocate a struct or union of the given type.
Handle for interacting with ARM.
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:94
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition: gnunet-arm.c:104
GNUNET_ARM_ServiceStatusCallback service_status
Callback to invoke on status updates.
static int reconnect_arm_monitor(struct GNUNET_ARM_MonitorHandle *h)
Connect to the ARM service for monitoring.
#define GNUNET_free(ptr)
Wrapper around free.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GNUNET_ARM_monitor_stop()

void GNUNET_ARM_monitor_stop ( struct GNUNET_ARM_MonitorHandle h)

Disconnect from the ARM service and destroy the handle.

Parameters
hthe handle that was being used

Disconnect from the ARM service and destroy the handle.

Parameters
hthe handle that was being used

Definition at line 259 of file arm_monitor_api.c.

References GNUNET_free, GNUNET_MQ_destroy(), GNUNET_SCHEDULER_cancel(), GNUNET_ARM_MonitorHandle::mq, and GNUNET_ARM_MonitorHandle::reconnect_task.

Referenced by shutdown_task().

260 {
261  if (NULL != h->mq)
262  {
263  GNUNET_MQ_destroy (h->mq);
264  h->mq = NULL;
265  }
266  if (NULL != h->reconnect_task)
267  {
269  h->reconnect_task = NULL;
270  }
271  GNUNET_free (h);
272 }
struct GNUNET_SCHEDULER_Task * reconnect_task
ID of the reconnect task (if any).
struct GNUNET_MQ_Handle * mq
Our control connection to the ARM service.
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:824
#define GNUNET_free(ptr)
Wrapper around free.
void * GNUNET_SCHEDULER_cancel(struct GNUNET_SCHEDULER_Task *task)
Cancel the task with the specified identifier.
Definition: scheduler.c:965
Here is the call graph for this function:
Here is the caller graph for this function: