more simplification
[src/app-framework-binder.git] / src / main.c
index 4ea70f9..b0261a4 100644 (file)
@@ -32,6 +32,7 @@
 #include "local-def.h"
 #include "afb-apis.h"
 #include "afb-hsrv.h"
+#include "afb-hreq.h"
 #include "session.h"
 #include "verbose.h"
 #include "utils-upoll.h"
@@ -46,7 +47,6 @@
 #define SET_VERBOSE        1
 #define SET_BACKGROUND     2
 #define SET_FORGROUND      3
-#define SET_FAKE_MOD       4
 
 #define SET_TCP_PORT       5
 #define SET_ROOT_DIR       6
@@ -68,6 +68,8 @@
 #define SET_MODE           18
 #define SET_READYFD        19
 
+static struct afb_hsrv *start(AFB_config * config);
+
 // Command line structure hold cli --command + help text
 typedef struct {
   int  val;        // command number within application
@@ -127,68 +129,62 @@ static void printVersion (void)
 }
 
 // load config from disk and merge with CLI option
-static void config_set_default (AFB_session * session)
+static void config_set_default (AFB_config * config)
 {
-   static char cacheTimeout [10];
-   
    // default HTTP port
-   if (session->config->httpdPort == 0)
-       session->config->httpdPort = 1234;
+   if (config->httpdPort == 0)
+       config->httpdPort = 1234;
    
    // default Plugin API timeout
-   if (session->config->apiTimeout == 0)
-       session->config->apiTimeout = DEFLT_API_TIMEOUT;
+   if (config->apiTimeout == 0)
+       config->apiTimeout = DEFLT_API_TIMEOUT;
    
    // default AUTH_TOKEN
-   if (session->config->token == NULL)
-               session->config->token = DEFLT_AUTH_TOKEN;
+   if (config->token == NULL)
+               config->token = DEFLT_AUTH_TOKEN;
 
    // cache timeout default one hour
-   if (session->config->cacheTimeout == 0)
-               session->config->cacheTimeout = DEFLT_CACHE_TIMEOUT;
+   if (config->cacheTimeout == 0)
+               config->cacheTimeout = DEFLT_CACHE_TIMEOUT;
 
    // cache timeout default one hour
-   if (session->config->cntxTimeout == 0)
-               session->config->cntxTimeout = DEFLT_CNTX_TIMEOUT;
-
-   if (session->config->rootdir == NULL) {
-       session->config->rootdir = getenv("AFBDIR");
-       if (session->config->rootdir == NULL) {
-           session->config->rootdir = malloc (512);
-           strncpy  (session->config->rootdir, getenv("HOME"),512);
-           strncat (session->config->rootdir, "/.AFB",512);
+   if (config->cntxTimeout == 0)
+               config->cntxTimeout = DEFLT_CNTX_TIMEOUT;
+
+   if (config->rootdir == NULL) {
+       config->rootdir = getenv("AFBDIR");
+       if (config->rootdir == NULL) {
+           config->rootdir = malloc (512);
+           strncpy (config->rootdir, getenv("HOME"),512);
+           strncat (config->rootdir, "/.AFB",512);
        }
        // if directory does not exist createit
-       mkdir (session->config->rootdir,  O_RDWR | S_IRWXU | S_IRGRP);
+       mkdir (config->rootdir,  O_RDWR | S_IRWXU | S_IRGRP);
    }
    
    // if no Angular/HTML5 rootbase let's try '/' as default
-   if  (session->config->rootbase == NULL)
-       session->config->rootbase = "/opa";
+   if  (config->rootbase == NULL)
+       config->rootbase = "/opa";
    
-   if  (session->config->rootapi == NULL)
-       session->config->rootapi = "/api";
+   if  (config->rootapi == NULL)
+       config->rootapi = "/api";
 
-   if  (session->config->ldpaths == NULL)
-       session->config->ldpaths = PLUGIN_INSTALL_DIR;
+   if  (config->ldpaths == NULL)
+       config->ldpaths = PLUGIN_INSTALL_DIR;
 
    // if no session dir create a default path from rootdir
-   if  (session->config->sessiondir == NULL) {
-       session->config->sessiondir = malloc (512);
-       strncpy (session->config->sessiondir, session->config->rootdir, 512);
-       strncat (session->config->sessiondir, "/sessions",512);
+   if  (config->sessiondir == NULL) {
+       config->sessiondir = malloc (512);
+       strncpy (config->sessiondir, config->rootdir, 512);
+       strncat (config->sessiondir, "/sessions",512);
    }
 
    // if no config dir create a default path from sessiondir
-   if  (session->config->console == NULL) {
-       session->config->console = malloc (512);
-       strncpy (session->config->console, session->config->sessiondir, 512);
-       strncat (session->config->console, "/AFB-console.out",512);
+   if  (config->console == NULL) {
+       config->console = malloc (512);
+       strncpy (config->console, config->sessiondir, 512);
+       strncat (config->console, "/AFB-console.out",512);
    }
-
-   // cacheTimeout is an integer but HTTPd wants it as a string
-   snprintf (cacheTimeout, sizeof (cacheTimeout),"%d", session->config->cacheTimeout);
-   session->cacheTimeout = cacheTimeout; // httpd uses cacheTimeout string version
 }
 
 
@@ -331,14 +327,9 @@ static void parse_arguments(int argc, char *argv[], AFB_session *session)
        if (!sscanf (optarg, "%d", &session->config->cacheTimeout)) goto notAnInteger;
        break;
 
-    case SET_FAKE_MOD:
-       if (optarg != 0) goto noValueForOption;
-       session->fakemod  = 1;
-       break;
-
     case SET_FORGROUND:
        if (optarg != 0) goto noValueForOption;
-       session->foreground  = 1;
+       session->background  = 0;
        break;
 
     case SET_BACKGROUND:
@@ -372,7 +363,7 @@ static void parse_arguments(int argc, char *argv[], AFB_session *session)
   }
   free(gnuOptions);
  
-  config_set_default  (session);
+  config_set_default  (session->config);
   return;
 
 
@@ -502,8 +493,8 @@ static void daemonize(AFB_session *session)
  +--------------------------------------------------------- */
 
 int main(int argc, char *argv[])  {
-  int rc;
   AFB_session    *session;
+  struct afb_hsrv *hsrv;
 
   // open syslog if ever needed
   openlog("afb-daemon", 0, LOG_DAEMON);
@@ -516,10 +507,6 @@ int main(int argc, char *argv[])  {
   parse_arguments(argc, argv, session);
 
   // ------------------ sanity check ----------------------------------------
-  if  ((session->background) && (session->foreground)) {
-    fprintf (stderr, "ERR: cannot select foreground & background at the same time\n");
-     exit (1);
-  }
   if (session->config->httpdPort <= 0) {
     fprintf (stderr, "ERR: no port is defined\n");
      exit (1);
@@ -532,10 +519,6 @@ int main(int argc, char *argv[])  {
 
   install_error_handlers();
 
-  // ------------------ Some useful default values -------------------------
-  if  ((session->background == 0) && (session->foreground == 0))
-       session->foreground = 1;
-
   // ------------------ clean exit on CTR-C signal ------------------------
   if (signal (SIGINT, signalQuit) == SIG_ERR || signal (SIGABRT, signalQuit) == SIG_ERR) {
      fprintf (stderr, "ERR: main fail to install Signal handler\n");
@@ -551,31 +534,19 @@ int main(int argc, char *argv[])  {
 
   if (verbosity) fprintf (stderr, "AFB: notice Init config done\n");
 
-  // ---- run in foreground mode --------------------
-  if (session->foreground) {
-
-        if (verbosity) fprintf (stderr,"AFB: notice Foreground mode\n");
-
-  } // end foreground
-
-  // --------- run in background mode -----------
+  // --------- run -----------
   if (session->background) {
-
+      // --------- in background mode -----------
       if (verbosity) printf ("AFB: Entering background mode\n");
-
       daemonize(session);
+  } else {
+      // ---- in foreground mode --------------------
+      if (verbosity) fprintf (stderr,"AFB: notice Foreground mode\n");
 
-         // if everything look OK then look forever
-         syslog (LOG_ERR, "AFB: Entering infinite loop in background mode");
-
-
-  } // end background-foreground
-
-
-  // ------ Start httpd server
+  }
 
-   rc = afb_hsrv_start (session);
-   if (!rc)
+   hsrv = start (session->config);
+   if (hsrv == NULL)
        exit(1);
 
    if (session->readyfd != 0) {
@@ -586,7 +557,7 @@ int main(int argc, char *argv[])  {
 
    // infinite loop
   for(;;)
-   upoll_wait(30000); 
+    upoll_wait(30000); 
 
    if (verbosity)
        fprintf (stderr, "hoops returned from infinite loop [report bug]\n");
@@ -594,4 +565,60 @@ int main(int argc, char *argv[])  {
   return 0;
 }
 
+static int init(struct afb_hsrv *hsrv, AFB_config * config)
+{
+       int idx;
+
+       if (!afb_hsrv_add_handler(hsrv, config->rootapi, afb_hreq_websocket_switch, NULL, 20))
+               return 0;
+
+       if (!afb_hsrv_add_handler(hsrv, config->rootapi, afb_hreq_rest_api, NULL, 10))
+               return 0;
+
+       for (idx = 0; config->aliasdir[idx].url != NULL; idx++)
+               if (!afb_hsrv_add_alias (hsrv, config->aliasdir[idx].url, config->aliasdir[idx].path, 0))
+                       return 0;
+
+       if (!afb_hsrv_add_alias(hsrv, "", config->rootdir, -10))
+               return 0;
+
+       if (!afb_hsrv_add_handler(hsrv, config->rootbase, afb_hreq_one_page_api_redirect, NULL, -20))
+               return 0;
+
+       return 1;
+}
+
+static struct afb_hsrv *start(AFB_config * config)
+{
+       int rc;
+       struct afb_hsrv *hsrv;
+
+       hsrv = afb_hsrv_create();
+       if (hsrv == NULL) {
+               fprintf(stderr, "memory allocation failure\n");
+               return NULL;
+       }
+
+       if (!afb_hsrv_set_cache_timeout(hsrv, config->cacheTimeout)
+       || !init(hsrv, config)) {
+               printf("Error: initialisation of httpd failed");
+               afb_hsrv_put(hsrv);
+               return NULL;
+       }
+
+       if (verbosity) {
+               printf("AFB:notice Waiting port=%d rootdir=%s\n", config->httpdPort, config->rootdir);
+               printf("AFB:notice Browser URL= http:/*localhost:%d\n", config->httpdPort);
+       }
+
+       rc = afb_hsrv_start(hsrv, (uint16_t) config->httpdPort, 15);
+       if (!rc) {
+               printf("Error: starting of httpd failed");
+               afb_hsrv_put(hsrv);
+               return NULL;
+       }
+
+       return hsrv;
+}
+