int main(int argc, char* argv[]) { //LOGFILE.open("C:\\wlanauto4_log.txt"); if (argc > 1) { if (strcmp(argv[1], "-i") == 0) { if (InstallService()) printf("Service installed sucessfully\n"); else printf("Error installing service\n"); } if (strcmp(argv[1], "-u") == 0) { if (UninstallService()) printf("Service uninstalled sucessfully\n"); else printf("Error uninstalling service\n"); } } else { // Start the service SERVICE_TABLE_ENTRY Table[] = {{"WlanAuto", ServiceMain}, {NULL, NULL}}; StartServiceCtrlDispatcher(Table); } //LOGFILE.close(); return 0; }
int wmain(int argc, wchar_t *argv[]) { std::cout << " sleeping for debuger attachment" << std::endl; Sleep(10000); if (argc > 1 && (*argv[1] == L'-' || *argv[1] == L'/')) { if (_wcsicmp(L"install", argv[1] + 1) == 0) { InstallService( SERVICE_NAME, SERVICE_DISPLAY_NAME, SERVICE_STARTUP_TYPE, SERVICE_DEPENDENCIES, SERVICE_ACCOUNT, SERVICE_PASSWORD ); } else if (_wcsicmp(L"remove", argv[1] + 1) == 0) { UninstallService( SERVICE_NAME ); } else { wsprintf(L"valid Parameters:\n",L" "); wsprintf(L" -install to install the service\n",L" "); wsprintf(L" -remove to remove the service\n",L" "); } } else { // to run -- to be done later } return 0; }
HRESULT SetupUninstallService() { HRESULT hr = UninstallService(); if(FAILED(hr)) { TSERROR4CXX("UninstallService failed"); return hr; } if(!DeleteSeriviceDll()) { TSWARN4CXX("Failed to delete service dll."); } return hr; }
bool DaemonWin32::init(int argc, char* argv[]) { setlocale(LC_CTYPE, ""); SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_ALL, "Russian"); if (!Daemon_Singleton::init(argc, argv)) return false; if (I2PService::isService()) isDaemon = 1; else isDaemon = 0; std::string serviceControl = i2p::util::config::GetArg("-service", "none"); if (serviceControl == "install") { InstallService( SERVICE_NAME, // Name of service SERVICE_DISPLAY_NAME, // Name to display SERVICE_START_TYPE, // Service start type SERVICE_DEPENDENCIES, // Dependencies SERVICE_ACCOUNT, // Service running account SERVICE_PASSWORD // Password of the account ); exit(0); } else if (serviceControl == "remove") { UninstallService(SERVICE_NAME); exit(0); } else if (serviceControl != "none") { printf(" --service=install to install the service.\n"); printf(" --service=remove to remove the service.\n"); } if (isDaemon == 1) { LogPrint("Service session"); I2PService service(SERVICE_NAME); if (!I2PService::Run(service)) { LogPrint("Service failed to run w/err 0x%08lx\n", GetLastError()); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } else LogPrint("User session"); return true; }
HRESULT InstallService() { TSAUTO(); if(IsServiceInstalled()) { UninstallService(); } wchar_t szPath[MAX_PATH]; if(!GetModuleFileName(g_hModule, szPath, MAX_PATH)) { return HRESULT_FROM_WIN32(::GetLastError()); } HRESULT hr = CreateGreenShieldService(szPath); return hr; }
bool DaemonWin32::init(int argc, char* argv[]) { setlocale(LC_CTYPE, ""); SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_ALL, "Russian"); if (!Daemon_Singleton::init(argc, argv)) return false; std::string serviceControl; i2p::config::GetOption("svcctl", serviceControl); if (serviceControl == "install") { LogPrint(eLogInfo, "WinSVC: installing ", SERVICE_NAME, " as service"); InstallService( SERVICE_NAME, // Name of service SERVICE_DISPLAY_NAME, // Name to display SERVICE_START_TYPE, // Service start type SERVICE_DEPENDENCIES, // Dependencies SERVICE_ACCOUNT, // Service running account SERVICE_PASSWORD // Password of the account ); return false; } else if (serviceControl == "remove") { LogPrint(eLogInfo, "WinSVC: uninstalling ", SERVICE_NAME, " service"); UninstallService(SERVICE_NAME); return false; } if (isDaemon) { LogPrint(eLogDebug, "Daemon: running as service"); I2PService service(SERVICE_NAME); if (!I2PService::Run(service)) { LogPrint(eLogError, "Daemon: Service failed to run w/err 0x%08lx\n", GetLastError()); return false; } return false; } else LogPrint(eLogDebug, "Daemon: running as user"); return true; }
int main(int argc, char* argv[]) { if (2 == argc) { if (0 == strcmp(argv[1], "install")) { if (InstallService()) { printf("Installed service."); return 0; } else { printf("Installation failed."); return -1; } } else if (0 == strcmp(argv[1], "uninstall")) { if (UninstallService()) { printf("Removed service."); return 0; } else { printf("Uninstall failed."); return -1; } } } else { SERVICE_TABLE_ENTRY dispatchTable[] = { { serviceName, (LPSERVICE_MAIN_FUNCTION) ServiceMain }, { NULL, NULL } }; if (!StartServiceCtrlDispatcher(dispatchTable)) { printf("Failed start service."); return -1; } } return 0; }
int wmain( int argc, const wchar_t *argv[] ) { #ifndef BUILD_SETUP if(argc==2) { if(wcscmp(L"-install",argv[1])==0) InstallService(); else if (wcscmp(L"-uninstall",argv[1])==0) UninstallService(); return 0; } #endif SERVICE_TABLE_ENTRY DispatchTable[]={ {(wchar_t*)g_ServiceName, ServiceMain}, {NULL, NULL} }; HKEY hKey; if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"SOFTWARE\\IvoSoft\\ClassicShell",0,KEY_READ|KEY_WOW64_64KEY,&hKey)==ERROR_SUCCESS) { DWORD log; DWORD size=sizeof(log); if (RegQueryValueEx(hKey,L"LogService",0,NULL,(BYTE*)&log,&size)==ERROR_SUCCESS && log) { GetModuleFileName(NULL,g_LogName,_countof(g_LogName)); PathRemoveFileSpec(g_LogName); PathAppend(g_LogName,L"service.log"); LogText("Starting service\n"); } DWORD dump; size=sizeof(dump); if (RegQueryValueEx(hKey,L"CrashDump",0,NULL,(BYTE*)&dump,&size)==ERROR_SUCCESS && dump>0) { if (dump==1) MiniDumpType=MiniDumpNormal; if (dump==2) MiniDumpType=MiniDumpWithDataSegs; if (dump==3) MiniDumpType=MiniDumpWithFullMemory; SetUnhandledExceptionFilter(TopLevelFilter); } RegCloseKey(hKey); } StartServiceCtrlDispatcher(DispatchTable); return 0; }
bool DaemonWin32::Init() { // TODO(unassigned): use Boost.Locale setlocale(LC_CTYPE, ""); // "" uses environment's default locale SetConsoleCP(65001); // UTF-8 SetConsoleOutputCP(65001); setlocale(LC_ALL, ""); if (!Daemon_Singleton::Init()) return false; if (I2PService::isService()) m_isDaemon = 1; else m_isDaemon = 0; std::string serviceControl = i2p::util::config::varMap["service"].as<std::string>(); if (serviceControl == "install") { InstallService( SERVICE_NAME, // Name of service SERVICE_DISPLAY_NAME, // Name to display SERVICE_START_TYPE, // Service start type SERVICE_DEPENDENCIES, // Dependencies SERVICE_ACCOUNT, // Service running account SERVICE_PASSWORD); // Password of the account exit(0); } else if (serviceControl == "remove") { UninstallService(SERVICE_NAME); exit(0); } else if (serviceControl != "none") { printf(" --service=install to install the service.\n"); printf(" --service=remove to remove the service.\n"); } if (m_isDaemon == 1) { LogPrint("Service session"); I2PService service(SERVICE_NAME); if (!I2PService::Run(service)) { LogPrint("Service failed to run w/err 0x%08lx\n", GetLastError()); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } else { LogPrint("User session"); } return true; }
/* In windows, our main() flows through here, before calling the 'real' main, smain() in inspircd.cpp */ int main(int argc, char* argv[]) { /* Check for parameters */ if (argc > 1) { for (int i = 1; i < argc; i++) { if(!_stricmp(argv[i], "--installservice")) { InstallService(); return 0; } if(!_stricmp(argv[i], "--uninstallservice") || !_stricmp(argv[i], "--removeservice")) { UninstallService(); return 0; } } } SERVICE_TABLE_ENTRY serviceTable[] = { { TEXT("InspIRCd"), (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } }; g_bRunningAsService = true; if( !StartServiceCtrlDispatcher(serviceTable) ) { // This error means that the program was not started as service. if( GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT ) { g_bRunningAsService = false; return smain(argc, argv); } else { return EXIT_STATUS_SERVICE; } } return 0; }
// // FUNCTION: wmain(int, wchar_t *[]) // // PURPOSE: entrypoint for the application. // // PARAMETERS: // argc - number of command line arguments // argv - array of command line arguments // // RETURN VALUE: // none // // COMMENTS: // wmain() either performs the command line task, or run the service. // int wmain(int argc, wchar_t *argv[]) { if ((argc > 1) && ((*argv[1] == L'-' || (*argv[1] == L'/')))) { if (_wcsicmp(L"install", argv[1] + 1) == 0) { // Install the service when the command is // "-install" or "/install". InstallService( SERVICE_NAME, // Name of service SERVICE_DISPLAY_NAME, // Name to display SERVICE_START_TYPE, // Service start type SERVICE_DEPENDENCIES, // Dependencies SERVICE_ACCOUNT, // Service running account SERVICE_PASSWORD // Password of the account ); } else if (_wcsicmp(L"remove", argv[1] + 1) == 0) { // Uninstall the service when the command is // "-remove" or "/remove". UninstallService(SERVICE_NAME); } } else { wprintf(L"Parameters:\n"); wprintf(L" -install to install the service.\n"); wprintf(L" -remove to remove the service.\n"); BackgroundTaskService service(SERVICE_NAME); if (!CServiceBase::Run(service)) { wprintf(L"Service failed to run w/err 0x%08lx\n", GetLastError()); } } return 0; }
BOOL Service::Execute(int argc, TCHAR **argv) { // Check for installation options if (argc > 1) { if (_tcscmp(argv[1], _T("-i")) == 0) { if (IsInstalled()) cerr << "service is already installed." << endl; else if (InstallService()) cout << "service installed successfully." << endl; else cerr << "unable to install service." << endl; } else if (_tcscmp(argv[1], _T("-u")) == 0) { if (!IsInstalled()) cerr << "service is not installed." << endl; else if (UninstallService()) cout << "service uninstalled successfully." << endl; else cerr << "unable to uninstall service." << endl; } else cerr << usage << endl; return FALSE; } SERVICE_TABLE_ENTRY st[] = { (LPTSTR)m_name.c_str(), ServiceMain, NULL, NULL }; if (!StartServiceCtrlDispatcher(st)) { // Check to see if we are running as a console if (GetLastError() == ERROR_FAILED_SERVICE_CONTROLLER_CONNECT) { ConsoleMain(argc, argv); return TRUE; } return FALSE; } return TRUE; }
HRESULT SetupInstallService() { TSAUTO(); wchar_t currentDllPath[MAX_PATH]; if(!GetModuleFileName(g_hModule, currentDllPath, MAX_PATH)) { return HRESULT_FROM_WIN32(::GetLastError()); } wchar_t serviceDllPath[MAX_PATH]; if(!GetAllUsersPublicPath(serviceDllPath, MAX_PATH)) { TSERROR4CXX("Failed to get public path."); return false; } std::size_t pathLength = std::wcslen(serviceDllPath); if(pathLength == 0 || pathLength + 1 == sizeof(serviceDllPath) / sizeof(serviceDllPath[0])) { return false; } if(serviceDllPath[pathLength - 1] != '\\') { serviceDllPath[pathLength++] = '\\'; } // ADClean\\addin\\CleanSvc.dll const wchar_t* addinSuffix = L"ADClean\\addin\\CleanSvc.dll"; std::size_t addinSuffixLength = std::wcslen(addinSuffix); if(pathLength + addinSuffixLength + 1 > sizeof(serviceDllPath) / sizeof(serviceDllPath[0])) { return false; } std::copy(addinSuffix, addinSuffix + addinSuffixLength + 1, serviceDllPath + pathLength); if(IsServiceInstalled()) { if(::PathFileExists(serviceDllPath)) { // 版本比较 DWORD old_v1, old_v2, old_v3, old_v4; DWORD new_v1, new_v2, new_v3, new_v4; if(!GetFileVersionNumber(serviceDllPath, old_v1, old_v2, old_v3, old_v4) || !GetFileVersionNumber(currentDllPath, new_v1, new_v2, new_v3, new_v4)) { TSERROR4CXX("Failed to get file version number."); if(!GetFileVersionNumber(serviceDllPath, old_v1, old_v2, old_v3, old_v4)) { TSINFO4CXX(serviceDllPath); } else { TSINFO4CXX(currentDllPath); } return false; } if(old_v1 > new_v1 || old_v2 > new_v2 || old_v3 > new_v3 || old_v4 > new_v4) { TSERROR4CXX("The old service dll is later than this."); return false; } } UninstallService(); } if(!CopyFilesToPublicFolder()) { TSERROR4CXX("CopyFilesToPublicFolder return false."); return E_FAIL; } return CreateGreenShieldService(serviceDllPath); }
/** main(int argc, char **argv) * .. */ int main(int argc, char **argv) { char *tmpstr; char mypath[OS_MAXSTR +1]; char myfinalpath[OS_MAXSTR +1]; char myfile[OS_MAXSTR +1]; /* Setting the name */ OS_SetName(ARGV0); /* Find where I'm */ mypath[OS_MAXSTR] = '\0'; myfinalpath[OS_MAXSTR] = '\0'; myfile[OS_MAXSTR] = '\0'; /* mypath is going to be the whole path of the file */ strncpy(mypath, argv[0], OS_MAXSTR); tmpstr = strrchr(mypath, '\\'); if(tmpstr) { /* tmpstr is now the file name */ *tmpstr = '\0'; tmpstr++; strncpy(myfile, tmpstr, OS_MAXSTR); } else { strncpy(myfile, argv[0], OS_MAXSTR); mypath[0] = '.'; mypath[1] = '\0'; } chdir(mypath); getcwd(mypath, OS_MAXSTR -1); snprintf(myfinalpath, OS_MAXSTR, "\"%s\\%s\"", mypath, myfile); if(argc > 1) { if(strcmp(argv[1], "install-service") == 0) { return(InstallService(myfinalpath)); } else if(strcmp(argv[1], "uninstall-service") == 0) { return(UninstallService()); } else if(strcmp(argv[1], "start") == 0) { return(local_start()); } else if(strcmp(argv[1], "-h") == 0) { agent_help(); } else if(strcmp(argv[1], "help") == 0) { agent_help(); } else { merror("%s: Unknown option: %s", ARGV0, argv[1]); exit(1); } } /* Start it */ if(!os_WinMain(argc, argv)) { ErrorExit("%s: Unable to start WinMain.", ARGV0); } return(0); }
bool WsGateService::ParseSpecialArgs(int argc, char **argv){ if (argc < 2) { return false; } bool installed = false; try { installed = IsServiceInstalled(); } catch (const tracing::runtime_error &e) { cerr << e.what() << endl; return true; } if (0 == strcmp(argv[1], "--query")) { // Report version of installed service cout << "The service is " << (installed ? "currently" : "not") << " installed." << endl; return true; } if (0 == strcmp(argv[1], "--start")) { // Start the service try { Start(); } catch (const tracing::runtime_error &e) { cerr << "Failed to start " << m_sServiceName << endl; cerr << e.what() << endl; } return true; } if (0 == strcmp(argv[1], "--stop")) { // Start the service try { Stop(); } catch (const tracing::runtime_error &e) { cerr << "Failed to stop " << m_sServiceName << endl; cerr << e.what() << endl; } return true; } if (0 == strcmp(argv[1], "--install")) { // Install the service if (installed) { cout << m_sServiceName << " is already installed." << endl; } else { try { InstallService(); cout << m_sServiceName << " installed." << endl; } catch (const tracing::runtime_error &e) { cerr << "Failed to install " << m_sServiceName << endl; cerr << e.what() << endl; } } return true; } if (0 == strcmp(argv[1], "--remove")) { // Remove the service if (!installed) { cout << m_sServiceName << " is not installed." << endl; } else { try { UninstallService(); cout << m_sServiceName << " removed." << endl; } catch (const tracing::runtime_error &e) { cerr << "Failed to remove " << m_sServiceName << endl; cerr << e.what() << endl; } } return true; } return false; }
bool InstallService(PWSTR pszServiceName, PWSTR pszDisplayName, DWORD dwStartType, PWSTR pszDependencies, PWSTR pszAccount, PWSTR pszPassword) { UninstallService(pszServiceName); //std::ofstream file("c:\\users\\slee\\desktop\\text.txt", std::ios::app); wchar_t szPath[MAX_PATH]; bool ret = false; if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)) == 0) { //file << "GetModuleFileName failed w/err " << GetLastError() << std::endl; //wprintf(L"GetModuleFileName failed w/err 0x%08lx\n", GetLastError()); return false; } std::wstring tmp(szPath); tmp = L"\"" + tmp + L"\""; wcsncpy_s(szPath, tmp.c_str(), tmp.size()+1); auto schSCManager = RAIISC_HANDLE(OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE)); if (schSCManager.get() == nullptr) { //file << "OpenSCManager failed w/err " << GetLastError() << std::endl; //wprintf(L"OpenSCManager failed w/err 0x%08lx\n", GetLastError()); } else { wcscat_s(szPath, L" -service_mon"); // Install the service into SCM by calling CreateService auto schService = RAIISC_HANDLE(CreateService( schSCManager.get(), // SCManager database pszServiceName, // Name of service pszDisplayName, // Name to display SERVICE_ALL_ACCESS, // Desired access SERVICE_WIN32_OWN_PROCESS, // Service type dwStartType, // Service start type SERVICE_ERROR_NORMAL, // Error control type szPath, // Service's binary NULL, // No load ordering group NULL, // No tag identifier pszDependencies, // Dependencies pszAccount, // Service running account pszPassword // Password of the account )); if (schService.get() == nullptr){ /* file << "CreateService failed w/err " << GetLastError() << std::endl; DEBUG_MSG("CreateService failed w / err %", GetLastError());*/ return false; } else { // RemoteDesktop::EventLog::WriteLog(L"Service Installed " + std::wstring(pszServiceName), RemoteDesktop::EventLog::EventType::INFORMATIONAL, RemoteDesktop::EventLog::EventCategory::NETWORK_CATEGORY, RemoteDesktop::EventLog::EventID::SERVICE); // file << "Service is installed" << std::endl; //wprintf(L"%s is installed.\n", pszServiceName); SERVICE_STATUS_PROCESS ssStatus; DWORD dwOldCheckPoint; DWORD dwStartTickCount; DWORD dwWaitTime; DWORD dwBytesNeeded; // Check the status in case the service is not stopped. if (!QueryServiceStatusEx( schService.get(), // handle to service SC_STATUS_PROCESS_INFO, // information level (LPBYTE)&ssStatus, // address of structure sizeof(SERVICE_STATUS_PROCESS), // size of structure &dwBytesNeeded)) // size needed if buffer is too small { //printf("QueryServiceStatusEx failed (%d)\n", GetLastError()); return false; } // Check if the service is already running. It would be possible // to stop the service here, but for simplicity this example just returns. if (ssStatus.dwCurrentState != SERVICE_STOPPED && ssStatus.dwCurrentState != SERVICE_STOP_PENDING) { //printf("Cannot start the service because it is already running\n"); return false; } // Save the tick count and initial checkpoint. dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint; // Wait for the service to stop before attempting to start it. while (ssStatus.dwCurrentState == SERVICE_STOP_PENDING) { // Do not wait longer than the wait hint. A good interval is // one-tenth of the wait hint but not less than 1 second // and not more than 10 seconds. dwWaitTime = ssStatus.dwWaitHint / 10; if (dwWaitTime < 1000) dwWaitTime = 1000; else if (dwWaitTime > 10000) dwWaitTime = 10000; Sleep(dwWaitTime); // Check the status until the service is no longer stop pending. if (!QueryServiceStatusEx( schService.get(), // handle to service SC_STATUS_PROCESS_INFO, // information level (LPBYTE)&ssStatus, // address of structure sizeof(SERVICE_STATUS_PROCESS), // size of structure &dwBytesNeeded)) // size needed if buffer is too small { //printf("QueryServiceStatusEx failed (%d)\n", GetLastError()); return false; } if (ssStatus.dwCheckPoint > dwOldCheckPoint) { // Continue to wait and check. dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint; } else { if (GetTickCount() - dwStartTickCount > ssStatus.dwWaitHint) { //printf("Timeout waiting for service to stop\n"); return false; } } } // Attempt to start the service. if (!StartService( schService.get(), 0, NULL)) { //printf("StartService failed (%d)\n", GetLastError()); return false; } // else printf("Service start pending...\n"); // Check the status until the service is no longer start pending. if (!QueryServiceStatusEx( schService.get(), // handle to service SC_STATUS_PROCESS_INFO, // info level (LPBYTE)&ssStatus, // address of structure sizeof(SERVICE_STATUS_PROCESS), // size of structure &dwBytesNeeded)) // if buffer too small { //printf("QueryServiceStatusEx failed (%d)\n", GetLastError()); return false; } // Save the tick count and initial checkpoint. dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint; while (ssStatus.dwCurrentState == SERVICE_START_PENDING) { // Do not wait longer than the wait hint. A good interval is // one-tenth the wait hint, but no less than 1 second and no // more than 10 seconds. dwWaitTime = ssStatus.dwWaitHint / 10; if (dwWaitTime < 1000) dwWaitTime = 1000; else if (dwWaitTime > 10000) dwWaitTime = 10000; Sleep(dwWaitTime); // Check the status again. if (!QueryServiceStatusEx( schService.get(), // handle to service SC_STATUS_PROCESS_INFO, // info level (LPBYTE)&ssStatus, // address of structure sizeof(SERVICE_STATUS_PROCESS), // size of structure &dwBytesNeeded)) // if buffer too small { //printf("QueryServiceStatusEx failed (%d)\n", GetLastError()); break; } if (ssStatus.dwCheckPoint > dwOldCheckPoint) { // Continue to wait and check. dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint; } else { if (GetTickCount() - dwStartTickCount > ssStatus.dwWaitHint) { // No progress made within the wait hint. break; } } } // Determine whether the service is running. if (ssStatus.dwCurrentState == SERVICE_RUNNING) { //printf("Service started successfully.\n"); return true; } else { /* printf("Service not started. \n"); printf(" Current State: %d\n", ssStatus.dwCurrentState); printf(" Exit Code: %d\n", ssStatus.dwWin32ExitCode); printf(" Check Point: %d\n", ssStatus.dwCheckPoint); printf(" Wait Hint: %d\n", ssStatus.dwWaitHint);*/ return false; } //return StartService(schService.get(), 0, NULL) == TRUE; } } return false; }
bool InstallService() { SC_HANDLE hSCManager = NULL; SC_HANDLE hService = NULL; bool ret = false; do { hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); if (NULL == hSCManager) { break;; } hService = CreateService(hSCManager, srvName, srvName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, srvStartType, SERVICE_ERROR_NORMAL, srvFilePath, NULL, NULL, NULL, NULL, NULL); if (hService == NULL) { hService = OpenService(hSCManager, srvName, SERVICE_ALL_ACCESS); if (hService == NULL) { break; } } if (StartService(hService, 0, NULL) == NULL) { break; } SERVICE_STATUS_PROCESS ssStatus; DWORD dwBytesNeeded; if (!QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssStatus, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded)) { break; } DWORD dwStartTickCount = GetTickCount(); DWORD dwOldCheckPoint = ssStatus.dwCheckPoint; DWORD dwWaitTime; while (ssStatus.dwCurrentState == SERVICE_START_PENDING) { dwWaitTime = ssStatus.dwWaitHint / 10; if (dwWaitTime < 1000) dwWaitTime = 1000; else if (dwWaitTime > 10000) dwWaitTime = 10000; Sleep(dwWaitTime); if (!QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&ssStatus, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded)) { break; } if (ssStatus.dwCheckPoint > dwOldCheckPoint) { dwStartTickCount = GetTickCount(); dwOldCheckPoint = ssStatus.dwCheckPoint; } else { if (GetTickCount() - dwStartTickCount > ssStatus.dwWaitHint) { break; } } } if (ssStatus.dwCurrentState == SERVICE_RUNNING) { ret = true; } } while (0); if (!ret) { UninstallService(); } if (hService) { CloseServiceHandle(hService); } if (hSCManager) { CloseServiceHandle(hSCManager); } return ret; }
void arguments(int argc, char **argv) { int opt; while ((opt=getopt(argc, argv, "hdv:f:w:xXsLp:V" #ifdef WIN32 "IUN:P" #endif )) != -1) { switch(opt) { case 'h': options(argv[0]); break; case 'd': foreground = 1; break; case 'v': debug_on=atoi(optarg); if (!debug_on) debug_options(); break; case 'f': SAFE_DUPE(conf_file, optarg); break; case 'w': chdir(optarg); break; case 'p': SAFE_DUPE(conf_pidfile, optarg); break; case 'x': conf_xmlscan = 1; printf("This needs to be implemented, use -X\n"); break; case 'X': conf_xmlscan = 2; break; case 's': conf_fixup_syabas_subtitles = 1; break; case 'L': conf_fixup_nokeepalive = 0; break; case 'V': conf_fixup_childCount = 1; break; #ifdef WIN32 case 'I': // When started as service, we demand -P dir before the rest, which // includes the -I we have to ignore. if (!windows_service) { windows_service = 1; InstallService(argc,argv); _exit(0); } break; case 'N': SAFE_DUPE(g_pzServiceName, optarg); break; case 'U': UninstallService(); exit(0); break; case 'P': windows_service = 1; break; #endif default: printf("Unknown option. '%c'\n", opt); options(argv[0]); break; } } argc -= optind; argv += optind; // argc and argv adjusted here. }
int main( int argc, char* argv[] ) { i2p::util::config::OptionParser(argc,argv); volatile int isDaemon = i2p::util::config::GetArg("-daemon", 0); #ifdef _WIN32 setlocale(LC_CTYPE, ""); SetConsoleCP(1251); SetConsoleOutputCP(1251); setlocale(LC_ALL, "Russian"); #endif LogPrint("\n\n\n\ni2pd starting\n"); LogPrint("data directory: ", i2p::util::filesystem::GetDataDir().string()); i2p::util::filesystem::ReadConfigFile(i2p::util::config::mapArgs, i2p::util::config::mapMultiArgs); #ifdef _WIN32 std::string serviceControl = i2p::util::config::GetArg("-service", "none"); if (serviceControl == "install") { InstallService( SERVICE_NAME, // Name of service SERVICE_DISPLAY_NAME, // Name to display SERVICE_START_TYPE, // Service start type SERVICE_DEPENDENCIES, // Dependencies SERVICE_ACCOUNT, // Service running account SERVICE_PASSWORD // Password of the account ); return 0; } else if (serviceControl == "remove") { UninstallService(SERVICE_NAME); return 0; } else if (serviceControl != "none") { printf(" --service=install to install the service.\n"); printf(" --service=remove to remove the service.\n"); return 0; } else if (isDaemon) { std::string logfile = i2p::util::filesystem::GetDataDir().string(); logfile.append("\\debug.log"); FILE* openResult = freopen(logfile.c_str(), "a", stdout); if (!openResult) { return -17; } LogPrint("Service logging enabled."); I2PService service(SERVICE_NAME); if (!I2PService::Run(service)) { LogPrint("Service failed to run w/err 0x%08lx\n", GetLastError()); } return 0; } #endif if (isLogging == 1) { std::string logfile = i2p::util::filesystem::GetDataDir().string(); #ifndef _WIN32 logfile.append("/debug.log"); #else logfile.append("\\debug.log"); #endif FILE* openResult = freopen(logfile.c_str(),"a",stdout); // It seems that we need to add FLUSH() for LogPrint and call it in some important places if (!openResult) { LogPrint("Can't do [freopen()]."); return -17; } LogPrint("Logging to file enabled."); } #ifndef _WIN32 if (isDaemon == 1) { pid_t pid; pid = fork(); if (pid > 0) { g_Log.Stop(); return 0; } if (pid < 0) { return -1; } umask(0); int sid = setsid(); if (sid < 0) { LogPrint("Error, could not create process group."); return -1; } chdir(i2p::util::filesystem::GetDataDir().string().c_str()); } // Pidfile std::string pidfile = i2p::util::filesystem::GetDataDir().string(); pidfile.append("/i2pd.pid"); int pidFilehandle = open(pidfile.c_str(), O_RDWR|O_CREAT, 0600); if (pidFilehandle == -1 ) { LogPrint("Error, could not create pid file (", pidfile, ")\nIs an instance already running?"); return -1; } if (lockf(pidFilehandle,F_TLOCK,0) == -1) { LogPrint("Error, could not lock pid file (", pidfile, ")\nIs an instance already running?"); return -1; } char pid[10]; sprintf(pid,"%d\n",getpid()); write(pidFilehandle, pid, strlen(pid)); // Signal handler struct sigaction sa; sa.sa_handler = handle_signal; sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sigaction(SIGHUP,&sa,0); sigaction(SIGABRT,&sa,0); sigaction(SIGTERM,&sa,0); sigaction(SIGINT,&sa,0); #endif //TODO: This is an ugly workaround. fix it. //TODO: Autodetect public IP. i2p::context.OverrideNTCPAddress(i2p::util::config::GetCharArg("-host", "127.0.0.1"), i2p::util::config::GetArg("-port", 17070)); i2p::util::HTTPServer httpServer (i2p::util::config::GetArg("-httpport", 7070)); httpServer.Start (); i2p::data::netdb.Start (); i2p::transports.Start (); i2p::tunnel::tunnels.Start (); while (running) { //TODO Meeh: Find something better to do here. std::this_thread::sleep_for (std::chrono::seconds(1)); } LogPrint("Shutdown started."); i2p::tunnel::tunnels.Stop (); i2p::transports.Stop (); i2p::data::netdb.Stop (); httpServer.Stop (); if (isLogging == 1) { fclose (stdout); } #ifndef _WIN32 close(pidFilehandle); unlink(pidfile.c_str()); #endif return 0; }
int __cdecl main(int argc, char* argv[]) { ::SetDllDirectory(""); #ifndef _WIN64 HINSTANCE hKernel32 = ::LoadLibrary("Kernel32.dll"); typedef BOOL (WINAPI * SPDEPP)(DWORD); SPDEPP pSPDEPP = (SPDEPP)::GetProcAddress(hKernel32, "SetProcessDEPPolicy"); if(pSPDEPP != NULL) { pSPDEPP(PROCESS_DEP_ENABLE); } ::FreeLibrary(hKernel32); #endif sTitle = "PtokaX DC Hub " + string(PtokaXVersionString); #ifdef _DEBUG sTitle += " [debug]"; #endif #ifdef _DEBUG // AllocConsole(); // hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // Cout("PtokaX Debug console\n"); #endif char sBuf[MAX_PATH+1]; ::GetModuleFileName(NULL, sBuf, MAX_PATH); char * sPath = strrchr(sBuf, '\\'); if(sPath != NULL) { PATH = string(sBuf, sPath-sBuf); } else { PATH = sBuf; } char * sServiceName = NULL; bool bInstallService = false; for(int i = 0; i < argc; i++) { if(stricmp(argv[i], "-s") == NULL || stricmp(argv[i], "/service") == NULL) { if(++i == argc) { AppendLog("Missing service name!"); return EXIT_FAILURE; } sServiceName = argv[i]; bService = true; } else if(stricmp(argv[i], "-c") == 0) { if(++i == argc) { printf("Missing config directory!"); return EXIT_FAILURE; } size_t szLen = strlen(argv[i]); if(szLen >= 1 && argv[i][0] != '\\' && argv[i][0] != '/') { if(szLen < 4 || (argv[i][1] != ':' || (argv[i][2] != '\\' && argv[i][2] != '/'))) { printf("Config directory must be absolute path!"); return EXIT_FAILURE; } } if(argv[i][szLen - 1] == '/' || argv[i][szLen - 1] == '\\') { PATH = string(argv[i], szLen - 1); } else { PATH = string(argv[i], szLen); } if(DirExist(PATH.c_str()) == false) { if(CreateDirectory(PATH.c_str(), NULL) == 0) { printf("Config directory not exist and can't be created!"); return EXIT_FAILURE; } } } else if(stricmp(argv[i], "-i") == NULL || stricmp(argv[i], "/install") == NULL) { if(++i == argc) { printf("Please specify service name!"); return EXIT_FAILURE; } sServiceName = argv[i]; bInstallService = true; } else if(stricmp(argv[i], "-u") == NULL || stricmp(argv[i], "/uninstall") == NULL) { if(++i == argc) { printf("Please specify service name!"); return EXIT_FAILURE; } sServiceName = argv[i]; return UninstallService(sServiceName); } else if(stricmp(argv[i], "-v") == NULL || stricmp(argv[i], "/version") == NULL) { printf((sTitle+" built on "+__DATE__+" "+__TIME__).c_str()); return EXIT_SUCCESS; } else if(stricmp(argv[i], "-h") == NULL || stricmp(argv[i], "/help") == NULL) { printf("PtokaX [-c <configdir>] [-i <servicename>] [-u <servicename>] [-v]"); return EXIT_SUCCESS; } else if(stricmp(argv[i], "/nokeycheck") == NULL) { bCmdNoKeyCheck = true; } else if(stricmp(argv[i], "/generatexmllanguage") == NULL) { LangMan::GenerateXmlExample(); return EXIT_SUCCESS; } } if(bInstallService == true) { if(sPath == NULL && strcmp(PATH.c_str(), sBuf) == 0) { return InstallService(sServiceName, NULL); } else { return InstallService(sServiceName, PATH.c_str()); } } ExceptionHandlingInitialize(PATH, sBuf); if(bService == false) { ServerInitialize(); if(ServerStart() == false) { printf("Server start failed!"); ExceptionHandlingUnitialize(); return EXIT_FAILURE; } else { printf((sTitle+" running...\n").c_str()); } MSG msg; BOOL bRet; while((bRet = ::GetMessage(&msg, NULL, 0, 0)) != 0) { if(bRet == -1) { // handle the error and possibly exit } else { if(msg.message == WM_USER+1) { break; } else if(msg.message == WM_TIMER) { if(msg.wParam == srvLoopTimer) { srvLoop->Looper(); } else if(msg.wParam == regtimer) { ServerOnRegTimer(); } else { //Must be script timer ScriptOnTimer(msg.wParam); } } ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } ExceptionHandlingUnitialize(); } else { SERVICE_TABLE_ENTRY DispatchTable[] = { { sServiceName, StartService }, { NULL, NULL } }; if(StartServiceCtrlDispatcher(DispatchTable) == false) { AppendLog("StartServiceCtrlDispatcher failed ("+string((uint32_t)GetLastError())+")!"); ExceptionHandlingUnitialize(); return EXIT_FAILURE; } } return EXIT_SUCCESS; }
int _tmain(int argc, char* argv[])//lint !e752 !e1768 !e1727 { //打开日志 std::string strIniPath = eLTE_Tool::GetServicePath(); strIniPath.append(LOG_INI_FILE_NAME); unsigned int logLevel[LOG_CATEGORY] = {INVALID_LOG_LEVEL,INVALID_LOG_LEVEL,INVALID_LOG_LEVEL}; std::string strLogPath = eLTE_Tool::GetServicePath(); strLogPath.append("log"); int iRet = LOG_INIT(strIniPath.c_str(), logLevel, strLogPath.c_str()); if(RET_SUCCESS != iRet) { return eLTE_SDK_ERR_LOG_INIT; } LOG_TRACE(); if (INSTALL_AGRC == argc && NULL != argv) { if (0 == _stricmp(argv[1], "/install") || 0 == _stricmp(argv[1], "-install")) { InstallService(); } else if (0 == _stricmp(argv[1], "/uninstall") || 0 == _stricmp(argv[1], "-uninstall")) { UninstallService(); } } else { SERVICE_TABLE_ENTRY svcTable[2]; svcTable[0].lpServiceName = MY_SERVICE_NAME; svcTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTIONA)ServiceMain; svcTable[1].lpServiceName = NULL; svcTable[1].lpServiceProc = NULL; if (!StartServiceCtrlDispatcher(svcTable)) { LOG_RUN_ERROR("StartServiceCtrlDispatcher failed."); } } // 用于直接以普通应用程序的形式启动服务器,方便debug调试服务程序业务 // 初始化SDK //int iRet = AppContextMgr::Instance().Init(); //if (eLTE_SVC_ERR_SUCCESS != iRet) //{ // LOG_RUN_ERROR("Init elte sdk failed.(%d)", iRet); //} //else //{ // // 开启业务监听 // StartRun(); // // 退出SDK // iRet = AppContextMgr::Instance().Exit(); // if (eLTE_SVC_ERR_SUCCESS != iRet) // { // LOG_RUN_ERROR("Exit elte sdk failed.(%d)", iRet); // } //} LOG_EXIT(); return 0; }//lint !e818