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