|
@@ -1,440 +1,438 @@
|
|
|
-/*
|
|
|
- goahead.c -- Main program for GoAhead
|
|
|
-
|
|
|
- Usage: goahead [options] [documents] [IP][:port] ...
|
|
|
- Options:
|
|
|
- --auth authFile # User and role configuration
|
|
|
- --background # Run as a Linux daemon
|
|
|
- --home directory # Change to directory to run
|
|
|
- --log logFile:level # Log to file file at verbosity level
|
|
|
- --route routeFile # Route configuration file
|
|
|
- --verbose # Same as --log stdout:2
|
|
|
- --version # Output version information
|
|
|
-
|
|
|
- Copyright (c) All Rights Reserved. See details at the end of the file.
|
|
|
- */
|
|
|
-
|
|
|
-/********************************* Includes ***********************************/
|
|
|
-
|
|
|
-#include "goahead.h"
|
|
|
-#include "libipmi_struct.h"
|
|
|
-#include "com_IPMI_App.h"
|
|
|
-#include "libipmi_IPM.h"
|
|
|
-#include "com_IPMIDefs.h"
|
|
|
-
|
|
|
-/********************************* Defines ************************************/
|
|
|
-
|
|
|
-static int finished = 0;
|
|
|
-
|
|
|
-/********************************* Forwards ***********************************/
|
|
|
-
|
|
|
-static void initPlatform(void);
|
|
|
-static void logHeader(void);
|
|
|
-static void usage(void);
|
|
|
-
|
|
|
-#if WINDOWS
|
|
|
-static void windowsClose();
|
|
|
-static int windowsInit();
|
|
|
-static LRESULT CALLBACK websWindProc(HWND hwnd, UINT msg, UINT wp, LPARAM lp);
|
|
|
-#endif
|
|
|
-
|
|
|
-#if ME_UNIX_LIKE
|
|
|
-static void sigHandler(int signo);
|
|
|
-#endif
|
|
|
-
|
|
|
-// static void buy(Webs *wp);
|
|
|
-// static void actionTest(Webs *wp);
|
|
|
-// static void personInfoAction(Webs *wp);
|
|
|
-
|
|
|
-
|
|
|
-// static void buy(Webs *wp)
|
|
|
-// {
|
|
|
-// char *name, *age;
|
|
|
-// name = websGetVar(wp, "name", NULL);
|
|
|
-// age = websGetVar(wp, "age", NULL);
|
|
|
-// logmsg(2, "---------------------------------------------");
|
|
|
-// logmsg(2, "name value is : %s", name );
|
|
|
-// logmsg(2, "age value is : %s", age );
|
|
|
-// websSetStatus(wp, 200);
|
|
|
-// websWriteHeaders(wp, 0, 0);
|
|
|
-// websWriteEndHeaders(wp);
|
|
|
-// printf("aa");
|
|
|
-// websWrite(wp, "Name %s", name);
|
|
|
-// websWrite(wp, "Age %s", age);
|
|
|
-// websFlush(wp, 0);
|
|
|
-// websDone(wp);
|
|
|
-// }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-// /*
|
|
|
-// Implement /action/actionTest. Parse the form variables: name, address and echo back.
|
|
|
-// */
|
|
|
-// static void actionTest(Webs *wp)
|
|
|
-// {
|
|
|
-// cchar *name, *address;
|
|
|
-
|
|
|
-// name = websGetVar(wp, "name", NULL);
|
|
|
-// address = websGetVar(wp, "address", NULL);
|
|
|
-// websSetStatus(wp, 200);
|
|
|
-// websWriteHeaders(wp, -1, 0);
|
|
|
-// websWriteEndHeaders(wp);
|
|
|
-// websWrite(wp, "<html><body><h2>name: %s, address: %s</h2></body></html>\n", name, address);
|
|
|
-// websFlush(wp, 0);
|
|
|
-// websDone(wp);
|
|
|
-// }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-/*********************************** Code *************************************/
|
|
|
-
|
|
|
-MAIN(goahead, int argc, char **argv, char **envp)
|
|
|
-{
|
|
|
-
|
|
|
- char *argp, *home, *documents, *endpoints, *endpoint, *route, *auth, *tok, *lspec;
|
|
|
- int argind;
|
|
|
- logmsg(2, "---> log1\n");
|
|
|
- error("---> log1\n");
|
|
|
-#if WINDOWS
|
|
|
- if (windowsInit() < 0) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-#endif
|
|
|
- route = "route.txt";
|
|
|
- auth = "auth.txt";
|
|
|
-
|
|
|
-
|
|
|
-/********************* jimbo test code **************************/
|
|
|
- Webs wp;
|
|
|
-
|
|
|
- getDeviceInfo(&wp);
|
|
|
-
|
|
|
-
|
|
|
-/********************* jimbo test end **************************/
|
|
|
-
|
|
|
- error("---> main enter, argc = %d\n", argc);
|
|
|
- for (argind = 1; argind < argc; argind++) {
|
|
|
- argp = argv[argind];
|
|
|
- error("---> argp = %s\n", argp);
|
|
|
- if (*argp != '-') {
|
|
|
- break;
|
|
|
-
|
|
|
- } else if (smatch(argp, "--auth") || smatch(argp, "-a")) {
|
|
|
- if (argind >= argc) usage();
|
|
|
- auth = argv[++argind];
|
|
|
-
|
|
|
-#if ME_UNIX_LIKE && !MACOSX
|
|
|
- } else if (smatch(argp, "--background") || smatch(argp, "-b")) {
|
|
|
- websSetBackground(1);
|
|
|
-#endif
|
|
|
-
|
|
|
- } else if (smatch(argp, "--debugger") || smatch(argp, "-d") || smatch(argp, "-D")) {
|
|
|
- websSetDebug(1);
|
|
|
-
|
|
|
- } else if (smatch(argp, "--home")) {
|
|
|
- if (argind >= argc) usage();
|
|
|
- home = argv[++argind];
|
|
|
- if (chdir(home) < 0) {
|
|
|
- error("Cannot change directory to %s", home);
|
|
|
- exit(-1);
|
|
|
- }
|
|
|
- error("---> get home\n");
|
|
|
- } else if (smatch(argp, "--log") || smatch(argp, "-l")) {
|
|
|
- if (argind >= argc) usage();
|
|
|
- logSetPath(argv[++argind]);
|
|
|
-
|
|
|
- } else if (smatch(argp, "--verbose") || smatch(argp, "-v")) {
|
|
|
- logSetPath("stdout:2");
|
|
|
- error( "---> get -v\n");
|
|
|
- } else if (smatch(argp, "--route") || smatch(argp, "-r")) {
|
|
|
- route = argv[++argind];
|
|
|
-
|
|
|
- } else if (smatch(argp, "--version") || smatch(argp, "-V")) {
|
|
|
- printf("%s\n", ME_VERSION);
|
|
|
- exit(0);
|
|
|
-
|
|
|
- } else if (*argp == '-' && isdigit((uchar) argp[1])) {
|
|
|
- lspec = sfmt("stdout:%s", &argp[1]);
|
|
|
- logSetPath(lspec);
|
|
|
- wfree(lspec);
|
|
|
-
|
|
|
- } else {
|
|
|
- usage();
|
|
|
- }
|
|
|
- }
|
|
|
- documents = ME_GOAHEAD_DOCUMENTS;
|
|
|
- if (argc > argind) {
|
|
|
- documents = argv[argind++];
|
|
|
- }
|
|
|
- error("---> initPlatform\n");
|
|
|
- initPlatform();
|
|
|
- if (websOpen(documents, route) < 0) {
|
|
|
- error("Cannot initialize server. Exiting.");
|
|
|
- return -1;
|
|
|
- }
|
|
|
-#if ME_GOAHEAD_AUTH
|
|
|
- error("---> ME_GOAHEAD_AUTH: %d\n", ME_GOAHEAD_AUTH);
|
|
|
- if (websLoad(auth) < 0) {
|
|
|
- error("Cannot load %s", auth);
|
|
|
- return -1;
|
|
|
- }
|
|
|
-#endif
|
|
|
- logHeader();
|
|
|
- error("---> argind = %d, argc = %d\n", argind, argc);
|
|
|
- if (argind < argc) {
|
|
|
- while (argind < argc) {
|
|
|
- endpoint = argv[argind++];
|
|
|
- if (websListen(endpoint) < 0) {
|
|
|
- return -1;
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- endpoints = sclone(ME_GOAHEAD_LISTEN);
|
|
|
- for (endpoint = stok(endpoints, ", \t", &tok); endpoint; endpoint = stok(NULL, ", \t,", &tok)) {
|
|
|
-#if !ME_COM_SSL
|
|
|
- error("ME_COM_SSL %d\n", ME_COM_SSL);
|
|
|
- if (strstr(endpoint, "https")) continue;
|
|
|
-#endif
|
|
|
- if (websListen(endpoint) < 0) {
|
|
|
- wfree(endpoints);
|
|
|
- return -1;
|
|
|
- }
|
|
|
- }
|
|
|
- wfree(endpoints);
|
|
|
- }
|
|
|
-#if ME_ROM && KEEP
|
|
|
- /*
|
|
|
- If not using a route/auth config files, then manually create the routes like this:
|
|
|
- If custom matching is required, use websSetRouteMatch. If authentication is required, use websSetRouteAuth.
|
|
|
- */
|
|
|
- websAddRoute("/", "file", 0);
|
|
|
-#endif
|
|
|
-
|
|
|
-//add by lusa start
|
|
|
- // websDefineAction("buy", buy);
|
|
|
- // websDefineAction("test", actionTest);
|
|
|
- websDefineAction("person", personInfoAction);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-// add by lusa end
|
|
|
-#ifdef GOAHEAD_INIT
|
|
|
- /*
|
|
|
- Define your init function in main.me goahead.init, or
|
|
|
- configure with DFLAGS=GOAHEAD_INIT=myInitFunction
|
|
|
- */
|
|
|
- {
|
|
|
- extern int GOAHEAD_INIT();
|
|
|
-
|
|
|
- if (GOAHEAD_INIT() < 0) {
|
|
|
- exit(1);
|
|
|
- }
|
|
|
- }
|
|
|
-#endif
|
|
|
-#if ME_UNIX_LIKE && !MACOSX
|
|
|
- /*
|
|
|
- Service events till terminated
|
|
|
- */
|
|
|
- if (websGetBackground()) {
|
|
|
- if (daemon(0, 0) < 0) {
|
|
|
- error("Cannot run as daemon");
|
|
|
- return -1;
|
|
|
- }
|
|
|
- }
|
|
|
-#endif
|
|
|
- error( "---> websServiceEvents\n");
|
|
|
- websServiceEvents(&finished);
|
|
|
- logmsg(1, "Instructed to exit");
|
|
|
- websClose();
|
|
|
-#if WINDOWS
|
|
|
- windowsClose();
|
|
|
-#endif
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-static void logHeader(void)
|
|
|
-{
|
|
|
- char home[ME_GOAHEAD_LIMIT_STRING];
|
|
|
-
|
|
|
- getcwd(home, sizeof(home));
|
|
|
- logmsg(2, "Configuration for %s", ME_TITLE);
|
|
|
- logmsg(2, "---------------------------------------------");
|
|
|
- logmsg(2, "Version: %s", ME_VERSION);
|
|
|
- logmsg(2, "BuildType: %s", ME_DEBUG ? "Debug" : "Release");
|
|
|
- logmsg(2, "CPU: %s", ME_CPU);
|
|
|
- logmsg(2, "OS: %s", ME_OS);
|
|
|
- logmsg(2, "Host: %s", websGetServer());
|
|
|
- logmsg(2, "Directory: %s", home);
|
|
|
- logmsg(2, "Documents: %s", websGetDocuments());
|
|
|
- logmsg(2, "Configure: %s", ME_CONFIG_CMD);
|
|
|
- logmsg(2, "---------------------------------------------");
|
|
|
-}
|
|
|
-
|
|
|
-static void usage(void) {
|
|
|
- fprintf(stderr, "\n%s Usage:\n\n"
|
|
|
- " %s [options] [documents] [[IPaddress][:port] ...]\n\n"
|
|
|
- " Options:\n"
|
|
|
-#if ME_GOAHEAD_AUTH
|
|
|
- " --auth authFile # User and role configuration\n"
|
|
|
-#endif
|
|
|
-#if ME_UNIX_LIKE && !MACOSX
|
|
|
- " --background # Run as a Unix daemon\n"
|
|
|
-#endif
|
|
|
- " --debugger # Run in debug mode\n"
|
|
|
- " --home directory # Change to directory to run\n"
|
|
|
- " --log logFile:level # Log to file file at verbosity level\n"
|
|
|
- " --route routeFile # Route configuration file\n"
|
|
|
- " --verbose # Same as --log stdout:2\n"
|
|
|
- " --version # Output version information\n\n",
|
|
|
- ME_TITLE, ME_NAME);
|
|
|
- exit(-1);
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-static void initPlatform(void)
|
|
|
-{
|
|
|
-#if ME_UNIX_LIKE
|
|
|
- error("---> initPlatform, ME_OS: %s\n", ME_OS);
|
|
|
- signal(SIGTERM, sigHandler);
|
|
|
- #ifdef SIGPIPE
|
|
|
- error("---> define SIGPIPE\n");
|
|
|
- signal(SIGPIPE, SIG_IGN);
|
|
|
- #endif
|
|
|
-#elif ME_WIN_LIKE
|
|
|
- _fmode=_O_BINARY;
|
|
|
- printf("%s\n", "fff");
|
|
|
-#endif
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-#if ME_UNIX_LIKE
|
|
|
-static void sigHandler(int signo)
|
|
|
-{
|
|
|
- finished = 1;
|
|
|
-}
|
|
|
-#endif
|
|
|
-
|
|
|
-
|
|
|
-//#if WINDOWS
|
|
|
-///*
|
|
|
-// Create a taskbar entry. Register the window class and create a window
|
|
|
-// */
|
|
|
-//static int windowsInit()
|
|
|
-//{
|
|
|
-// HINSTANCE inst;
|
|
|
-// WNDCLASS wc; /* Window class */
|
|
|
-// HMENU hSysMenu;
|
|
|
-// HWND hwnd;
|
|
|
-//
|
|
|
-// inst = websGetInst();
|
|
|
-// wc.style = CS_HREDRAW | CS_VREDRAW;
|
|
|
-// wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
|
|
-// wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
|
-// wc.cbClsExtra = 0;
|
|
|
-// wc.cbWndExtra = 0;
|
|
|
-// wc.hInstance = inst;
|
|
|
-// wc.hIcon = NULL;
|
|
|
-// wc.lpfnWndProc = (WNDPROC) websWindProc;
|
|
|
-// wc.lpszMenuName = wc.lpszClassName = ME_NAME;
|
|
|
-// if (! RegisterClass(&wc)) {
|
|
|
-// return -1;
|
|
|
-// }
|
|
|
-// /*
|
|
|
-// Create a window just so we can have a taskbar to close this web server
|
|
|
-// */
|
|
|
-// hwnd = CreateWindow(ME_NAME, ME_TITLE, WS_MINIMIZE | WS_POPUPWINDOW, CW_USEDEFAULT,
|
|
|
-// 0, 0, 0, NULL, NULL, inst, NULL);
|
|
|
-// if (hwnd == NULL) {
|
|
|
-// return -1;
|
|
|
-// }
|
|
|
-//
|
|
|
-// /*
|
|
|
-// Add the about box menu item to the system menu
|
|
|
-// */
|
|
|
-// hSysMenu = GetSystemMenu(hwnd, FALSE);
|
|
|
-// if (hSysMenu != NULL) {
|
|
|
-// AppendMenu(hSysMenu, MF_SEPARATOR, 0, NULL);
|
|
|
-// }
|
|
|
-// ShowWindow(hwnd, SW_SHOWNORMAL);
|
|
|
-// UpdateWindow(hwnd);
|
|
|
-// return 0;
|
|
|
-//}
|
|
|
-//
|
|
|
-//
|
|
|
-//static void windowsClose()
|
|
|
-//{
|
|
|
-// HINSTANCE inst;
|
|
|
-//
|
|
|
-// inst = websGetInst();
|
|
|
-// UnregisterClass(ME_NAME, inst);
|
|
|
-//}
|
|
|
-//
|
|
|
-//
|
|
|
-///*
|
|
|
-// Main menu window message handler.
|
|
|
-// */
|
|
|
-//static LRESULT CALLBACK websWindProc(HWND hwnd, UINT msg, UINT wp, LPARAM lp)
|
|
|
-//{
|
|
|
-// switch (msg) {
|
|
|
-// case WM_DESTROY:
|
|
|
-// PostQuitMessage(0);
|
|
|
-// finished++;
|
|
|
-// return 0;
|
|
|
-//
|
|
|
-// case WM_SYSCOMMAND:
|
|
|
-// break;
|
|
|
-// }
|
|
|
-// return DefWindowProc(hwnd, msg, wp, lp);
|
|
|
-//}
|
|
|
-//
|
|
|
-//
|
|
|
-///*
|
|
|
-// Check for Windows Messages
|
|
|
-// */
|
|
|
-//WPARAM checkWindowsMsgLoop()
|
|
|
-//{
|
|
|
-// MSG msg;
|
|
|
-//
|
|
|
-// if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
|
|
|
-// if (!GetMessage(&msg, NULL, 0, 0) || msg.message == WM_QUIT) {
|
|
|
-// return msg.wParam;
|
|
|
-// }
|
|
|
-// TranslateMessage(&msg);
|
|
|
-// DispatchMessage(&msg);
|
|
|
-// }
|
|
|
-// return 0;
|
|
|
-//}
|
|
|
-//
|
|
|
-//
|
|
|
-///*
|
|
|
-// Windows message handler
|
|
|
-// */
|
|
|
-//static LRESULT CALLBACK websAboutProc(HWND hwndDlg, uint msg, uint wp, long lp)
|
|
|
-//{
|
|
|
-// LRESULT lResult;
|
|
|
-//
|
|
|
-// lResult = DefWindowProc(hwndDlg, msg, wp, lp);
|
|
|
-//
|
|
|
-// switch (msg) {
|
|
|
-// case WM_CREATE:
|
|
|
-// break;
|
|
|
-// case WM_DESTROY:
|
|
|
-// break;
|
|
|
-// case WM_COMMAND:
|
|
|
-// break;
|
|
|
-// }
|
|
|
-// return lResult;
|
|
|
-//}
|
|
|
-//
|
|
|
-//#endif
|
|
|
-
|
|
|
-/*
|
|
|
- Copyright (c) Embedthis Software. All Rights Reserved.
|
|
|
- This software is distributed under commercial and open source licenses.
|
|
|
- You may use the Embedthis GoAhead open source license or you may acquire
|
|
|
- a commercial license from Embedthis Software. You agree to be fully bound
|
|
|
- by the terms of either license. Consult the LICENSE.md distributed with
|
|
|
- this software for full details and other copyrights.
|
|
|
- */
|
|
|
+/*
|
|
|
+ goahead.c -- Main program for GoAhead
|
|
|
+
|
|
|
+ Usage: goahead [options] [documents] [IP][:port] ...
|
|
|
+ Options:
|
|
|
+ --auth authFile # User and role configuration
|
|
|
+ --background # Run as a Linux daemon
|
|
|
+ --home directory # Change to directory to run
|
|
|
+ --log logFile:level # Log to file file at verbosity level
|
|
|
+ --route routeFile # Route configuration file
|
|
|
+ --verbose # Same as --log stdout:2
|
|
|
+ --version # Output version information
|
|
|
+
|
|
|
+ Copyright (c) All Rights Reserved. See details at the end of the file.
|
|
|
+ */
|
|
|
+
|
|
|
+/********************************* Includes ***********************************/
|
|
|
+
|
|
|
+#include "goahead.h"
|
|
|
+#include "dashboard.h"
|
|
|
+
|
|
|
+/********************************* Defines ************************************/
|
|
|
+
|
|
|
+static int finished = 0;
|
|
|
+
|
|
|
+/********************************* Forwards ***********************************/
|
|
|
+
|
|
|
+static void initPlatform(void);
|
|
|
+static void logHeader(void);
|
|
|
+static void usage(void);
|
|
|
+
|
|
|
+#if WINDOWS
|
|
|
+static void windowsClose();
|
|
|
+static int windowsInit();
|
|
|
+static LRESULT CALLBACK websWindProc(HWND hwnd, UINT msg, UINT wp, LPARAM lp);
|
|
|
+#endif
|
|
|
+
|
|
|
+#if ME_UNIX_LIKE
|
|
|
+static void sigHandler(int signo);
|
|
|
+#endif
|
|
|
+
|
|
|
+// static void buy(Webs *wp);
|
|
|
+// static void actionTest(Webs *wp);
|
|
|
+// static void personInfoAction(Webs *wp);
|
|
|
+
|
|
|
+
|
|
|
+// static void buy(Webs *wp)
|
|
|
+// {
|
|
|
+// char *name, *age;
|
|
|
+// name = websGetVar(wp, "name", NULL);
|
|
|
+// age = websGetVar(wp, "age", NULL);
|
|
|
+// logmsg(2, "---------------------------------------------");
|
|
|
+// logmsg(2, "name value is : %s", name );
|
|
|
+// logmsg(2, "age value is : %s", age );
|
|
|
+// websSetStatus(wp, 200);
|
|
|
+// websWriteHeaders(wp, 0, 0);
|
|
|
+// websWriteEndHeaders(wp);
|
|
|
+// printf("aa");
|
|
|
+// websWrite(wp, "Name %s", name);
|
|
|
+// websWrite(wp, "Age %s", age);
|
|
|
+// websFlush(wp, 0);
|
|
|
+// websDone(wp);
|
|
|
+// }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// /*
|
|
|
+// Implement /action/actionTest. Parse the form variables: name, address and echo back.
|
|
|
+// */
|
|
|
+// static void actionTest(Webs *wp)
|
|
|
+// {
|
|
|
+// cchar *name, *address;
|
|
|
+
|
|
|
+// name = websGetVar(wp, "name", NULL);
|
|
|
+// address = websGetVar(wp, "address", NULL);
|
|
|
+// websSetStatus(wp, 200);
|
|
|
+// websWriteHeaders(wp, -1, 0);
|
|
|
+// websWriteEndHeaders(wp);
|
|
|
+// websWrite(wp, "<html><body><h2>name: %s, address: %s</h2></body></html>\n", name, address);
|
|
|
+// websFlush(wp, 0);
|
|
|
+// websDone(wp);
|
|
|
+// }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/*********************************** Code *************************************/
|
|
|
+
|
|
|
+MAIN(goahead, int argc, char **argv, char **envp)
|
|
|
+{
|
|
|
+
|
|
|
+ char *argp, *home, *documents, *endpoints, *endpoint, *route, *auth, *tok, *lspec;
|
|
|
+ int argind;
|
|
|
+ logmsg(2, "---> log1\n");
|
|
|
+ error("---> log1\n");
|
|
|
+#if WINDOWS
|
|
|
+ if (windowsInit() < 0) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ route = "route.txt";
|
|
|
+ auth = "auth.txt";
|
|
|
+
|
|
|
+
|
|
|
+/********************* jimbo test code **************************/
|
|
|
+ // Webs wp;
|
|
|
+
|
|
|
+ // getDeviceInfo(&wp);
|
|
|
+
|
|
|
+
|
|
|
+/********************* jimbo test end **************************/
|
|
|
+
|
|
|
+ error("---> main enter, argc = %d\n", argc);
|
|
|
+ for (argind = 1; argind < argc; argind++) {
|
|
|
+ argp = argv[argind];
|
|
|
+ error("---> argp = %s\n", argp);
|
|
|
+ if (*argp != '-') {
|
|
|
+ break;
|
|
|
+
|
|
|
+ } else if (smatch(argp, "--auth") || smatch(argp, "-a")) {
|
|
|
+ if (argind >= argc) usage();
|
|
|
+ auth = argv[++argind];
|
|
|
+
|
|
|
+#if ME_UNIX_LIKE && !MACOSX
|
|
|
+ } else if (smatch(argp, "--background") || smatch(argp, "-b")) {
|
|
|
+ websSetBackground(1);
|
|
|
+#endif
|
|
|
+
|
|
|
+ } else if (smatch(argp, "--debugger") || smatch(argp, "-d") || smatch(argp, "-D")) {
|
|
|
+ websSetDebug(1);
|
|
|
+
|
|
|
+ } else if (smatch(argp, "--home")) {
|
|
|
+ if (argind >= argc) usage();
|
|
|
+ home = argv[++argind];
|
|
|
+ if (chdir(home) < 0) {
|
|
|
+ error("Cannot change directory to %s", home);
|
|
|
+ exit(-1);
|
|
|
+ }
|
|
|
+ error("---> get home\n");
|
|
|
+ } else if (smatch(argp, "--log") || smatch(argp, "-l")) {
|
|
|
+ if (argind >= argc) usage();
|
|
|
+ logSetPath(argv[++argind]);
|
|
|
+
|
|
|
+ } else if (smatch(argp, "--verbose") || smatch(argp, "-v")) {
|
|
|
+ logSetPath("stdout:2");
|
|
|
+ error( "---> get -v\n");
|
|
|
+ } else if (smatch(argp, "--route") || smatch(argp, "-r")) {
|
|
|
+ route = argv[++argind];
|
|
|
+
|
|
|
+ } else if (smatch(argp, "--version") || smatch(argp, "-V")) {
|
|
|
+ printf("%s\n", ME_VERSION);
|
|
|
+ exit(0);
|
|
|
+
|
|
|
+ } else if (*argp == '-' && isdigit((uchar) argp[1])) {
|
|
|
+ lspec = sfmt("stdout:%s", &argp[1]);
|
|
|
+ logSetPath(lspec);
|
|
|
+ wfree(lspec);
|
|
|
+
|
|
|
+ } else {
|
|
|
+ usage();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ documents = ME_GOAHEAD_DOCUMENTS;
|
|
|
+ if (argc > argind) {
|
|
|
+ documents = argv[argind++];
|
|
|
+ }
|
|
|
+ error("---> initPlatform\n");
|
|
|
+ initPlatform();
|
|
|
+ if (websOpen(documents, route) < 0) {
|
|
|
+ error("Cannot initialize server. Exiting.");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+#if ME_GOAHEAD_AUTH
|
|
|
+ error("---> ME_GOAHEAD_AUTH: %d\n", ME_GOAHEAD_AUTH);
|
|
|
+ if (websLoad(auth) < 0) {
|
|
|
+ error("Cannot load %s", auth);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ logHeader();
|
|
|
+ error("---> argind = %d, argc = %d\n", argind, argc);
|
|
|
+ if (argind < argc) {
|
|
|
+ while (argind < argc) {
|
|
|
+ endpoint = argv[argind++];
|
|
|
+ if (websListen(endpoint) < 0) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ endpoints = sclone(ME_GOAHEAD_LISTEN);
|
|
|
+ for (endpoint = stok(endpoints, ", \t", &tok); endpoint; endpoint = stok(NULL, ", \t,", &tok)) {
|
|
|
+#if !ME_COM_SSL
|
|
|
+ error("ME_COM_SSL %d\n", ME_COM_SSL);
|
|
|
+ if (strstr(endpoint, "https")) continue;
|
|
|
+#endif
|
|
|
+ if (websListen(endpoint) < 0) {
|
|
|
+ wfree(endpoints);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ wfree(endpoints);
|
|
|
+ }
|
|
|
+#if ME_ROM && KEEP
|
|
|
+ /*
|
|
|
+ If not using a route/auth config files, then manually create the routes like this:
|
|
|
+ If custom matching is required, use websSetRouteMatch. If authentication is required, use websSetRouteAuth.
|
|
|
+ */
|
|
|
+ websAddRoute("/", "file", 0);
|
|
|
+#endif
|
|
|
+
|
|
|
+//add by lusa start
|
|
|
+ // websDefineAction("buy", buy);
|
|
|
+ websDefineAction("getDeviceInfo", getDeviceInfo);
|
|
|
+ websDefineAction("person", personInfoAction);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// add by lusa end
|
|
|
+#ifdef GOAHEAD_INIT
|
|
|
+ /*
|
|
|
+ Define your init function in main.me goahead.init, or
|
|
|
+ configure with DFLAGS=GOAHEAD_INIT=myInitFunction
|
|
|
+ */
|
|
|
+ {
|
|
|
+ extern int GOAHEAD_INIT();
|
|
|
+
|
|
|
+ if (GOAHEAD_INIT() < 0) {
|
|
|
+ exit(1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
+#if ME_UNIX_LIKE && !MACOSX
|
|
|
+ /*
|
|
|
+ Service events till terminated
|
|
|
+ */
|
|
|
+ if (websGetBackground()) {
|
|
|
+ if (daemon(0, 0) < 0) {
|
|
|
+ error("Cannot run as daemon");
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ error( "---> websServiceEvents\n");
|
|
|
+ websServiceEvents(&finished);
|
|
|
+ logmsg(1, "Instructed to exit");
|
|
|
+ websClose();
|
|
|
+#if WINDOWS
|
|
|
+ windowsClose();
|
|
|
+#endif
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static void logHeader(void)
|
|
|
+{
|
|
|
+ char home[ME_GOAHEAD_LIMIT_STRING];
|
|
|
+
|
|
|
+ getcwd(home, sizeof(home));
|
|
|
+ logmsg(2, "Configuration for %s", ME_TITLE);
|
|
|
+ logmsg(2, "---------------------------------------------");
|
|
|
+ logmsg(2, "Version: %s", ME_VERSION);
|
|
|
+ logmsg(2, "BuildType: %s", ME_DEBUG ? "Debug" : "Release");
|
|
|
+ logmsg(2, "CPU: %s", ME_CPU);
|
|
|
+ logmsg(2, "OS: %s", ME_OS);
|
|
|
+ logmsg(2, "Host: %s", websGetServer());
|
|
|
+ logmsg(2, "Directory: %s", home);
|
|
|
+ logmsg(2, "Documents: %s", websGetDocuments());
|
|
|
+ logmsg(2, "Configure: %s", ME_CONFIG_CMD);
|
|
|
+ logmsg(2, "---------------------------------------------");
|
|
|
+}
|
|
|
+
|
|
|
+static void usage(void) {
|
|
|
+ fprintf(stderr, "\n%s Usage:\n\n"
|
|
|
+ " %s [options] [documents] [[IPaddress][:port] ...]\n\n"
|
|
|
+ " Options:\n"
|
|
|
+#if ME_GOAHEAD_AUTH
|
|
|
+ " --auth authFile # User and role configuration\n"
|
|
|
+#endif
|
|
|
+#if ME_UNIX_LIKE && !MACOSX
|
|
|
+ " --background # Run as a Unix daemon\n"
|
|
|
+#endif
|
|
|
+ " --debugger # Run in debug mode\n"
|
|
|
+ " --home directory # Change to directory to run\n"
|
|
|
+ " --log logFile:level # Log to file file at verbosity level\n"
|
|
|
+ " --route routeFile # Route configuration file\n"
|
|
|
+ " --verbose # Same as --log stdout:2\n"
|
|
|
+ " --version # Output version information\n\n",
|
|
|
+ ME_TITLE, ME_NAME);
|
|
|
+ exit(-1);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static void initPlatform(void)
|
|
|
+{
|
|
|
+#if ME_UNIX_LIKE
|
|
|
+ error("---> initPlatform, ME_OS: %s\n", ME_OS);
|
|
|
+ signal(SIGTERM, sigHandler);
|
|
|
+ #ifdef SIGPIPE
|
|
|
+ error("---> define SIGPIPE\n");
|
|
|
+ signal(SIGPIPE, SIG_IGN);
|
|
|
+ #endif
|
|
|
+#elif ME_WIN_LIKE
|
|
|
+ _fmode=_O_BINARY;
|
|
|
+ printf("%s\n", "fff");
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+#if ME_UNIX_LIKE
|
|
|
+static void sigHandler(int signo)
|
|
|
+{
|
|
|
+ finished = 1;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+//#if WINDOWS
|
|
|
+///*
|
|
|
+// Create a taskbar entry. Register the window class and create a window
|
|
|
+// */
|
|
|
+//static int windowsInit()
|
|
|
+//{
|
|
|
+// HINSTANCE inst;
|
|
|
+// WNDCLASS wc; /* Window class */
|
|
|
+// HMENU hSysMenu;
|
|
|
+// HWND hwnd;
|
|
|
+//
|
|
|
+// inst = websGetInst();
|
|
|
+// wc.style = CS_HREDRAW | CS_VREDRAW;
|
|
|
+// wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
|
|
+// wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
|
|
+// wc.cbClsExtra = 0;
|
|
|
+// wc.cbWndExtra = 0;
|
|
|
+// wc.hInstance = inst;
|
|
|
+// wc.hIcon = NULL;
|
|
|
+// wc.lpfnWndProc = (WNDPROC) websWindProc;
|
|
|
+// wc.lpszMenuName = wc.lpszClassName = ME_NAME;
|
|
|
+// if (! RegisterClass(&wc)) {
|
|
|
+// return -1;
|
|
|
+// }
|
|
|
+// /*
|
|
|
+// Create a window just so we can have a taskbar to close this web server
|
|
|
+// */
|
|
|
+// hwnd = CreateWindow(ME_NAME, ME_TITLE, WS_MINIMIZE | WS_POPUPWINDOW, CW_USEDEFAULT,
|
|
|
+// 0, 0, 0, NULL, NULL, inst, NULL);
|
|
|
+// if (hwnd == NULL) {
|
|
|
+// return -1;
|
|
|
+// }
|
|
|
+//
|
|
|
+// /*
|
|
|
+// Add the about box menu item to the system menu
|
|
|
+// */
|
|
|
+// hSysMenu = GetSystemMenu(hwnd, FALSE);
|
|
|
+// if (hSysMenu != NULL) {
|
|
|
+// AppendMenu(hSysMenu, MF_SEPARATOR, 0, NULL);
|
|
|
+// }
|
|
|
+// ShowWindow(hwnd, SW_SHOWNORMAL);
|
|
|
+// UpdateWindow(hwnd);
|
|
|
+// return 0;
|
|
|
+//}
|
|
|
+//
|
|
|
+//
|
|
|
+//static void windowsClose()
|
|
|
+//{
|
|
|
+// HINSTANCE inst;
|
|
|
+//
|
|
|
+// inst = websGetInst();
|
|
|
+// UnregisterClass(ME_NAME, inst);
|
|
|
+//}
|
|
|
+//
|
|
|
+//
|
|
|
+///*
|
|
|
+// Main menu window message handler.
|
|
|
+// */
|
|
|
+//static LRESULT CALLBACK websWindProc(HWND hwnd, UINT msg, UINT wp, LPARAM lp)
|
|
|
+//{
|
|
|
+// switch (msg) {
|
|
|
+// case WM_DESTROY:
|
|
|
+// PostQuitMessage(0);
|
|
|
+// finished++;
|
|
|
+// return 0;
|
|
|
+//
|
|
|
+// case WM_SYSCOMMAND:
|
|
|
+// break;
|
|
|
+// }
|
|
|
+// return DefWindowProc(hwnd, msg, wp, lp);
|
|
|
+//}
|
|
|
+//
|
|
|
+//
|
|
|
+///*
|
|
|
+// Check for Windows Messages
|
|
|
+// */
|
|
|
+//WPARAM checkWindowsMsgLoop()
|
|
|
+//{
|
|
|
+// MSG msg;
|
|
|
+//
|
|
|
+// if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
|
|
|
+// if (!GetMessage(&msg, NULL, 0, 0) || msg.message == WM_QUIT) {
|
|
|
+// return msg.wParam;
|
|
|
+// }
|
|
|
+// TranslateMessage(&msg);
|
|
|
+// DispatchMessage(&msg);
|
|
|
+// }
|
|
|
+// return 0;
|
|
|
+//}
|
|
|
+//
|
|
|
+//
|
|
|
+///*
|
|
|
+// Windows message handler
|
|
|
+// */
|
|
|
+//static LRESULT CALLBACK websAboutProc(HWND hwndDlg, uint msg, uint wp, long lp)
|
|
|
+//{
|
|
|
+// LRESULT lResult;
|
|
|
+//
|
|
|
+// lResult = DefWindowProc(hwndDlg, msg, wp, lp);
|
|
|
+//
|
|
|
+// switch (msg) {
|
|
|
+// case WM_CREATE:
|
|
|
+// break;
|
|
|
+// case WM_DESTROY:
|
|
|
+// break;
|
|
|
+// case WM_COMMAND:
|
|
|
+// break;
|
|
|
+// }
|
|
|
+// return lResult;
|
|
|
+//}
|
|
|
+//
|
|
|
+//#endif
|
|
|
+
|
|
|
+/*
|
|
|
+ Copyright (c) Embedthis Software. All Rights Reserved.
|
|
|
+ This software is distributed under commercial and open source licenses.
|
|
|
+ You may use the Embedthis GoAhead open source license or you may acquire
|
|
|
+ a commercial license from Embedthis Software. You agree to be fully bound
|
|
|
+ by the terms of either license. Consult the LICENSE.md distributed with
|
|
|
+ this software for full details and other copyrights.
|
|
|
+ */
|
|
|
+
|