implmentation of dbus-service activated
authorJosé Bollo <jose.bollo@iot.bzh>
Tue, 10 May 2016 15:20:39 +0000 (17:20 +0200)
committerJosé Bollo <jose.bollo@iot.bzh>
Tue, 10 May 2016 15:20:39 +0000 (17:20 +0200)
Change-Id: I7fb1bb9d2e1f02fb746f45b803c0798ff0d7336c
Signed-off-by: José Bollo <jose.bollo@iot.bzh>
src/afb-config.h
src/main.c

index 0cd827e..bd98baa 100644 (file)
 
 #define CTX_NBCLIENTS   10   // allow a default of 10 authenticated clients
 
+struct afb_config_item
+{
+       struct afb_config_item *previous;
+       int kind;
+       char *value;
+};
+
 // main config structure
 struct afb_config
 {
@@ -51,6 +58,7 @@ struct afb_config
   int  cntxTimeout;        // Client Session Context timeout
   int mode;           // mode of listening
   int aliascount;
+  struct afb_config_item *items;
   struct {
          char  *url;
          char  *path;
index ba19925..81f891b 100644 (file)
@@ -38,6 +38,7 @@
 #include "afb-hswitch.h"
 #include "afb-apis.h"
 #include "afb-api-so.h"
+#include "afb-api-dbus.h"
 #include "afb-hsrv.h"
 #include "afb-context.h"
 #include "afb-hreq.h"
 #define SET_MODE           18
 #define SET_READYFD        19
 
+#define DBUS_CLIENT        20
+#define DBUS_SERVICE       21
+#define SO_PLUGIN          22
+
 // Command line structure hold cli --command + help text
 typedef struct {
   int  val;        // command number within application
@@ -114,6 +119,11 @@ static  AFB_options cliOptions [] = {
 
   {SET_MODE         ,1,"mode"            , "set the mode: either local, remote or global"},
   {SET_READYFD      ,1,"readyfd"         , "set the #fd to signal when ready"},
+
+  {DBUS_CLIENT      ,1,"dbus-client"     , "bind to an afb service through dbus"},
+  {DBUS_SERVICE     ,1,"dbus-server"     , "provides an afb service through dbus"},
+  {SO_PLUGIN        ,1,"plugin"          , "load the plugin of path"},
+
   {0, 0, NULL, NULL}
  };
 
@@ -224,6 +234,19 @@ static void config_set_default (struct afb_config * config)
  |   Parse option and launch action
  +--------------------------------------------------------- */
 
+static void add_item(struct afb_config *config, int kind, char *value)
+{
+       struct afb_config_item *item = malloc(sizeof *item);
+       if (item == NULL) {
+               ERROR("out of memory");
+               exit(1);
+       }
+       item->kind = kind;
+       item->value = value;
+       item->previous = config->items;
+       config->items = item;
+}
+
 static void parse_arguments(int argc, char *argv[], struct afb_config *config)
 {
   char*          programName = argv [0];
@@ -352,6 +375,13 @@ static void parse_arguments(int argc, char *argv[], struct afb_config *config)
        if (!sscanf (optarg, "%u", &config->readyfd)) goto notAnInteger;
        break;
 
+    case DBUS_CLIENT:
+    case DBUS_SERVICE:
+    case SO_PLUGIN:
+       if (optarg == 0) goto needValueForOption;
+       add_item(config, optc, optarg);
+       break;
+
     case DISPLAY_VERSION:
        if (optarg != 0) goto noValueForOption;
        printVersion(stdout);
@@ -407,7 +437,6 @@ void signalQuit (int signum)
        exit(1);
 }
 
-
 /*----------------------------------------------------------
  | Error signals
  |
@@ -548,6 +577,38 @@ static struct afb_hsrv *start_http_server(struct afb_config * config)
        return hsrv;
 }
 
+static void start_items(struct afb_config_item *item)
+{
+  if (item != NULL) {
+    /* keeps the order */
+    start_items(item->previous);
+    switch(item->kind) {
+    case DBUS_CLIENT:
+      if (afb_api_dbus_add_client(item->value) < 0) {
+        ERROR("can't start the afb-dbus client of path %s",item->value);
+       exit(1);
+      }
+      break;
+    case DBUS_SERVICE:
+      if (afb_api_dbus_add_server(item->value) < 0) {
+        ERROR("can't start the afb-dbus service of path %s",item->value);
+       exit(1);
+      }
+      break;
+    case SO_PLUGIN:
+      if (afb_api_so_add_plugin(item->value) < 0) {
+        ERROR("can't start the plugin of path %s",item->value);
+       exit(1);
+      }
+      break;
+    default:
+      ERROR("unexpected internal error");
+      exit(1);
+    }
+    /* frre the item */
+    free(item);
+  }
+}
 
 /*---------------------------------------------------------
  | main
@@ -577,6 +638,9 @@ int main(int argc, char *argv[])  {
   if (config->ldpaths) 
     afb_api_so_add_pathset(config->ldpaths);
 
+  start_items(config->items);
+  config->items = NULL;
+
   ctxStoreInit(CTX_NBCLIENTS, config->cntxTimeout, config->token, afb_apis_count());
   if (!afb_hreq_init_cookie(config->httpdPort, config->rootapi, DEFLT_CNTX_TIMEOUT)) {
      ERROR("initialisation of cookies failed");