Add the option roothttp
[src/app-framework-binder.git] / src / main.c
index c474faf..28b452c 100644 (file)
@@ -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"
 
 #define SET_SESSIONMAX     23
 
+#define WS_CLIENT          24
+#define WS_SERVICE         25
+
+#define SET_ROOT_HTTP      26
+
 // Command line structure hold cli --command + help text
 typedef struct {
   int  val;        // command number within application
@@ -98,7 +104,8 @@ static  AFB_options cliOptions [] = {
   {SET_BACKGROUND   ,0,"daemon"          , "Get all in background mode"},
 
   {SET_TCP_PORT     ,1,"port"            , "HTTP listening TCP port  [default 1234]"},
-  {SET_ROOT_DIR     ,1,"rootdir"         , "HTTP Root Directory [default $HOME/.AFB]"},
+  {SET_ROOT_DIR     ,1,"rootdir"         , "Root Directory [default $HOME/.AFB]"},
+  {SET_ROOT_HTTP    ,1,"roothttp"        , "HTTP Root Directory [default rootdir]"},
   {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]"},
@@ -120,6 +127,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]"},
@@ -206,6 +215,9 @@ static void config_set_default (struct afb_config * config)
    }
 
    // if no Angular/HTML5 rootbase let's try '/' as default
+   if  (config->roothttp == NULL)
+       config->roothttp = ".";
+
    if  (config->rootbase == NULL)
        config->rootbase = "/opa";
 
@@ -306,6 +318,12 @@ static void parse_arguments(int argc, char *argv[], struct afb_config *config)
        INFO("Forcing Rootdir=%s",config->rootdir);
        break;
 
+    case SET_ROOT_HTTP:
+       if (optarg == 0) goto needValueForOption;
+       config->roothttp   = optarg;
+       INFO("Forcing Root HTTP=%s",config->roothttp);
+       break;
+
     case SET_ROOT_BASE:
        if (optarg == 0) goto needValueForOption;
        config->rootbase   = optarg;
@@ -384,6 +402,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);
@@ -484,7 +504,9 @@ static void daemonize(struct afb_config *config)
  +--------------------------------------------------------- */
 static int init_http_server(struct afb_hsrv *hsrv, struct afb_config * config)
 {
-       int idx;
+       int idx, dfd;
+
+       dfd = afb_common_rootdir_get_fd();
 
        if (!afb_hsrv_add_handler(hsrv, config->rootapi, afb_hswitch_websocket_switch, NULL, 20))
                return 0;
@@ -493,10 +515,10 @@ static int init_http_server(struct afb_hsrv *hsrv, struct afb_config * config)
                return 0;
 
        for (idx = 0; idx < config->aliascount; idx++)
-               if (!afb_hsrv_add_alias (hsrv, config->aliasdir[idx].url, config->aliasdir[idx].path, 0, 0))
+               if (!afb_hsrv_add_alias (hsrv, config->aliasdir[idx].url, dfd, config->aliasdir[idx].path, 0, 0))
                        return 0;
 
-       if (!afb_hsrv_add_alias(hsrv, "", config->rootdir, -10, 1))
+       if (!afb_hsrv_add_alias(hsrv, "", dfd, config->roothttp, -10, 1))
                return 0;
 
        if (!afb_hsrv_add_handler(hsrv, config->rootbase, afb_hswitch_one_page_api_redirect, NULL, -20))
@@ -559,6 +581,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 +654,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 +678,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);