void CALLBACK ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) { int seq=1; HKEY hk; DWORD dwTmp,dwType; char szTmp[1024]; HANDLE hSem = CreateSemaphore(NULL,0,1,"CVSNT_ControlPanel"); if(dwArgc!=999) { if (!(g_hService = RegisterServiceCtrlHandler(SERVICE_NAME,ServiceHandler))) { ReportError(TRUE,"Unable to start "SERVICE_NAME" - RegisterServiceCtrlHandler failed"); return; } NotifySCM(SERVICE_START_PENDING, 0, seq++); } else { g_bTestMode=TRUE; printf(SERVICE_NAME" " CVSNT_PRODUCTVERSION_STRING " ("__DATE__") starting in test mode.\n"); } // Initialisation WSADATA data; if(WSAStartup (MAKEWORD (1, 1), &data)) { ReportError(TRUE,"WSAStartup failed... aborting - Error %d\n",WSAGetLastError()); if(!g_bTestMode) NotifySCM(SERVICE_STOPPED,0,0); return; } if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\CVS\\Pserver",NULL,KEY_QUERY_VALUE,&hk)) { dwTmp=sizeof(szTmp); if(!RegQueryValueEx(hk,"ControlPanel",NULL,&dwType,(BYTE*)szTmp,&dwTmp)) { char *p = strchr(szTmp,':'); if(p) controlserver_port=atoi(p+1); } dwTmp=sizeof(szTmp); if(!RegQueryValueEx(hk,"ControlPanelLocal",NULL,&dwType,(BYTE*)szTmp,&dwTmp)) { if(dwType==REG_DWORD) local_only = *(DWORD*)szTmp; } RegCloseKey(hk); } run_server(controlserver_port, seq, local_only); CloseHandle(hSem); if(!g_bTestMode) NotifySCM(SERVICE_STOPPED, 0, 0); ReportError(FALSE,SERVICE_NAME" stopped successfully"); }
void CALLBACK ServiceHandler(DWORD fdwControl) { switch(fdwControl) { case SERVICE_CONTROL_STOP: OutputDebugString(SERVICE_NAME": Stop\n"); NotifySCM(SERVICE_STOP_PENDING, 0, 0); g_bStop=TRUE; return; case SERVICE_CONTROL_INTERROGATE: default: break; } OutputDebugString(SERVICE_NAME": Interrogate\n"); NotifySCM(g_dwCurrentState, 0, 0); }
//-------------------------------------------------------------- VOID ServiceHandler(DWORD fdwControl) { switch(fdwControl) { case SERVICE_CONTROL_STOP: NotifySCM(SERVICE_STOP_PENDING, 0, 1); SetEvent(hDoneEvent); NotifySCM(SERVICE_STOPPED, 0, 0); break; case SERVICE_CONTROL_PAUSE: NotifySCM(SERVICE_PAUSE_PENDING, 0, 1); SuspendThread(hThread); NotifySCM(SERVICE_PAUSED, 0, 0); break; case SERVICE_CONTROL_CONTINUE: NotifySCM(SERVICE_CONTINUE_PENDING, 0, 1); ResumeThread(hThread); NotifySCM(SERVICE_RUNNING, 0, 0); break; case SERVICE_CONTROL_INTERROGATE: NotifySCM(dwCurrentState, 0, 0); break; case SERVICE_CONTROL_SHUTDOWN: ServiceTermination(); break; } }
//-------------------------------------------------------------- VOID ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) { DWORD ThreadId; if (!(hService = RegisterServiceCtrlHandler( GENSRV_ServiceName, (LPHANDLER_FUNCTION)ServiceHandler))) return; NotifySCM(SERVICE_START_PENDING, 0, 1); if (!ServiceInitialization(dwArgc, lpszArgv)) return; NotifySCM(SERVICE_START_PENDING, 0, 2); if ((hDoneEvent=CreateEvent(NULL,FALSE,FALSE,NULL)) == 0) return; NotifySCM(SERVICE_START_PENDING, 0, 3); if ((hThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)MainServiceThread, 0, 0, &ThreadId)) == 0) { CloseHandle(hDoneEvent); return; } NotifySCM(SERVICE_RUNNING, 0, 0); WaitForSingleObject(hDoneEvent, INFINITE); CloseHandle(hThread); ExitThread(ThreadId); CloseHandle(hDoneEvent); return; }
void CALLBACK ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) { TCHAR szTmp[8192]; char szTmpA[8192]; TCHAR szTmp2[8192]; char szAuthServer[32]; DWORD dwTmp,dwType; HKEY hk; int seq=1,err; LPCSTR szNode; addrinfo *pAddrInfo; if(dwArgc!=999) { if (!(g_hService = RegisterServiceCtrlHandler(SERVICE_NAME,ServiceHandler))) { ReportError(TRUE,"Unable to start "SERVICE_NAMEA" - RegisterServiceCtrlHandler failed"); return; } NotifySCM(SERVICE_START_PENDING, 0, seq++); } else { g_bTestMode=TRUE; printf(SERVICE_NAMEA" " CVSNT_PRODUCTVERSION_STRING " ("__DATE__") starting in test mode.\n"); } if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"),NULL,KEY_QUERY_VALUE,&hk)) { ReportError(TRUE,"Unable to start "SERVICE_NAMEA" - Couldn't open environment key"); if(!g_bTestMode) NotifySCM(SERVICE_STOPPED,0,0); return; } dwTmp=sizeof(szTmp); if(RegQueryValueEx(hk,_T("PATH"),NULL,&dwType,(BYTE*)szTmp,&dwTmp)) { ReportError(TRUE,"Unable to start "SERVICE_NAMEA" - PATH environment variable not defined in system environment"); if(!g_bTestMode) NotifySCM(SERVICE_STOPPED,0,0); return; } ExpandEnvironmentStrings(szTmp,szTmp2,sizeof(szTmp)); SetEnvironmentVariable(_T("PATH"),szTmp2); RegCloseKey(hk); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Software\\CVS\\Pserver"),NULL,KEY_QUERY_VALUE,&hk)) { ReportError(TRUE,"Unable to start "SERVICE_NAMEA" - Couldn't open HKLM\\Software\\CVS\\Pserver key"); if(!g_bTestMode) NotifySCM(SERVICE_STOPPED,0,0); return; } dwTmp=sizeof(szTmp); if(RegQueryValueEx(hk,_T("TempDir"),NULL,&dwType,(LPBYTE)szTmp,&dwTmp) && SHRegGetUSValue(_T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"),_T("TEMP"),NULL,(LPVOID)szTmp,&dwTmp,TRUE,NULL,0) && !GetEnvironmentVariable(_T("TEMP"),(LPTSTR)szTmp,sizeof(szTmp)) && !GetEnvironmentVariable(_T("TMP"),(LPTSTR)szTmp,sizeof(szTmp))) { _tcscpy(szTmp,_T("C:\\")); } SetEnvironmentVariable(_T("TEMP"),szTmp); SetEnvironmentVariable(_T("TMP"),szTmp); if(g_bTestMode) _tprintf(_T("TEMP/TMP currently set to %s\n"),szTmp); dwTmp=sizeof(DWORD); if(!RegQueryValueEx(hk,_T("PServerPort"),NULL,&dwType,(BYTE*)szTmp,&dwTmp)) { authserver_port=*(DWORD*)szTmp; } itoa(authserver_port,szAuthServer,10); // Initialisation WSADATA data; if(WSAStartup (MAKEWORD (1, 1), &data)) { ReportError(TRUE,"WSAStartup failed... aborting - Error %d\n",WSAGetLastError()); if(!g_bTestMode) NotifySCM(SERVICE_STOPPED,0,0); return; } dwTmp=sizeof(szTmpA); szNode = NULL; if(!RegQueryValueExA(hk,"BindAddress",NULL,&dwType,(BYTE*)szTmpA,&dwTmp)) { if(stricmp(szTmpA,"*")) szNode = szTmpA; } addrinfo hint = {0}; hint.ai_family=PF_UNSPEC; hint.ai_socktype=SOCK_STREAM; hint.ai_protocol=IPPROTO_TCP; hint.ai_flags=AI_PASSIVE; pAddrInfo=NULL; if(g_bTestMode) { printf("Initialising socket..."); } err=getaddrinfo(szNode,szAuthServer,&hint,&pAddrInfo); if(g_bTestMode) { if(err) printf("failed (%s)\n",gai_strerror(err)); else { if(!pAddrInfo) { printf("This server doesn't know how to bind tcp sockets!!! Your sockets layer is broken!!!\n"); } else printf("ok\n"); } } if(err) ReportError(FALSE,"Failed to get ipv4 socket details: %s",gai_strerror(err)); RegCloseKey(hk); if(!g_bTestMode) NotifySCM(SERVICE_START_PENDING, 0, seq++); int impersonate=1; if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Software\\CVS\\Pserver"),0,KEY_QUERY_VALUE,&hk)) { DWORD dwType,dwImpersonate; DWORD dwTmp=sizeof(dwTmp); if(!RegQueryValueEx(hk,_T("Impersonation"),NULL,&dwType,(BYTE*)&dwImpersonate,&dwTmp)) impersonate = dwImpersonate; RegCloseKey(hk); hk = 0; } if(impersonate) printf("Impersonation is enabled\n"); else printf("*WARNING* Impersonation is disabled - all file access will be done as System user\n"); if(g_bTestMode) printf("Starting auth server on port %d/tcp...\n",authserver_port); addrinfo* ai; for(ai=pAddrInfo;ai;ai=ai->ai_next) { SOCKET s = WSASocket(ai->ai_family,ai->ai_socktype,ai->ai_protocol,NULL,0,0); if(s!=-1 && !bind(s,ai->ai_addr,ai->ai_addrlen)) { if(listen(s,50)==SOCKET_ERROR) { ReportError(TRUE,"Listen on socket failed: %s\n",gai_strerror(WSAGetLastError())); if(!g_bTestMode) NotifySCM(SERVICE_STOPPED,0,0); freeaddrinfo(pAddrInfo); return; } g_Sockets.push_back(s); } else { if(g_bTestMode) printf("Socket Failed (Handle=%08x Family=%d,Socktype=%d,Protocol=%d): %s (not fatal)\n",s,ai->ai_family,ai->ai_socktype,ai->ai_protocol, gai_strerror(WSAGetLastError())); closesocket(s); } } freeaddrinfo(pAddrInfo); if(!g_Sockets.size()) { ReportError(TRUE,"All socket binds failed."); if(!g_bTestMode) NotifySCM(SERVICE_STOPPED,0,0); return; } DWORD (WINAPI *pDsServerRegisterSpn)(DS_SPN_WRITE_OP Operation, LPCTSTR ServiceClass, LPCTSTR UserObjectDN); UINT oldMode=SetErrorMode(SEM_NOOPENFILEERRORBOX|SEM_FAILCRITICALERRORS); pDsServerRegisterSpn = (DWORD (WINAPI*)(DS_SPN_WRITE_OP,LPCTSTR,LPCTSTR))GetProcAddress(LoadLibrary("ntdsapi.dll"),"DsServerRegisterSpnA"); SetErrorMode(oldMode); if(pDsServerRegisterSpn) { if(g_bTestMode) printf("Registering service SPN... "); pDsServerRegisterSpn(DS_SPN_DELETE_SPN_OP,"cvs",NULL); if(!g_bTestMode) NotifySCM(SERVICE_START_PENDING, 0, seq++); pDsServerRegisterSpn(DS_SPN_DELETE_SPN_OP,"cvs",NULL); if(!g_bTestMode) NotifySCM(SERVICE_START_PENDING, 0, seq++); if((dwTmp=pDsServerRegisterSpn(DS_SPN_ADD_SPN_OP,"cvs",NULL))!=0) { if(g_bTestMode) printf("failed (Error %d)\n",dwTmp); //ReportError(TRUE,"Registering cvs service SPN failed (error %d)", dwTmp); } else { if(g_bTestMode) printf("ok\n"); } } // Process running, wait for closedown ReportError(FALSE,SERVICE_NAMEA" initialised successfully"); if(!g_bTestMode) NotifySCM(SERVICE_RUNNING, 0, 0); g_bStop=FALSE; do { fd_set rfd; sockaddr_storage sin; size_t n; FD_ZERO(&rfd); for(n=0; n<g_Sockets.size(); n++) FD_SET(g_Sockets[n],&rfd); TIMEVAL tv = { 5, 0 }; // 5 seconds max wait int sel=select(1,&rfd,NULL,NULL,&tv); if(g_bStop || sel==SOCKET_ERROR) break; // Error on socket, or stopped for(n=0; n<g_Sockets.size(); n++) { if(FD_ISSET(g_Sockets[n],&rfd)) { HANDLE hConn=(HANDLE)accept(g_Sockets[n],(struct sockaddr*)&sin,NULL); CloseHandle(CreateThread(NULL,0,DoCvsThread,(void*)hConn,0,NULL)); } } } while(!g_bStop); if(pDsServerRegisterSpn) { if(g_bTestMode) printf("Unregistering service SPN...\n"); pDsServerRegisterSpn(DS_SPN_DELETE_SPN_OP,"cvs",NULL); } NotifySCM(SERVICE_STOPPED, 0, 0); ReportError(FALSE,SERVICE_NAMEA" stopped successfully"); }
void CALLBACK ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv) { int seq=1; HKEY hk; DWORD dwTmp,dwType; char szTmp[1024]; HANDLE hSem = CreateSemaphore(NULL,0,1,"CVSNT_Lockserver"); if(dwArgc<997) { if (!(g_hService = RegisterServiceCtrlHandler(SERVICE_NAME,ServiceHandler))) { CServerIo::log(CServerIo::logError,"Unable to start "SERVICE_NAME" - RegisterServiceCtrlHandler failed"); return; } NotifySCM(SERVICE_START_PENDING, 0, seq++); } else { if(dwArgc==999) { g_bTestMode=TRUE; printf(SERVICE_NAME" " CVSNT_PRODUCTVERSION_STRING " ("__DATE__") starting in test mode.\n"); } } { CSocketIO s; if(!s.init()) { CServerIo::log(CServerIo::logError,"Socket startup failed: %s\n",s.error()); if(!g_bTestMode) NotifySCM(SERVICE_STOPPED,0,0); return; } } if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\CVS\\Pserver",NULL,KEY_QUERY_VALUE,&hk)) { dwTmp=sizeof(szTmp); if(!RegQueryValueEx(hk,"LockServer",NULL,&dwType,(BYTE*)szTmp,&dwTmp)) { char *p = strchr(szTmp,':'); if(p) lockserver_port=atoi(p+1); } dwTmp=sizeof(szTmp); if(!RegQueryValueEx(hk,"LockServerLocal",NULL,&dwType,(BYTE*)szTmp,&dwTmp)) { if(dwType==REG_DWORD) local_only = *(DWORD*)szTmp; } RegCloseKey(hk); } run_server(lockserver_port, seq, local_only); CloseHandle(hSem); if(!g_bTestMode) NotifySCM(SERVICE_STOPPED, 0, 0); CServerIo::log(CServerIo::logNotice,SERVICE_NAME" stopped successfully"); }
void run_server(int port, int seq, int local_only) { CSocketIO listen_sock; char szControlServer[64]; sprintf(szControlServer,"%d",port); if(g_bTestMode) { printf("Initialising socket...\n"); } if(!listen_sock.create(NULL,szControlServer,local_only?true:false)) { if(g_bTestMode) printf("Couldn't create listening socket... %s",listen_sock.error()); ReportError(TRUE,"Failed to create listening socket: %s",listen_sock.error()); return; } #ifdef _WIN32 if(!g_bTestMode) NotifySCM(SERVICE_START_PENDING, 0, seq++); #endif if(g_bTestMode) printf("Starting control server on port %d/tcp...\n",port); if(!listen_sock.bind()) { if(g_bTestMode) printf("Couldn't bind listening socket... %s\n",listen_sock.error()); ReportError(TRUE,"Failed to bind listening socket: %s",listen_sock.error()); #ifdef _WIN32 if(!g_bTestMode) NotifySCM(SERVICE_STOPPED,0,1); #endif return; } g_bStop=FALSE; // InitServer(); #ifdef _WIN32 if(!g_bTestMode) NotifySCM(SERVICE_START_PENDING, 0, seq++); #endif // Process running, wait for closedown ReportError(FALSE,"CVS Control service initialised successfully"); #ifdef _WIN32 if(!g_bTestMode) NotifySCM(SERVICE_RUNNING, 0, 0); #endif while(!g_bStop && listen_sock.accept(2000)) { for(size_t n=0; n<listen_sock.accepted_sockets().size(); n++) { OpenControlClient(listen_sock.accepted_sockets()[n]); start_thread(listen_sock.accepted_sockets()[n]); } } }