/* * Create a new server. There is typically only one server with one or more (virtual) hosts. */ MaServer *maCreateServer(MaHttp *http, cchar *name, cchar *root, cchar *ipAddr, int port) { MaServer *server; MaHostAddress *hostAddress; MaListen *listen; static int staticModulesLoaded = 0; mprAssert(http); mprAssert(name && *name); server = mprAllocObjZeroed(http, MaServer); if (server == 0) { return 0; } server->hosts = mprCreateList(server); server->listens = mprCreateList(server); server->hostAddresses = mprCreateList(server); server->name = mprStrdup(server, name); server->http = http; maAddServer(http, server); maSetServerRoot(server, root); if (ipAddr && port > 0) { listen = maCreateListen(server, ipAddr, port, 0); maAddListen(server, listen); hostAddress = maCreateHostAddress(server, ipAddr, port); mprAddItem(server->hostAddresses, hostAddress); } maSetDefaultServer(http, server); if (!staticModulesLoaded) { staticModulesLoaded = 1; maLoadStaticModules(http); } return server; }
static int realMain(MprCmdLine *cmdLine) { MaHttp *http; char portNumBuf[MPR_MAX_IP_PORT]; char *argp, *logSpec; int c, errflg, kill, poolThreads, outputVersion; mprSetMemHandler(memoryFailure); mprCreateMemHeap(0, 16 * 1024, MAXINT); program = mprGetBaseName(cmdLine->getArgv()[0]); poolThreads = -1; kill = errflg = 0; logSpec = 0; outputVersion = 0; autoScan = 1; background = 0; serverRoot = 0; docRoot = "web"; #if !WIN && !WINCE && !VXWORKS if (getuid()) { ipAddr = mprStrdup("4000"); } else { mprSprintf(portNumBuf, sizeof(portNumBuf), "%d", MA_SERVER_DEFAULT_PORT_NUM); ipAddr = mprStrdup(portNumBuf); } #else mprSprintf(portNumBuf, sizeof(portNumBuf), "%d", MA_SERVER_DEFAULT_PORT_NUM); ipAddr = mprStrdup(portNumBuf); #endif while ((c = cmdLine->next(&argp)) != EOF) { switch(c) { case 'A': autoScan = 0; break; case 'a': mprFree(ipAddr); ipAddr = mprStrdup(argp); break; case 'b': background++; break; case 'c': /* Ignored */ break; case 'D': mprSetDebugMode(1); break; case 'd': docRoot = argp; break; case 'f': #if BLD_FEATURE_CONFIG_PARSE configFile = argp; autoScan = 0; #else errflg++; #endif break; case 'k': kill++; logSpec = 0; break; case 'l': logSpec = (*argp) ? argp : 0; break; case 'm': mprRequestMemStats(1); break; case 'r': serverRoot = argp; break; case 't': poolThreads = atoi(argp); break; // // FUTURE -- just for test. Will be removed // case 'w': writeFile = argp; break; case 'v': outputVersion++; break; #if WIN && BLD_FEATURE_RUN_AS_SERVICE case 'i': serviceOp = MPR_INSTALL_SERVICE; if (strcmp(argp, "none") == 0) { serviceCmdLine = ""; } else if (strcmp(argp, "default") == 0) { serviceCmdLine = "-b -c -f " BLD_PRODUCT ".conf"; } else { serviceCmdLine = argp; } break; case 'g': serviceOp = MPR_GO_SERVICE; break; case 's': serviceOp = MPR_STOP_SERVICE; break; case 'u': serviceOp = MPR_UNINSTALL_SERVICE; break; #endif default: errflg++; break; } } if (errflg) { printUsage(program); return MPR_ERR_BAD_SYNTAX; } mp = new Mpr(program); mp->setAppName(BLD_PRODUCT); mp->setAppTitle(BLD_NAME); mp->setHeadless(isService || background); #if BLD_HOST_UNIX || VXWORKS initSignals(); #endif if (kill) { mp->killMpr(); delete mp; exit(0); } if (outputVersion) { printVersion(); delete mp; exit(0); } // // Create the top level HTTP service and default HTTP server // http = new MaHttp(); server = new MaServer(http, "default"); setupFileSystem(); setLogging(logSpec); // // Confirm the location of the server root // if (locateServerRoot(serverRoot) < 0) { mprError(MPR_L, MPR_USER, "Can't start server, exiting."); exit(2); } if (securityChecks(cmdLine->getArgv()[0]) < 0) { exit(3); } #if WIN #if BLD_FEATURE_RUN_AS_SERVICE if (serviceOp) { windowsServiceOps(); delete mp; return 0; } #endif if (windowsInit() < 0) { delete mp; return MPR_ERR_CANT_INITIALIZE; } #endif // // Start the MPR. This starts Timer, Socket and Pool services // if (mp->start(MPR_KILLABLE) < 0) { mprError(MPR_L, MPR_USER, "Can't start MPR for %s", mp->getAppTitle()); delete mp; return MPR_ERR_CANT_INITIALIZE; } // // Load the statically linked modules // maLoadStaticModules(); if (setupServer(http, poolThreads) < 0) { mprError(MPR_L, MPR_USER, "Can't configure the server, exiting."); exit(6); } #if BLD_FEATURE_CONFIG_SAVE if (writeFile) { server->saveConfig(writeFile); mprLog(0, "Configuration saved to %s\nExiting ...\n", writeFile); exit(0); } #endif if (http->start() < 0) { mprError(MPR_L, MPR_USER, "Can't start server, exiting."); exit(7); } else { #if LINUX && BLD_FEATURE_RUN_AS_SERVICE if (background && mp->makeDaemon(1) < 0) { mprError(MPR_L, MPR_USER, "Could not run in the background"); } else #endif { #if BLD_FEATURE_MULTITHREAD mprLog(MPR_CONFIG, "HTTP services are ready with %d pool threads\n", http->getLimits()->maxThreads); #else mprLog(MPR_CONFIG, "HTTP services are ready (single-threaded).\n"); #endif } mp->setHeadless(1); eventLoop(); mprLog(MPR_WARN, "Stopping HTTP services.\n"); http->stop(); } #if WIN if (trayIcon > 0) { closeTrayIcon(); } if (trayTimer) { trayTimer->stop(MPR_TIMEOUT_STOP); trayTimer->dispose(); trayTimer = 0; } #endif mprLog(MPR_WARN, "Stopping MPR services.\n"); mp->stop(0); maUnloadStaticModules(); delete server; delete http; delete mp; mprFree(ipAddr); #if BLD_FEATURE_ROMFS delete romFileSystem; #endif #if BLD_FEATURE_LOG mprLog(MPR_WARN, "Closing log.\n"); if (logger) { delete logger; } #if WIN if (dialog) { delete dialog; } #endif #endif return 0; }