123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451 |
- /*
- 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;
- 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.
- */
|