/* 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, "

name: %s, address: %s

\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; IPMI20_SESSION_T TestSession; uint8_t resBuf[100]; uint32_t resLen; LIBIPMI_CreateSession(&wp.ipmi_session, 10); getDeviceInfo(&wp); // LIBIPMI_Send_RAW_IPMI2_0_Command(&wp.ipmi_session, // 0x2e<<2, 0x01, // NULL, 0, // resBuf, &resLen, // 10); LIBIPMI_CloseSession( &wp.ipmi_session ); /********************* 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. */