20
48
if (sigaction(signo, &act, &oact) < 0)
22
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"))
72
// Jabber service installation requested
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"))
81
// Jabber service removal requested
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));
95
// Set working directory to the service path
96
if(slash = strrchr(szPathName, '\\'))
99
SetCurrentDirectory(szPathName);
102
// Run service dispatcher
103
StartServiceCtrlDispatcher(DispatchTable);
106
// If we are not in the service, register console handle for shutdown
107
SetConsoleCtrlHandler(jabber_ctrl_handler, TRUE);
109
// Wrap original main function
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,
188
jabber_service_name, // service name (alias)
189
jabber_service_display, // service name to display
190
SERVICE_ALL_ACCESS, // desired access
191
SERVICE_WIN32_OWN_PROCESS, // service type
192
SERVICE_AUTO_START, // start type
193
SERVICE_ERROR_NORMAL, // error control type
194
szCmd, // service's binary
195
NULL, // no load ordering group
196
NULL, // no tag identifier
197
jabber_service_depends, // dependencies
198
NULL, // LocalSystem account
199
NULL); // no password
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)