28#define NEED_PACKAGE_INFO
42#define AS_STR_1(x) AS_STR_2(x)
44#define HERE __FILE__ ":" AS_STR_1(__LINE__)
61 FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
64 MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
68 return (
const char*)(buf);
71 static void perror(
const char* s=NULL)
95 RegistryKey(HKEY hkey,
const char* subkey, REGSAM samDesired=KEY_QUERY_VALUE);
97 operator bool()
const {
return _open; }
98 int setValueStr(
const char* name,
const char* data);
99 char*
queryValueStr(
const char* name,
const int maxlen=2048)
const;
104 _hkey(right._hkey),_open(right._open)
114):_hkey(), _open(false)
116 long ret=::RegOpenKeyEx(hkey,subkey,0,samDesired,&
_hkey);
118 if(ret==ERROR_SUCCESS)
129 long ret =::RegCloseKey(
_hkey);
131 if(ret!=ERROR_SUCCESS)
138 long ret=::RegSetValueEx(
144 if(ret==ERROR_SUCCESS)
153 char* buf =
new char[maxlen];
156 long ret=::RegQueryValueEx(
_hkey,name,NULL,NULL,(LPBYTE)buf,&len);
158 if(ret==ERROR_SUCCESS && len<=maxlen)
159 result=::strdup(buf);
182 _regSubKey(
"SYSTEM\\CurrentControlSet\\Services\\" PACKAGE_NAME),
183 _serviceRunning(false),
188 _serviceStatusHandle()
231 ::RegisterServiceCtrlHandler(
242 else if(argc>=2 && 0==::strcmp(argv[1],
"service"))
246 SERVICE_TABLE_ENTRY servicetable[]=
248 {name,(LPSERVICE_MAIN_FUNCTION)
::main},
251 if(! ::StartServiceCtrlDispatcher(servicetable) )
258 else if(argc>=2 && 0==::strcmp(argv[1],
"install"))
264 else if(argc>=2 && 0==::strcmp(argv[1],
"uninstall"))
270 else if(argc>=2 && 0==::strcmp(argv[1],
"getoptions"))
276 else if(argc>=2 && 0==::strcmp(argv[1],
"setoptions"))
281 else if(argc>=2 && 0==::strcmp(argv[1],
"run"))
344 case SERVICE_CONTROL_SHUTDOWN:
345 case SERVICE_CONTROL_STOP:
347 service.setServiceStatus(SERVICE_STOP_PENDING,NO_ERROR,0,1,6000);
365 args.push_back(param);
366 param=::strtok(NULL,
"\t ");
370 _argv=
new char*[argc+args.size()];
373 for(
int j=0; j<args.size(); ++j)
375 for(
int k=1; k<argc; ++k)
387 char exe_file_name[MAX_PATH];
388 if(0== ::GetModuleFileName(0, exe_file_name, MAX_PATH) )
394 string command =string(exe_file_name)+
" service";
396 SC_HANDLE scmanager =::OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE);
406 "CORBA Event Daemon",
408 SERVICE_WIN32_OWN_PROCESS,
410 SERVICE_ERROR_NORMAL,
419 if(0== ::CloseServiceHandle(
service) )
424 if(0== ::CloseServiceHandle(scmanager) )
440 "Asynchronous broadcast channels for CORBA applications.") )
450 SC_HANDLE scmanager =::OpenSCManager(0,0,SC_MANAGER_CREATE_SERVICE);
460 SC_MANAGER_ALL_ACCESS
467 if(0== ::DeleteService(
service) )
472 if(0== ::CloseServiceHandle(
service) )
477 if(0== ::CloseServiceHandle(scmanager) )
510 string parameters =
"";
511 for(
int i=2; i<argc; ++i)
513 if(!parameters.empty())
517 if(0!= rkey.
setValueStr(
"Parameters",parameters.c_str()) )
528 DWORD serviceSpecificExitCode,
533 s.dwServiceType =SERVICE_WIN32_OWN_PROCESS;
534 s.dwCurrentState =currentState;
535 s.dwServiceSpecificExitCode=serviceSpecificExitCode;
536 s.dwCheckPoint =checkPoint;
537 s.dwWaitHint =waitHint;
539 if(currentState==SERVICE_START_PENDING)
540 s.dwControlsAccepted=0;
542 s.dwControlsAccepted=SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
544 if(serviceSpecificExitCode==0)
545 s.dwWin32ExitCode=win32ExitCode;
547 s.dwWin32ExitCode=ERROR_SERVICE_SPECIFIC_ERROR;
#define HERE
Generates a string literal that describes the filename and line number.
int main(int argc, char **argv)
The main process entry point.
void OmniEvents_Orb_shutdown(int signum)
Signal handler, sets Orb::_shutdownRequested.
void OmniEvents_Orb_bumpTraceLevel(int signum)
Signal handler, each call to this method 'bumps' up the trace level by 5, modulo 45.
static Service service
Singleton - only at file scope.
void shutdown0(void)
Param to atexit().
void setLogFunction(void(*logFunction)(const char *))
void pidfile(const char *val)
Set _pidfile.
Daemon()
No implementation.
void foreground(bool val)
Set _foreground.
void runningOk()
Called to signal that all startup operations have completed OK.
void tracefile(const char *val)
Set _tracefile.
void daemonize()
Redirects output streams to tracefile.
Utility class, contains functions that Windows should have, but doesn't.
static void perror(const char *s=NULL)
static const char * strerror(DWORD e)
Opens a windows registry key, and closed it upon destruction.
~RegistryKey()
Destructor, closes the key.
char * queryValueStr(const char *name, const int maxlen=2048) const
RegistryKey()
No implementation.
RegistryKey(HKEY hkey, bool open=true)
int setValueStr(const char *name, const char *data)
Singleton class that contains various methods for running a Windows service.
void tracefile(const char *val)
Set _tracefile.
void Service::setArgcArgv(int &argc, char **&argv)
void install(int argc, char **argv) const
std::ostream * _logstream
void pidfile(const char *val)
Set _pidfile.
void foreground(bool val)
Set _foreground.
bool Service::setServiceStatus(DWORD currentState, DWORD win32ExitCode, DWORD serviceSpecificExitCode, DWORD checkPoint, DWORD waitHint)
char * _tracefile
The tracefile name (if any).
void start(int &argc, char **&argv)
void shutdown()
Exit handler set with ::on_exit() - shuts down the service.
void writeParameters(int argc, char **argv) const
Writes args 2+ to the Registry.
SERVICE_STATUS_HANDLE _serviceStatusHandle
Windows thing.
char * _parameters
Stores parameters read from the registry.
static void log(const char *message)
Callback, used as a parameter to omniORB::setLogFunction().
void runningOk()
Called to signal that all startup operations have completed OK.
void readParameters()
Populates _parameters from the Registry.
void daemonize()
Redirects output streams to tracefile.
static void ctrlHandler(DWORD controlCode)
Handles control codes from the Service Control Manager.
char ** _argv
Replacement argv array, read from registry.