diff options
Diffstat (limited to 'ace/NT_Service.cpp')
-rw-r--r-- | ace/NT_Service.cpp | 507 |
1 files changed, 0 insertions, 507 deletions
diff --git a/ace/NT_Service.cpp b/ace/NT_Service.cpp deleted file mode 100644 index 09e77617cc1..00000000000 --- a/ace/NT_Service.cpp +++ /dev/null @@ -1,507 +0,0 @@ -// $Id$ - -// NT_Service.cpp - -#include "ace/inc_user_config.h" -#if defined (ACE_HAS_WINNT4) && ACE_HAS_WINNT4 != 0 - -#define ACE_BUILD_DLL -#include "ace/NT_Service.h" -#include "ace/Service_Object.h" - -#if !defined (__ACE_INLINE__) -#include "ace/NT_Service.i" -#endif /* __ACE_INLINE__ */ - -ACE_ALLOC_HOOK_DEFINE(ACE_NT_Service) - - -// ACE_NT_Service destructor. - -ACE_NT_Service::~ACE_NT_Service (void) -{ - if (svc_sc_handle_ != 0) - { - CloseServiceHandle(svc_sc_handle_); - svc_sc_handle_ = 0; - } - delete[] desc_; - delete[] name_; -} - - -// This default implementation of ACE_NT_Service::open sets the service's -// status to START_PENDING with the estimated time until STARTED set to the -// value given when this object was constructed. Then the svc function is -// called, which implements the guts of the service. Note that this function -// is running in a thread created by the OS, not by ACE_Thread_Manager. -// The thread manager does not know anything about this thread. The service -// can, however, use ACE_Thread_Manager to start more threads if desired. -// When the svc function returns, the service status is set to STOPPED, and -// exit codes set based on errno/GetLastError if the svc function returns -1. -// -// The svc function is expected to set the service status to SERVICE_RUNNING -// after it initializes. -// -// The handle_control function will be called for each time there is a request -// for the service. It is up to that function and svc to cooperate to both -// respond appropriately to the request (by at least updating the service's -// status) and to fulfill the request. - -int -ACE_NT_Service::open (void *args) -{ - -int svc_return; - - report_status(SERVICE_START_PENDING, 0); - - if ((svc_return = this->svc()) == 0) { - this->svc_status_.dwWin32ExitCode = NO_ERROR; - this->svc_status_.dwServiceSpecificExitCode = 0; - } - else { - if (errno == 0) { - this->svc_status_.dwWin32ExitCode = GetLastError(); - } - else { - this->svc_status_.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; - this->svc_status_.dwServiceSpecificExitCode = errno; - } - } - - report_status(SERVICE_STOPPED, 0); - - return svc_return; - -} - -void -ACE_NT_Service::handle_control (DWORD control_code) -{ - - switch(control_code) { - case SERVICE_CONTROL_SHUTDOWN: - case SERVICE_CONTROL_STOP: - stop_requested(control_code); - break; - - case SERVICE_CONTROL_PAUSE: - pause_requested(control_code); - break; - - case SERVICE_CONTROL_CONTINUE: - continue_requested(control_code); - break; - - case SERVICE_CONTROL_INTERROGATE: - interrogate_requested(control_code); - break; - } - - return; - -} - - -void -ACE_NT_Service::stop_requested (DWORD) -{ - this->report_status (SERVICE_STOP_PENDING); - /* how to cancel? */ -} - - -void -ACE_NT_Service::pause_requested (DWORD) -{ - this->report_status (SERVICE_PAUSE_PENDING); - this->suspend (); - report_status (SERVICE_PAUSED); -} - - -void -ACE_NT_Service::continue_requested (DWORD) -{ - this->report_status (SERVICE_CONTINUE_PENDING); - this->resume (); - report_status (SERVICE_RUNNING); -} - - -void -ACE_NT_Service::interrogate_requested (DWORD) -{ - this->report_status (0); -} - - -void -ACE_NT_Service::name (LPCTSTR name, LPCTSTR desc) -{ - - delete[] desc_; - delete[] name_; - - if (desc == 0) - desc = name; - - name_ = ACE::strnew(name); - desc_ = ACE::strnew(desc); - - return; - -} - - -int -ACE_NT_Service::insert (DWORD start_type, - DWORD error_control, - LPCTSTR exe_path, - LPCTSTR group_name, - LPDWORD tag_id, - LPCTSTR dependencies, - LPCTSTR account_name, - LPCTSTR password) -{ - -TCHAR this_exe[MAXPATHLEN]; - - if (exe_path == 0) - { - if (GetModuleFileName(0, this_exe, sizeof(this_exe)) == 0) - return -1; - exe_path = this_exe; - } - - SC_HANDLE sc_mgr = OpenSCManager(0, 0, SC_MANAGER_ALL_ACCESS); - if (sc_mgr == 0) - return -1; - - SC_HANDLE sh = CreateService(sc_mgr, - this->name(), - this->desc(), - SERVICE_ALL_ACCESS, - svc_status_.dwServiceType, - start_type, - error_control, - exe_path, - group_name, - tag_id, - dependencies, - account_name, password); - CloseServiceHandle(sc_mgr); - if (sh == 0) - return -1; - - this->svc_sc_handle_ = sh; - - return 0; - -} - - -int -ACE_NT_Service::remove (void) -{ - - if (this->svc_sc_handle() == 0) - return -1; - - if (DeleteService(this->svc_sc_handle()) == 0 && - GetLastError() != ERROR_SERVICE_MARKED_FOR_DELETE) - return -1; - - return 0; - -} - - -// Sets the startup type for the service. Returns -1 on error, 0 on success. -int -ACE_NT_Service::startup (DWORD startup) -{ - - SC_HANDLE svc = this->svc_sc_handle(); - if (svc == 0) - return -1; - - BOOL ok = ChangeServiceConfig (svc, - SERVICE_NO_CHANGE,// No change to service type - startup, // New startup type - SERVICE_NO_CHANGE,// No change to error ctrl - 0, // No change to pathname - 0, // No change to load group - 0, // No change to tag - 0, // No change to dependencies - 0, 0, // No change to acct/passwd - 0); // No change to name - - return ok ? 0 : -1; - -} - - -// Returns the current startup type. -DWORD -ACE_NT_Service::startup (void) -{ - -// The query buffer will hold strings as well as the defined struct. The -// string pointers in the struct point to other areas in the passed memory -// area, so it has to be large enough to hold the struct plus all the strings. -char cfgbuff[1024]; -LPQUERY_SERVICE_CONFIG cfg; -DWORD cfgsize, needed_size; - - SC_HANDLE svc = this->svc_sc_handle(); - if (svc == 0) - return -1; - - cfgsize = sizeof(cfgbuff); - cfg = (LPQUERY_SERVICE_CONFIG)cfgbuff; - BOOL ok = QueryServiceConfig (svc, cfg, cfgsize, &needed_size); - if (ok) - return cfg->dwStartType; - return 0; - -} - - -int -ACE_NT_Service::start_svc (ACE_Time_Value *wait_time, - DWORD *svc_state, - DWORD argc, LPCTSTR *argv) -{ - - SC_HANDLE svc = this->svc_sc_handle(); - if (svc == 0) - return -1; - - if (!StartService(svc, argc, argv)) - return -1; - - wait_for_service_state (SERVICE_RUNNING, wait_time); - if (svc_state != 0) - *svc_state = this->svc_status_.dwCurrentState; - - return 0; - -} - - -int -ACE_NT_Service::stop_svc (ACE_Time_Value *wait_time, DWORD *svc_state) -{ - - SC_HANDLE svc = this->svc_sc_handle(); - if (svc == 0) - return -1; - - if (!ControlService (svc, SERVICE_CONTROL_STOP, &this->svc_status_)) - return -1; - - wait_for_service_state (SERVICE_STOPPED, wait_time); - if (svc_state != 0) - *svc_state = this->svc_status_.dwCurrentState; - - return 0; - -} - - -int -ACE_NT_Service::pause_svc (ACE_Time_Value *wait_time, DWORD *svc_state) -{ - - SC_HANDLE svc = this->svc_sc_handle(); - if (svc == 0) - return -1; - - if (!ControlService (svc, SERVICE_CONTROL_PAUSE, &this->svc_status_)) - return -1; - - wait_for_service_state (SERVICE_PAUSED, wait_time); - if (svc_state != 0) - *svc_state = this->svc_status_.dwCurrentState; - - return 0; - -} - - -int -ACE_NT_Service::continue_svc (ACE_Time_Value *wait_time, DWORD *svc_state) -{ - - SC_HANDLE svc = this->svc_sc_handle(); - if (svc == 0) - return -1; - - if (!ControlService (svc, SERVICE_CONTROL_CONTINUE, &this->svc_status_)) - return -1; - - wait_for_service_state (SERVICE_RUNNING, wait_time); - if (svc_state != 0) - *svc_state = this->svc_status_.dwCurrentState; - - return 0; - -} - - -DWORD -ACE_NT_Service::state (ACE_Time_Value *wait_hint) -{ - -DWORD curr_state; - - if (this->state (&curr_state, wait_hint) == -1) - return 0; - return curr_state; - -} - - -int -ACE_NT_Service::state (DWORD *pstate, ACE_Time_Value *wait_hint) -{ - - SC_HANDLE svc = this->svc_sc_handle(); - if (svc == 0) - return -1; - - if (QueryServiceStatus (svc, &this->svc_status_) == 0) - return -1; - - if (wait_hint != 0) - { - wait_hint->msec(this->svc_status_.dwWaitHint); - } - - *pstate = this->svc_status_.dwCurrentState; - - return 0; - -} - - - -// test_access -// -// Open a new handle, ignoring any handle open in svc_sc_handle_. This -// function's results are returned without leaving the handle open. -int -ACE_NT_Service::test_access (DWORD desired_access) -{ - - int status = -1; // Guilty until proven innocent - - SC_HANDLE sc_mgr = OpenSCManager(0, 0, GENERIC_READ); - if (sc_mgr != 0) - { - SC_HANDLE handle = OpenService(sc_mgr, - this->name(), - desired_access); - CloseServiceHandle(sc_mgr); - if (handle != 0) - { - status = 0; - CloseServiceHandle (handle); - } - } - - return status; - -} - - - -// report_status -// -// Reports the current status. If new_status is not 0, it sets the -// status to the new value before reporting. NOTE - this assumes that -// no actual service status values have the value 0. This is true in -// WinNT 4. -// If the status is a 'pending' type, the supplied time hint is used -// unless it's 0, in which case the existing hint is used. The dwWaitHint -// is not updated by this function. The checkpoint is incremented -// by one after a pending report. -// -int -ACE_NT_Service::report_status (DWORD new_status, DWORD time_hint) -{ - -int bump_checkpoint = 0, - retval = 0; -DWORD save_controls = 0; - - - if (new_status != 0) - this->svc_status_.dwCurrentState = new_status; - switch(this->svc_status_.dwCurrentState) { - case SERVICE_START_PENDING: - save_controls = this->svc_status_.dwControlsAccepted; - this->svc_status_.dwControlsAccepted = 0; - /* Fall through */ - case SERVICE_STOP_PENDING: - case SERVICE_CONTINUE_PENDING: - case SERVICE_PAUSE_PENDING: - this->svc_status_.dwWaitHint = time_hint ? time_hint : this->start_time_; - bump_checkpoint = 1; - break; - - default: - this->svc_status_.dwCheckPoint = 0; - } - - retval = SetServiceStatus(this->svc_handle_, &this->svc_status_) ? 0 : -1; - - if (save_controls != 0) - this->svc_status_.dwControlsAccepted = save_controls; - - if (bump_checkpoint) - ++this->svc_status_.dwCheckPoint; - - return retval; - -} - - -SC_HANDLE -ACE_NT_Service::svc_sc_handle (void) -{ - - if (svc_sc_handle_ == 0) - { - SC_HANDLE sc_mgr = OpenSCManager(0, 0, SC_MANAGER_ALL_ACCESS); - if (sc_mgr != 0) - { - svc_sc_handle_ = OpenService(sc_mgr, - this->name(), - SERVICE_ALL_ACCESS); - CloseServiceHandle(sc_mgr); - } - } - - return svc_sc_handle_; - -} - - -void -ACE_NT_Service::wait_for_service_state (DWORD desired_state, - ACE_Time_Value *wait_time) -{ - -// Doing the right thing with these needs to be added. -ACE_UNUSED_ARG(desired_state); -ACE_UNUSED_ARG(wait_time); - - QueryServiceStatus (this->svc_sc_handle_, &this->svc_status_); - return; - -} - -#endif /* ACE_HAS_WINNT4 */ |