Improves naming of session's module
[src/app-framework-binder.git] / src / main.c
index ff7daaf..b05c31c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015, 2016 "IoT.bzh"
+ * Copyright (C) 2015, 2016, 2017 "IoT.bzh"
  * Author "Fulup Ar Foll"
  * Author José Bollo <jose.bollo@iot.bzh>
  *
 #include "afb-context.h"
 #include "afb-hreq.h"
 #include "afb-sig-handler.h"
-#include "session.h"
+#include "afb-thread.h"
+#include "afb-session.h"
 #include "verbose.h"
 #include "afb-common.h"
+#include "afb-hook.h"
 
 #include <afb/afb-binding.h>
 
 #error "you should define BINDING_INSTALL_DIR"
 #endif
 
+#define TRACEREQ_NO     0
+#define TRACEREQ_COMMON 1
+#define TRACEREQ_EXTRA  2
+#define TRACEREQ_ALL    3
+
 #define AFB_VERSION    "0.5"
 
 // Define command line option
 #define WS_CLIENT          24
 #define WS_SERVICE         25
 
+#define SET_ROOT_HTTP      26
+
+#define SET_TRACEREQ       27
+
 // Command line structure hold cli --command + help text
 typedef struct {
   int  val;        // command number within application
@@ -96,13 +107,14 @@ typedef struct {
 
 // Supported option
 static  AFB_options cliOptions [] = {
-  {SET_VERBOSE      ,0,"verbose"         , "Verbose Mode"},
+  {SET_VERBOSE      ,0,"verbose"         , "Verbose Mode, repeat to increase verbosity"},
 
   {SET_FORGROUND    ,0,"foreground"      , "Get all in foreground mode"},
   {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]"},
@@ -130,6 +142,8 @@ static  AFB_options cliOptions [] = {
 
   {SET_SESSIONMAX   ,1,"session-max"     , "max count of session simultaneously [default 10]"},
 
+  {SET_TRACEREQ     ,1,"tracereq"        , "log the requests: no, common, extra, all"},
+
   {0, 0, NULL, NULL}
  };
 
@@ -142,7 +156,7 @@ static void printVersion (FILE *file)
    fprintf(file, "\n----------------------------------------- \n");
    fprintf(file, "  AFB [Application Framework Binder] version=%s |\n", AFB_VERSION);
    fprintf(file, " \n");
-   fprintf(file, "  Copyright (C) 2015, 2016 \"IoT.bzh\" [fulup -at- iot.bzh]\n");
+   fprintf(file, "  Copyright (C) 2015, 2016, 2017 \"IoT.bzh\" [fulup -at- iot.bzh]\n");
    fprintf(file, "  AFB comes with ABSOLUTELY NO WARRANTY.\n");
    fprintf(file, "  Licence Apache 2\n\n");
    exit (0);
@@ -312,6 +326,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;
@@ -397,6 +417,15 @@ static void parse_arguments(int argc, char *argv[], struct afb_config *config)
        add_item(config, optc, optarg);
        break;
 
+    case SET_TRACEREQ:
+       if (optarg == 0) goto needValueForOption;
+       if (!strcmp(optarg, "no")) config->tracereq = TRACEREQ_NO;
+       else if (!strcmp(optarg, "common")) config->tracereq = TRACEREQ_COMMON;
+       else if (!strcmp(optarg, "extra")) config->tracereq = TRACEREQ_EXTRA;
+       else if (!strcmp(optarg, "all")) config->tracereq = TRACEREQ_ALL;
+       else goto badMode;
+       break;
+
     case DISPLAY_VERSION:
        if (optarg != 0) goto noValueForOption;
        printVersion(stdout);
@@ -492,7 +521,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;
@@ -501,11 +532,13 @@ 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))
-               return 0;
+       if (config->roothttp != NULL) {
+               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))
                return 0;
@@ -629,19 +662,24 @@ int main(int argc, char *argv[])  {
   start_items(config->items);
   config->items = NULL;
 
-  ctxStoreInit(config->nbSessionMax, config->cntxTimeout, config->token, afb_apis_count());
+  afb_session_init(config->nbSessionMax, config->cntxTimeout, config->token, afb_apis_count());
   if (!afb_hreq_init_cookie(config->httpdPort, config->rootapi, DEFLT_CNTX_TIMEOUT)) {
      ERROR("initialisation of cookies failed");
      exit (1);
   }
 
   if (afb_sig_handler_init() < 0) {
-     ERROR("main fail to initialise signal handlers");
+     ERROR("failed to initialise signal handlers");
      return 1;
   }
 
   if (afb_common_rootdir_set(config->rootdir) < 0) {
-     ERROR("main fail to set common root directory");
+     ERROR("failed to set common root directory");
+     return 1;
+  }
+
+  if (afb_thread_init(3, 1, 20) < 0) {
+     ERROR("failed to initialise threading");
      return 1;
   }
 
@@ -664,6 +702,25 @@ int main(int argc, char *argv[])  {
       INFO("entering foreground mode");
   }
 
+  /* ignore any SIGPIPE */
+  signal(SIGPIPE, SIG_IGN);
+
+  /* install trace of requests */
+  switch(config->tracereq) {
+  default:
+  case TRACEREQ_NO:
+       break;
+  case TRACEREQ_COMMON:
+       afb_hook_req_create(NULL, NULL, NULL, afb_hook_flags_req_common, NULL, NULL);
+       break;
+  case TRACEREQ_EXTRA:
+       afb_hook_req_create(NULL, NULL, NULL, afb_hook_flags_req_extra, NULL, NULL);
+       break;
+  case TRACEREQ_ALL:
+       afb_hook_req_create(NULL, NULL, NULL, afb_hook_flags_req_all, NULL, NULL);
+       break;
+  }
+
    /* start the HTTP server */
    hsrv = start_http_server(config);
    if (hsrv == NULL)