X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fmain.c;h=d58a897a064b86ad9f41325a5ca58edf510845d0;hb=fcef933b69ccc363ad10d9f7308f02c5dc474ff6;hp=4ea70f96bb38ab0a914e911f62e168e8b6f6bedd;hpb=f113d2b31333538f5784de5ee5f02bc19cc603e4;p=src%2Fapp-framework-binder.git diff --git a/src/main.c b/src/main.c index 4ea70f96..d58a897a 100644 --- a/src/main.c +++ b/src/main.c @@ -30,8 +30,10 @@ #include "afb-plugin.h" #include "local-def.h" -#include "afb-apis.h" +#include "afb-hswitch.h" +#include "afb-api-so.h" #include "afb-hsrv.h" +#include "afb-hreq.h" #include "session.h" #include "verbose.h" #include "utils-upoll.h" @@ -46,7 +48,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 +69,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 +130,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 +328,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 +364,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 +494,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,26 +508,22 @@ 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); } if (session->config->ldpaths) - afb_apis_add_pathset(session->config->ldpaths); + afb_api_so_add_pathset(session->config->ldpaths); - ctxStoreInit(CTX_NBCLIENTS, session->config->cntxTimeout, afb_apis_count(), session->config->token); + ctxStoreInit(CTX_NBCLIENTS, session->config->cntxTimeout, session->config->token); + if (!afb_hreq_init_cookie(session->config->httpdPort, session->config->rootapi, DEFLT_CNTX_TIMEOUT)) { + fprintf (stderr, "ERR: initialisation of cookies failed\n"); + exit (1); + } 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 +539,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 +562,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 +570,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_hswitch_websocket_switch, NULL, 20)) + return 0; + + if (!afb_hsrv_add_handler(hsrv, config->rootapi, afb_hswitch_apis, 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_hswitch_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; +} +