#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
{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]"},
{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]"},
}
// if no Angular/HTML5 rootbase let's try '/' as default
+ if (config->roothttp == NULL)
+ config->roothttp = ".";
+
if (config->rootbase == NULL)
config->rootbase = "/opa";
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;
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);
+--------------------------------------------------------- */
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;
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))
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);
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);
INFO("entering foreground mode");
}
+ /* start the HTTP server */
hsrv = start_http_server(config);
if (hsrv == NULL)
exit(1);