Пример #1
0
int _tmain(int argc, char* argv[])
{
	// Install a Service if -i switch used
	if (argc == 2) {
		if (_stricmp(argv[1], "-u") == 0) {
			vDelService();
		}
		else if (_stricmp(argv[1], "-start") == 0) {
			vStartService();
		}
		else if (_stricmp(argv[1], "-stop") == 0) {
			vStopService();
		}
		else if (_stricmp (argv[1], "-status") == 0)
		{
			vPrintServiceStatus ();
		}
		else WriteLog(sLogFile, "Invalid Argument.\n");
	}
	else if (argc == 3) { // service 등록시 CUBRIDService.exe의 디렉토리 위치가 입력되어야 함.
		if (_stricmp(argv[1], "-i") == 0) {
			if (strlen(argv[2]) > 0) strcpy_s(sExecPath, argv[2]);

			vctrlService();
		}
		else WriteLog(sLogFile, "Invalid Argument.\n");
	}
	else WriteLog(sLogFile, "Invalid Argument.\n");

    return 0;
}
Пример #2
0
int
_tmain (int argc, char *argv[])
{
  bool rc;

  // Install a Service if -i switch used
  if (argc == 2)
    {
      if (_stricmp (argv[1], "-u") == 0)
	{
	  vDelService ();
	}
      else if (_stricmp (argv[1], "-start") == 0)
	{
	  vStartService ();
	}
      else if (_stricmp (argv[1], "-stop") == 0)
	{
	  vStopService ();
	}
      else if (_stricmp (argv[1], "-status") == 0)
	{
	  vPrintServiceStatus ();
	}
      else
	WriteLog (sLogFile, "Invalid Argument.\n");
    }
  else if (argc == 3)
    {
      if (_stricmp (argv[1], "-i") == 0)
	{
	  if (strlen (argv[2]) > 0)
	    strcpy_s (sExecPath, argv[2]);

	  vctrlService ();
	}
      else
	{
	  SERVICE_STATUS ss;
	  int service_control_code;

	  SC_HANDLE scmHandle =
	    OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);

	  if (scmHandle == NULL)	// Perform error handling.
	    {
	      WriteLog (sLogFile,
			"(%d)Cannot connect to the Windows Service Control Manager.\n",
			GetLastError ());
	      return 0;
	    }

	  SC_HANDLE scHandle =
	    OpenServiceA (scmHandle, "CUBRIDService", SERVICE_ALL_ACCESS);

	  if (_stricmp (argv[1], CUBRID_UTIL_SERVICE) == 0)
	    {
	      if (_stricmp (argv[2], CUBRID_COMMAND_START) == 0)
		{
		  service_control_code = SERVICE_CONTROL_SERVICE_START;
		}
	      else if (_stricmp (argv[2], CUBRID_COMMAND_STOP) == 0)
		{
		  service_control_code = SERVICE_CONTROL_SERVICE_STOP;
		}
	      else
		{
		  WriteLog (sLogFile, "Invalid Argument.\n");
		  CloseServiceHandle (scHandle);
		  CloseServiceHandle (scmHandle);
		  return 0;
		}
	    }
	  else if (_stricmp (argv[1], CUBRID_UTIL_BROKER) == 0)
	    {
	      if (_stricmp (argv[2], CUBRID_COMMAND_START) == 0)
		{
		  service_control_code = SERVICE_CONTROL_BROKER_START;
		}
	      else if (_stricmp (argv[2], CUBRID_COMMAND_STOP) == 0)
		{
		  service_control_code = SERVICE_CONTROL_BROKER_STOP;
		}
	      else
		{
		  WriteLog (sLogFile, "Invalid Argument.\n");
		  CloseServiceHandle (scHandle);
		  CloseServiceHandle (scmHandle);
		  return 0;
		}
	    }
	  else if (_stricmp (argv[1], CUBRID_UTIL_SHARD) == 0)
	    {
	      if (_stricmp (argv[2], CUBRID_COMMAND_START) == 0)
		{
		  service_control_code = SERVICE_CONTROL_SHARD_START;
		}
	      else if (_stricmp (argv[2], CUBRID_COMMAND_STOP) == 0)
		{
		  service_control_code = SERVICE_CONTROL_SHARD_STOP;
		}
	      else
		{
		  WriteLog (sLogFile, "Invalid Argument.\n");
		  CloseServiceHandle (scHandle);
		  CloseServiceHandle (scmHandle);
		  return 0;
		}
	    }
	  else if (_stricmp (argv[1], CUBRID_UTIL_MANAGER) == 0)
	    {
	      if (_stricmp (argv[2], CUBRID_COMMAND_START) == 0)
		{
		  service_control_code = SERVICE_CONTROL_MANAGER_START;
		}
	      else if (_stricmp (argv[2], CUBRID_COMMAND_STOP) == 0)
		{
		  service_control_code = SERVICE_CONTROL_MANAGER_STOP;
		}
	      else
		{
		  WriteLog (sLogFile, "Invalid Argument.\n");
		  CloseServiceHandle (scHandle);
		  CloseServiceHandle (scmHandle);
		  return 0;
		}
	    }
	  else
	    {
	      WriteLog (sLogFile, "Invalid Argument.\n");
	      CloseServiceHandle (scHandle);
	      CloseServiceHandle (scmHandle);
	      return 0;
	    }

	  ControlService (scHandle, SERVICE_CONTROL_INTERROGATE, &ss);
	  if (ss.dwCurrentState == SERVICE_STOPPED)
	    {
	      LPCTSTR argv[2] =
		{ "CUBRIDService", "--dont-start-cubrid-process" };

	      if (service_control_code == SERVICE_CONTROL_SERVICE_STOP)
		{
		  CloseServiceHandle (scHandle);
		  CloseServiceHandle (scmHandle);
		  return 0;
		}

	      StartService (scHandle, 2, argv);
	      Sleep (2000);

	      do
		{
		  ControlService (scHandle, SERVICE_CONTROL_INTERROGATE, &ss);
		  Sleep (100);
		}
	      while (ss.dwCurrentState == SERVICE_START_PENDING);
	    }

	  // send control code
	  rc = ControlService (scHandle, service_control_code, &ss);
	  if (!rc && ss.dwCurrentState == SERVICE_RUNNING
	      && GetLastError () == ERROR_SERVICE_REQUEST_TIMEOUT)
	    {
	      if (!ControlService
		  (scHandle, SERVICE_CONTROL_INTERROGATE, &ss))
		{
		  WriteLog (sLogFile,
			    "ControlService error. check status manually.\n");
		}
	    }
	  CloseServiceHandle (scHandle);
	  CloseServiceHandle (scmHandle);
	}
    }
  else if (argc == 4)
    {
      if (_stricmp (argv[1], CUBRID_UTIL_SERVER) == 0 ||
	  _stricmp (argv[1], CUBRID_UTIL_BROKER) == 0)
	{
	  SERVICE_STATUS ss;
	  int service_control_code;

	  SC_HANDLE scmHandle =
	    OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);

	  if (scmHandle == NULL)	// Perform error handling.
	    {
	      WriteLog (sLogFile,
			"(%d)Cannot connect to the Windows Service Control Manager.\n",
			GetLastError ());
	      return 0;
	    }

	  SC_HANDLE scHandle =
	    OpenServiceA (scmHandle, "CUBRIDService", SERVICE_ALL_ACCESS);
	  if (_stricmp (argv[1], CUBRID_UTIL_SERVER) == 0 &&
	      _stricmp (argv[2], CUBRID_COMMAND_START) == 0)
	    {
	      service_control_code = SERVICE_CONTROL_SERVER_START;
	    }
	  else if (_stricmp (argv[1], CUBRID_UTIL_SERVER) == 0 &&
		   _stricmp (argv[2], CUBRID_COMMAND_STOP) == 0)
	    {
	      service_control_code = SERVICE_CONTROL_SERVER_STOP;
	    }
	  else if (_stricmp (argv[1], CUBRID_UTIL_BROKER) == 0 &&
		   _stricmp (argv[2], CUBRID_COMMAND_ON) == 0)
	    {
	      service_control_code = SERVICE_CONTROL_BROKER_ON;
	    }
	  else if (_stricmp (argv[1], CUBRID_UTIL_BROKER) == 0 &&
		   _stricmp (argv[2], CUBRID_COMMAND_OFF) == 0)
	    {
	      service_control_code = SERVICE_CONTROL_BROKER_OFF;
	    }
	  else
	    {
	      WriteLog (sLogFile, "Invalid Argument.\n");
	      CloseServiceHandle (scHandle);
	      CloseServiceHandle (scmHandle);
	      return 0;
	    }

	  ControlService (scHandle, SERVICE_CONTROL_INTERROGATE, &ss);
	  if (ss.dwCurrentState == SERVICE_STOPPED)
	    {
	      LPCTSTR argv[2] =
		{ "CUBRIDService", "--dont-start-cubrid-process" };
	      StartService (scHandle, 2, argv);
	      Sleep (2000);

	      do
		{
		  ControlService (scHandle, SERVICE_CONTROL_INTERROGATE, &ss);
		  Sleep (100);
		}
	      while (ss.dwCurrentState == SERVICE_START_PENDING);
	    }

	  char *db_name = TEXT (argv[3]);
	  if (write_string_value_in_registry (HKEY_LOCAL_MACHINE,
					      "SOFTWARE\\CUBRID\\CUBRID",
					      "CUBRID_DBNAME_FOR_SERVICE",
					      db_name) == false)
	    {
	      WriteLog (sLogFile, "write_string_value_in_registry error.\n");

	      CloseServiceHandle (scHandle);
	      CloseServiceHandle (scmHandle);

	      return 0;
	    }

	  // send control code
	  rc = ControlService (scHandle, service_control_code, &ss);
	  if (!rc && ss.dwCurrentState == SERVICE_RUNNING
	      && GetLastError () == ERROR_SERVICE_REQUEST_TIMEOUT)
	    {
	      if (!ControlService
		  (scHandle, SERVICE_CONTROL_INTERROGATE, &ss))
		{
		  WriteLog (sLogFile,
			    "ControlService error. check status manually.\n");
		}
	    }
	  CloseServiceHandle (scHandle);
	  CloseServiceHandle (scmHandle);
	}
    }
  else
    WriteLog (sLogFile, "Invalid Argument.\n");

  return 0;
}