bindings: adds ability to use data of applications
[src/app-framework-binder.git] / src / main.c
index 7c45721..ff7daaf 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  * Copyright (C) 2015, 2016 "IoT.bzh"
  * Author "Fulup Ar Foll"
  * Author José Bollo <jose.bollo@iot.bzh>
@@ -34,6 +34,7 @@
 #include "afb-apis.h"
 #include "afb-api-so.h"
 #include "afb-api-dbus.h"
+#include "afb-api-ws.h"
 #include "afb-hsrv.h"
 #include "afb-context.h"
 #include "afb-hreq.h"
@@ -81,6 +82,9 @@
 
 #define SET_SESSIONMAX     23
 
+#define WS_CLIENT          24
+#define WS_SERVICE         25
+
 // Command line structure hold cli --command + help text
 typedef struct {
   int  val;        // command number within application
@@ -102,16 +106,16 @@ static  AFB_options cliOptions [] = {
   {SET_ROOT_BASE    ,1,"rootbase"        , "Angular Base Root URL [default /opa]"},
   {SET_ROOT_API     ,1,"rootapi"         , "HTML Root API URL [default /api]"},
   {SET_ALIAS        ,1,"alias"           , "Muliple url map outside of rootdir [eg: --alias=/icons:/usr/share/icons]"},
-  
+
   {SET_APITIMEOUT   ,1,"apitimeout"      , "Binding API timeout in seconds [default 10]"},
   {SET_CNTXTIMEOUT  ,1,"cntxtimeout"     , "Client Session Context Timeout [default 900]"},
   {SET_CACHE_TIMEOUT,1,"cache-eol"       , "Client cache end of live [default 3600]"},
-  
+
   {SET_SESSION_DIR  ,1,"sessiondir"      , "Sessions file path [default rootdir/sessions]"},
 
   {SET_LDPATH       ,1,"ldpaths"         , "Load bindingss from dir1:dir2:... [default = "BINDING_INSTALL_DIR"]"},
   {SET_AUTH_TOKEN   ,1,"token"           , "Initial Secret [default=no-session, --token="" for session without authentication]"},
-  
+
   {DISPLAY_VERSION  ,0,"version"         , "Display version and copyright"},
   {DISPLAY_HELP     ,0,"help"            , "Display this help"},
 
@@ -120,6 +124,8 @@ static  AFB_options cliOptions [] = {
 
   {DBUS_CLIENT      ,1,"dbus-client"     , "bind to an afb service through dbus"},
   {DBUS_SERVICE     ,1,"dbus-server"     , "provides an afb service through dbus"},
+  {WS_CLIENT        ,1,"ws-client"       , "bind to an afb service through websocket"},
+  {WS_SERVICE       ,1,"ws-server"       , "provides an afb service through websockets"},
   {SO_BINDING       ,1,"binding"         , "load the binding of path"},
 
   {SET_SESSIONMAX   ,1,"session-max"     , "max count of session simultaneously [default 10]"},
@@ -173,11 +179,11 @@ static void config_set_default (struct afb_config * config)
    // default HTTP port
    if (config->httpdPort == 0)
        config->httpdPort = 1234;
-   
+
    // default binding API timeout
    if (config->apiTimeout == 0)
        config->apiTimeout = DEFLT_API_TIMEOUT;
-   
+
    // default AUTH_TOKEN
    if (config->token == NULL)
                config->token = DEFLT_AUTH_TOKEN;
@@ -204,11 +210,11 @@ static void config_set_default (struct afb_config * config)
        // if directory does not exist createit
        mkdir (config->rootdir,  O_RDWR | S_IRWXU | S_IRGRP);
    }
-   
+
    // if no Angular/HTML5 rootbase let's try '/' as default
    if  (config->rootbase == NULL)
        config->rootbase = "/opa";
-   
+
    if  (config->rootapi == NULL)
        config->rootapi = "/api";
 
@@ -289,7 +295,7 @@ static void parse_arguments(int argc, char *argv[], struct afb_config *config)
        if (optarg == 0) goto needValueForOption;
        if (!sscanf (optarg, "%d", &config->httpdPort)) goto notAnInteger;
        break;
-       
+
     case SET_APITIMEOUT:
        if (optarg == 0) goto needValueForOption;
        if (!sscanf (optarg, "%d", &config->apiTimeout)) goto notAnInteger;
@@ -304,8 +310,8 @@ static void parse_arguments(int argc, char *argv[], struct afb_config *config)
        if (optarg == 0) goto needValueForOption;
        config->rootdir   = optarg;
        INFO("Forcing Rootdir=%s",config->rootdir);
-       break;       
-       
+       break;
+
     case SET_ROOT_BASE:
        if (optarg == 0) goto needValueForOption;
        config->rootbase   = optarg;
@@ -317,7 +323,7 @@ static void parse_arguments(int argc, char *argv[], struct afb_config *config)
        config->rootapi   = optarg;
        INFO("Forcing Rootapi=%s",config->rootapi);
        break;
-       
+
     case SET_ALIAS:
        if (optarg == 0) goto needValueForOption;
        if ((unsigned)config->aliascount < sizeof (config->aliasdir) / sizeof (config->aliasdir[0])) {
@@ -331,9 +337,9 @@ static void parse_arguments(int argc, char *argv[], struct afb_config *config)
             }
        } else {
            ERROR("Too many aliases [max:%d] %s ignored", MAX_ALIAS, optarg);
-       }     
+       }
        break;
-       
+
     case SET_AUTH_TOKEN:
        if (optarg == 0) goto needValueForOption;
        config->token   = optarg;
@@ -384,6 +390,8 @@ static void parse_arguments(int argc, char *argv[], struct afb_config *config)
 
     case DBUS_CLIENT:
     case DBUS_SERVICE:
+    case WS_CLIENT:
+    case WS_SERVICE:
     case SO_BINDING:
        if (optarg == 0) goto needValueForOption;
        add_item(config, optc, optarg);
@@ -401,7 +409,7 @@ static void parse_arguments(int argc, char *argv[], struct afb_config *config)
     }
   }
   free(gnuOptions);
+
   config_set_default  (config);
   return;
 
@@ -559,6 +567,18 @@ static void start_items(struct afb_config_item *item)
        exit(1);
       }
       break;
+    case WS_CLIENT:
+      if (afb_api_ws_add_client(item->value) < 0) {
+        ERROR("can't start the afb-websocket client of path %s",item->value);
+       exit(1);
+      }
+      break;
+    case WS_SERVICE:
+      if (afb_api_ws_add_server(item->value) < 0) {
+        ERROR("can't start the afb-websocket service of path %s",item->value);
+       exit(1);
+      }
+      break;
     case SO_BINDING:
       if (afb_api_so_add_binding(item->value) < 0) {
         ERROR("can't start the binding of path %s",item->value);
@@ -620,6 +640,11 @@ int main(int argc, char *argv[])  {
      return 1;
   }
 
+  if (afb_common_rootdir_set(config->rootdir) < 0) {
+     ERROR("main fail to set common root directory");
+     return 1;
+  }
+
   // let's run this program with a low priority
   nice (20);
 
@@ -639,6 +664,7 @@ int main(int argc, char *argv[])  {
       INFO("entering foreground mode");
   }
 
+   /* start the HTTP server */
    hsrv = start_http_server(config);
    if (hsrv == NULL)
        exit(1);