16 SERVICE_STATUS jabber_service_status;
17 SERVICE_STATUS_HANDLE jabber_service_status_handle;
19 LPCTSTR jabber_service_name = NULL;
20 LPCTSTR jabber_service_display = NULL;
21 LPCTSTR jabber_service_description = NULL;
22 LPCTSTR jabber_service_depends = NULL;
23 jmainhandler_t *jabber_service_wrapper = NULL;
25 void WINAPI jabber_service_main(DWORD argc, LPTSTR *argv);
26 void WINAPI jabber_service_ctrl_handler(DWORD Opcode);
27 BOOL jabber_install_service();
28 BOOL jabber_delete_service();
36 if(signo == SIGTERM) jabber_term_handler = func;
39 struct sigaction act, oact;
41 act.sa_handler = func;
42 sigemptyset(&act.sa_mask);
46 act.sa_flags |= SA_RESTART;
48 if (sigaction(signo, &act, &oact) < 0)
50 return (oact.sa_handler);
56 BOOL WINAPI jabber_ctrl_handler(DWORD dwCtrlType)
58 if(jabber_term_handler) jabber_term_handler(0);
62 int jabber_wrap_service(
int argc,
char** argv, jmainhandler_t *wrapper, LPCTSTR name, LPCTSTR display, LPCTSTR description, LPCTSTR depends)
64 jabber_service_wrapper = wrapper;
65 jabber_service_name = name;
66 jabber_service_display = display;
67 jabber_service_description = description;
68 jabber_service_depends = depends;
70 if((argc == 2) && !strcmp(argv[1],
"-I"))
73 if(jabber_install_service())
74 printf(
"Service %s installed sucessfully.\n", jabber_service_name);
76 printf(
"Error installing service %s.\n", jabber_service_name);
79 if((argc == 2) && !strcmp(argv[1],
"-U"))
82 if(jabber_delete_service())
83 printf(
"Service %s uninstalled sucessfully.\n", jabber_service_name);
85 printf(
"Error uninstalling service %s.\n", jabber_service_name);
88 if((argc == 2) && !strcmp(argv[1],
"-S"))
90 TCHAR szPathName[MAX_PATH]; LPTSTR slash = NULL;
91 SERVICE_TABLE_ENTRY DispatchTable[] = {{(LPTSTR)jabber_service_name, jabber_service_main}, {NULL, NULL}};
93 GetModuleFileName(NULL, szPathName,
sizeof(szPathName));
96 if(slash = strrchr(szPathName,
'\\'))
99 SetCurrentDirectory(szPathName);
103 StartServiceCtrlDispatcher(DispatchTable);
107 SetConsoleCtrlHandler(jabber_ctrl_handler, TRUE);
110 if(jabber_service_wrapper)
return jabber_service_wrapper(argc, argv);
115 void WINAPI jabber_service_main(DWORD argc, LPTSTR *argv)
117 jabber_service_status.dwServiceType = SERVICE_WIN32;
118 jabber_service_status.dwCurrentState = SERVICE_START_PENDING;
119 jabber_service_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
120 jabber_service_status.dwWin32ExitCode = 0;
121 jabber_service_status.dwServiceSpecificExitCode = 0;
122 jabber_service_status.dwCheckPoint = 0;
123 jabber_service_status.dwWaitHint = 0;
125 jabber_service_status_handle = RegisterServiceCtrlHandler(jabber_service_name, jabber_service_ctrl_handler);
126 if (jabber_service_status_handle == (SERVICE_STATUS_HANDLE)0)
129 jabber_service_status.dwCurrentState = SERVICE_RUNNING;
130 jabber_service_status.dwCheckPoint = 0;
131 jabber_service_status.dwWaitHint = 0;
132 SetServiceStatus(jabber_service_status_handle, &jabber_service_status);
134 if(jabber_service_wrapper) jabber_service_wrapper(argc, argv);
136 jabber_service_status.dwWin32ExitCode = 0;
137 jabber_service_status.dwCurrentState = SERVICE_STOPPED;
138 jabber_service_status.dwCheckPoint = 0;
139 jabber_service_status.dwWaitHint = 0;
140 SetServiceStatus(jabber_service_status_handle, &jabber_service_status);
145 void WINAPI jabber_service_ctrl_handler(DWORD Opcode)
149 case SERVICE_CONTROL_PAUSE:
150 jabber_service_status.dwCurrentState = SERVICE_PAUSED;
153 case SERVICE_CONTROL_CONTINUE:
154 jabber_service_status.dwCurrentState = SERVICE_RUNNING;
157 case SERVICE_CONTROL_STOP:
158 jabber_service_status.dwCurrentState = SERVICE_STOP_PENDING;
159 SetServiceStatus(jabber_service_status_handle, &jabber_service_status);
162 if(jabber_term_handler) jabber_term_handler(0);
165 case SERVICE_CONTROL_INTERROGATE:
171 BOOL jabber_install_service()
174 TCHAR szPathName[MAX_PATH];
175 TCHAR szCmd[MAX_PATH + 16];
176 HANDLE schSCManager, schService;
177 SERVICE_DESCRIPTION sdServiceDescription = { jabber_service_description };
179 GetModuleFileName(NULL, szPathName,
sizeof(szPathName));
180 sprintf(szCmd,
"\"%s\" -S", szPathName);
182 schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
184 if (schSCManager == NULL)
187 schService = CreateService(schSCManager,
189 jabber_service_display,
191 SERVICE_WIN32_OWN_PROCESS,
193 SERVICE_ERROR_NORMAL,
197 jabber_service_depends,
201 if (schService == NULL)
204 ChangeServiceConfig2(schService, SERVICE_CONFIG_DESCRIPTION, (LPVOID)&sdServiceDescription);
206 CloseServiceHandle(schService);
211 BOOL jabber_delete_service()
216 schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
218 if (schSCManager == NULL)
221 hService=OpenService(schSCManager, jabber_service_name, SERVICE_ALL_ACCESS);
223 if (hService == NULL)
226 if(DeleteService(hService)==0)
229 if(CloseServiceHandle(hService)==0)
jsighandler_t * jabber_signal(int signo, jsighandler_t *func)