(file) Return to cimserver.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Server

Diff for /pegasus/src/Server/cimserver.cpp between version 1.153 and 1.228

version 1.153, 2005/03/03 03:09:40 version 1.228, 2008/12/16 18:58:05
Line 1 
Line 1 
 //%2005////////////////////////////////////////////////////////////////////////  //%LICENSE////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development  // Licensed to The Open Group (TOG) under one or more contributor license
 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.  // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;  // this work for additional information regarding copyright ownership.
 // IBM Corp.; EMC Corporation, The Open Group.  // Each contributor licenses this file to you under the OpenPegasus Open
 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;  // Source License; you may not use this file except in compliance with the
 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.  // License.
 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;  //
 // EMC Corporation; VERITAS Software Corporation; The Open Group.  // Permission is hereby granted, free of charge, to any person obtaining a
   // copy of this software and associated documentation files (the "Software"),
   // to deal in the Software without restriction, including without limitation
   // the rights to use, copy, modify, merge, publish, distribute, sublicense,
   // and/or sell copies of the Software, and to permit persons to whom the
   // Software is furnished to do so, subject to the following conditions:
   //
   // The above copyright notice and this permission notice shall be included
   // in all copies or substantial portions of the Software.
   //
   // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
   // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
   // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
   // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
   // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy  //////////////////////////////////////////////////////////////////////////
 // of this software and associated documentation files (the "Software"), to  
 // deal in the Software without restriction, including without limitation the  
 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or  
 // sell copies of the Software, and to permit persons to whom the Software is  
 // furnished to do so, subject to the following conditions:  
 //  
 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN  
 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED  
 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT  
 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR  
 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT  
 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN  
 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  
 //  
 //==============================================================================  
 //  
 // Author: Mike Brasher (mbrasher@bmc.com)  
 //  
 // Modified By: Mike Day (mdday@us.ibm.com)  
 //  
 // Modified By: Karl Schopmeyer (k.schopmeyer@opengroup.org)  
 //  
 // Modified By: Nag Boranna (nagaraja_boranna@hp.com)  
 //  
 // Modified By: Jenny Yu (jenny_yu@hp.com)  
 //  
 // Modified By: Sushma Fernandes (sushma_fernandes@hp.com)  
 //              Carol Ann Krug Graves, Hewlett-Packard Company  
 //                (carolann_graves@hp.com)  
 //      Yi Zhou, Hewlett-Packard Company (yi_zhou@hp.com)  
 //  
 // Modified By: Dave Rosckes (rosckes@us.ibm.com)  
 //  
 // Modified By: Humberto Rivero (hurivero@us.ibm.com)  
 //  
 // Modified By: Steve Hills (steve.hills@ncr.com)  
 //              Sean Keenan, Hewlett-Packard Company (sean.keenan@hp.com)  
 //  
 // Modified By: Amit K Arora, IBM (amitarora@in.ibm.com) - pep 167  
 //  
 // Modified By: Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) - Bug#2555  
 //  
 // Modified By: Josephine Eskaline Joyce, IBM (jojustin@in.ibm.com) - Bug#2032  
 //  
 // Modified By: Heather Sterling, IBM (hsterl@us.ibm.com) - PEP#222  
 // //
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
  
 ////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
 // //
 // Notes on deamon operation (Unix) and service operation (Win 32):  // Notes on daemon operation (Unix) and service operation (Win 32):
 // //
 // To run pegasus as a daemon on Unix platforms: // To run pegasus as a daemon on Unix platforms:
 // //
Line 73 
Line 43 
 // //
 // cimserver daemon=false // cimserver daemon=false
 // //
 // The daemon config property has no effect on windows operation.  // The daemon config property has no effect on windows operation or when
   // privilege separation is enabled.
 // //
 // To shutdown pegasus, use the -s option: // To shutdown pegasus, use the -s option:
 // //
Line 104 
Line 75 
 // Alternatively, you can use the windows service manager. Pegasus shows up // Alternatively, you can use the windows service manager. Pegasus shows up
 // in the service database as "Pegasus CIM Object Manager" // in the service database as "Pegasus CIM Object Manager"
 // //
 // Mike Day, mdday@us.ibm.com  
 //  
 ////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
  
  
 #include <Pegasus/Common/Config.h> #include <Pegasus/Common/Config.h>
 #include <Pegasus/Common/Constants.h> #include <Pegasus/Common/Constants.h>
 #include <iostream>  #include <Pegasus/Common/PegasusAssert.h>
 #include <cassert>  
 #include <cstdlib>  
 #include <fstream>  
 #include <Pegasus/Common/FileSystem.h> #include <Pegasus/Common/FileSystem.h>
 #include <Pegasus/Common/Monitor.h>  
 #include <Pegasus/Common/PegasusVersion.h> #include <Pegasus/Common/PegasusVersion.h>
 #include <Pegasus/Common/Logger.h> #include <Pegasus/Common/Logger.h>
   #include <Pegasus/Common/StringConversion.h>
 #include <Pegasus/Common/System.h> #include <Pegasus/Common/System.h>
 #include <Pegasus/Common/Tracer.h> #include <Pegasus/Common/Tracer.h>
   #include <Pegasus/Common/LanguageParser.h>
 #include <Pegasus/Config/ConfigManager.h> #include <Pegasus/Config/ConfigManager.h>
 #include <Pegasus/Client/CIMClient.h> #include <Pegasus/Client/CIMClient.h>
 #include <Pegasus/Server/ShutdownService.h>  
 #include <Pegasus/Server/CIMServer.h> #include <Pegasus/Server/CIMServer.h>
 #include <Service/ServerProcess.h> #include <Service/ServerProcess.h>
   #include <Service/ServerShutdownClient.h>
   #include <Service/ServerRunStatus.h>
   
   #if defined(PEGASUS_OS_ZOS)
   #include <Pegasus/Common/SetFileDescriptorToEBCDICEncoding.h>
   #include <Service/ARM_zOS.h>
   # ifdef PEGASUS_ZOS_SECURITY
   // This include file will not be provided in the OpenGroup CVS for now.
   // Do NOT try to include it in your compile
   #  include <Pegasus/Common/safCheckzOS_inline.h>
   # endif
   #endif
   
   #if defined(PEGASUS_OS_TYPE_UNIX)
   # include <unistd.h>
   # include <sys/types.h>
   # include <sys/stat.h>
   # include <fcntl.h>
   #endif
   
   #ifdef PEGASUS_ENABLE_PRIVILEGE_SEPARATION
   # define PEGASUS_PROCESS_NAME "cimservermain"
   #else
   # define PEGASUS_PROCESS_NAME "cimserver"
   #endif
   
   #include <Pegasus/Common/Executor.h>
   
   #ifdef PEGASUS_OS_PASE
   # include <ILEWrapper/ILEUtilities2.h>
   # include <ILEWrapper/qumemultiutil.h>
   #endif
  
 PEGASUS_USING_PEGASUS; PEGASUS_USING_PEGASUS;
 PEGASUS_USING_STD; PEGASUS_USING_STD;
  
 #define PEGASUS_PROCESS_NAME "cimserver";  
   
 //Windows service variables are not defined elsewhere in the product //Windows service variables are not defined elsewhere in the product
 //enable ability to override these //enable ability to override these
 #ifndef PEGASUS_SERVICE_NAME #ifndef PEGASUS_SERVICE_NAME
Line 141 
Line 137 
 #define PEGASUS_SERVICE_DESCRIPTION "Pegasus CIM Object Manager Service"; #define PEGASUS_SERVICE_DESCRIPTION "Pegasus CIM Object Manager Service";
 #endif #endif
  
   #ifdef PEGASUS_OS_PASE
   #include <as400_protos.h> //for _SETCCSID
   #endif
   
 class CIMServerProcess : public ServerProcess class CIMServerProcess : public ServerProcess
 { {
 public: public:
  
     CIMServerProcess(void)      CIMServerProcess()
     {     {
         cimserver_set_process(this);         cimserver_set_process(this);
     }     }
  
     virtual ~CIMServerProcess(void)      virtual ~CIMServerProcess()
     {     {
     }     }
  
Line 171 
Line 171 
     }     }
  
     //defined in PegasusVersion.h     //defined in PegasusVersion.h
     virtual const char* getVersion() const      virtual const char* getCompleteVersion() const
     {     {
         if (*PEGASUS_PRODUCT_STATUS == '\0' )
         return PEGASUS_PRODUCT_VERSION;         return PEGASUS_PRODUCT_VERSION;
         else
           return PEGASUS_PRODUCT_VERSION " " PEGASUS_PRODUCT_STATUS;
     }     }
  
     virtual const char* getProcessName() const      //defined in PegasusVersion.h
       virtual const char* getVersion() const
     {     {
         return PEGASUS_PROCESS_NAME;          return PEGASUS_PRODUCT_VERSION;
     }     }
  
     //defined in ConfigFileDir.h      virtual const char* getProcessName() const
     virtual const char* getPIDFileName() const  
     {     {
         return CIMSERVER_START_FILE;          return PEGASUS_PROCESS_NAME;
     }     }
  
     int cimserver_run(int argc, char** argv, bool shutdownOption);      int cimserver_run(
           int argc,
           char** argv,
           Boolean shutdownOption,
           Boolean debugOutputOption);
  
     void cimserver_stop(void);      void cimserver_stop();
 }; };
  
   ServerRunStatus _serverRunStatus(
       PEGASUS_PROCESS_NAME, PEGASUS_CIMSERVER_START_FILE);
 AutoPtr<CIMServerProcess> _cimServerProcess(new CIMServerProcess()); AutoPtr<CIMServerProcess> _cimServerProcess(new CIMServerProcess());
 static CIMServer* _cimServer = 0; static CIMServer* _cimServer = 0;
   static Thread* dummyInitialThread = 0;
  
 // //
 //  The command name. //  The command name.
Line 220 
Line 230 
  
 static const char   LONG_VERSION []  = "version"; static const char   LONG_VERSION []  = "version";
  
 #if defined(PEGASUS_OS_HPUX)  static const char OPTION_DEBUGOUTPUT = 'X';
 static const char OPTION_BINDVERBOSE = 'X';  
 #endif  
   
 static const String PROPERTY_TIMEOUT = "shutdownTimeout";  
   
 ConfigManager*    configManager;  
  
 /** GetOptions function - This function defines the Options Table /** GetOptions function - This function defines the Options Table
     and sets up the options from that table using the config manager.     and sets up the options from that table using the config manager.
   
       Some possible exceptions:  NoSuchFile, FileNotReadable, CannotRenameFile,
       ConfigFileSyntaxError, UnrecognizedConfigProperty, InvalidPropertyValue,
       CannotOpenFile.
 */ */
 void GetOptions( void GetOptions(
     ConfigManager* cm,     ConfigManager* cm,
     int& argc,     int& argc,
     char** argv)      char** argv,
 {      Boolean shutdownOption)
     try  
     {  
         cm->mergeConfigFiles();  
   
         cm->mergeCommandLine(argc, argv);  
     }  
     catch (NoSuchFile&)  
     {  
         throw;  
     }  
     catch (FileNotReadable&)  
     {     {
         throw;      if (shutdownOption)
     }  
     catch (CannotRenameFile&)  
     {  
         throw;  
     }  
     catch (ConfigFileSyntaxError&)  
     {  
         throw;  
     }  
     catch(UnrecognizedConfigProperty&)  
     {  
         throw;  
     }  
     catch(InvalidPropertyValue&)  
     {     {
         throw;          cm->loadConfigFiles();
     }     }
     catch (CannotOpenFile&)      else
     {     {
         throw;          cm->mergeConfigFiles();
     }     }
   
       // Temporarily disable updates to the current configuration
       // file if shutdownOption is true
       cm->useConfigFiles = (shutdownOption==false);
   
       cm->mergeCommandLine(argc, argv);
   
       // Enable updates again
       cm->useConfigFiles = true;
 } }
  
 /* PrintHelp - This is temporary until we expand the options manager to allow /* PrintHelp - This is temporary until we expand the options manager to allow
Line 289 
Line 281 
     usage.append ("    -D [home]       - sets pegasus home directory\n");     usage.append ("    -D [home]       - sets pegasus home directory\n");
 #endif #endif
 #if defined(PEGASUS_OS_TYPE_WINDOWS) #if defined(PEGASUS_OS_TYPE_WINDOWS)
     usage.append ("    -install [name] - installs pegasus as a Windows Service\n");      usage.append("    -install [name] - installs pegasus as a Windows "
     usage.append ("                      [name] is optional and overrides the\n");          "Service\n");
       usage.append("                      [name] is optional and overrides "
           "the\n");
     usage.append ("                      default CIM Server Service Name\n");     usage.append ("                      default CIM Server Service Name\n");
     usage.append ("    -remove [name]  - removes pegasus as a Windows Service\n");      usage.append("                      by appending [name]\n");
     usage.append ("                      [name] is optional and overrides the\n");      usage.append("    -remove [name]  - removes pegasus as a Windows "
           "Service\n");
       usage.append("                      [name] is optional and overrides "
           "the\n");
     usage.append ("                      default CIM Server Service Name\n");     usage.append ("                      default CIM Server Service Name\n");
       usage.append("                      by appending [name]\n");
     usage.append ("    -start [name]   - starts pegasus as a Windows Service\n");     usage.append ("    -start [name]   - starts pegasus as a Windows Service\n");
     usage.append ("                      [name] is optional and overrides the\n");      usage.append("                      [name] is optional and overrides "
           "the\n");
     usage.append ("                      default CIM Server Service Name\n");     usage.append ("                      default CIM Server Service Name\n");
       usage.append("                      by appending [name]\n");
     usage.append ("    -stop [name]    - stops pegasus as a Windows Service\n");     usage.append ("    -stop [name]    - stops pegasus as a Windows Service\n");
     usage.append ("                      [name] is optional and overrides the\n");      usage.append("                      [name] is optional and overrides "
     usage.append ("                      default CIM Server Service Name\n\n");          "the\n");
       usage.append("                      default CIM Server Service Name\n");
       usage.append("                      by appending [name]\n\n");
 #endif #endif
     usage.append ("  configProperty=value\n");     usage.append ("  configProperty=value\n");
     usage.append ("                    - sets CIM Server configuration property\n");      usage.append("                    - sets CIM Server configuration "
           "property\n");
  
     cout << endl;     cout << endl;
     cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getVersion() << endl;      cout << _cimServerProcess->getProductName() << " " <<
           _cimServerProcess->getCompleteVersion() << endl;
     cout << endl;     cout << endl;
  
 #if defined(PEGASUS_OS_TYPE_WINDOWS) #if defined(PEGASUS_OS_TYPE_WINDOWS)
     MessageLoaderParms parms("src.Server.cimserver.MENU.WINDOWS", usage);     MessageLoaderParms parms("src.Server.cimserver.MENU.WINDOWS", usage);
 #elif defined(PEGASUS_USE_RELEASE_DIRS) #elif defined(PEGASUS_USE_RELEASE_DIRS)
     MessageLoaderParms parms("src.Server.cimserver.MENU.HPUXLINUXIA64GNU", usage);      MessageLoaderParms parms(
           "src.Server.cimserver.MENU.HPUXLINUXIA64GNU",
           usage);
 #else #else
     MessageLoaderParms parms("src.Server.cimserver.MENU.STANDARD", usage);     MessageLoaderParms parms("src.Server.cimserver.MENU.STANDARD", usage);
 #endif #endif
     cout << MessageLoader::getMessage(parms) << endl;     cout << MessageLoader::getMessage(parms) << endl;
 } }
  
 // l10n  // This needs to be called at various points in the code depending on the
   // platform and error conditions.
   // We need to delete the _cimServer reference on exit in order for the
   // destructors to get called.
   void deleteCIMServer()
   {
       delete _cimServer;
       _cimServer = 0;
   
       if (dummyInitialThread)
       {
           Thread::clearLanguages();
           delete dummyInitialThread;
       }
   }
   
 // //
 // Dummy function for the Thread object associated with the initial thread. // Dummy function for the Thread object associated with the initial thread.
 // Since the initial thread is used to process CIM requests, this is // Since the initial thread is used to process CIM requests, this is
 // needed to localize the exceptions thrown during CIM request processing. // needed to localize the exceptions thrown during CIM request processing.
 // Note: This function should never be called! // Note: This function should never be called!
 // //
 PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL dummyThreadFunc(void *parm)  ThreadReturnType PEGASUS_THREAD_CDECL dummyThreadFunc(void* parm)
 { {
    return((PEGASUS_THREAD_RETURN)0);      return (ThreadReturnType)0;
 } }
  
 void shutdownCIMOM(Uint32 timeoutValue)  #ifdef PEGASUS_ENABLE_PRIVILEGE_SEPARATION
   
   static int _extractExecutorSockOpt(int& argc, char**& argv)
 { {
     //      // Extract the "--executor-socket <sock>" option if any. This indicates
     // Create CIMClient object      // that the e[x]ecutor is running. The option argument is the socket used
     //      // to communicate with the executor. Remove the option from the
     CIMClient client;      // argv list and decrease argc by two.
  
     //      int sock = -1;
     // Get local host name      const char OPT[] = "--executor-socket";
     //  
     String hostStr = System::getHostName();  
  
     //      for (int i = 1; i < argc; i++)
     // open connection to CIMOM      {
     //          if (strcmp(argv[i], OPT) == 0)
     try  
     {     {
         client.connectLocal();              // Check for missing option argument.
  
         //              if (i + 1 == argc)
         // set client timeout to 2 seconds  
         //  
         client.setTimeout(2000);  
     }  
     catch(Exception&)  
     {     {
 #ifdef PEGASUS_OS_OS400                  MessageLoaderParms parms(
     //l10n                      "src.Server.cimserver.MISSING_OPTION_ARGUMENT",
     //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,                      "Missing argument for $0 option.",
             //"Unable to connect to CIM Server.  CIM Server may not be running." );                      OPT);
     Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,                  cerr << argv[0] << ": " << MessageLoader::getMessage(parms) <<
             "src.Server.cimserver.UNABLE_CONNECT_SERVER_MAY_NOT_BE_RUNNING",                      endl;
             "Unable to connect to CIM Server.  CIM Server may not be running." );  
     // The server job may still be active but not responding.  
     // Kill the job if it exists.  
     if(_cimServerProcess->cimserver_kill(0) == -1)  
        _cimServerProcess->cimserver_exitRC(2);  
     _cimServerProcess->cimserver_exitRC(1);  
 #else  
         //l10n  
         //PEGASUS_STD(cerr) << "Unable to connect to CIM Server." << PEGASUS_STD(endl);  
         //PEGASUS_STD(cerr) << "CIM Server may not be running." << PEGASUS_STD(endl);  
         MessageLoaderParms parms("src.Server.cimserver.UNABLE_CONNECT_SERVER_MAY_NOT_BE_RUNNING",  
                                                          "Unable to connect to CIM Server.\nCIM Server may not be running.\n");  
         PEGASUS_STD(cerr) << MessageLoader::getMessage(parms);  
         exit(1);         exit(1);
 #endif  
     }     }
  
     try              // Convert argument to positive integer.
     {  
         //  
         // construct CIMObjectPath  
         //  
         String referenceStr = "//";  
         referenceStr.append(hostStr);  
         referenceStr.append("/");  
         referenceStr.append(PEGASUS_NAMESPACENAME_SHUTDOWN.getString());  
         referenceStr.append(":");  
         referenceStr.append(PEGASUS_CLASSNAME_SHUTDOWN.getString());  
         CIMObjectPath reference(referenceStr);  
   
         //  
         // issue the invokeMethod request on the shutdown method  
         //  
         Array<CIMParamValue> inParams;  
         Array<CIMParamValue> outParams;  
  
         // set force option to true for now              char* end;
         inParams.append(CIMParamValue("force",              unsigned long x = strtoul(argv[i+1], &end, 10);
             CIMValue(Boolean(true))));  
  
         inParams.append(CIMParamValue("timeout",              // Check whether option argument will fit in a signed integer.
             CIMValue(Uint32(timeoutValue))));  
   
         CIMValue retValue = client.invokeMethod(  
             PEGASUS_NAMESPACENAME_SHUTDOWN,  
             reference,  
             "shutdown",  
             inParams,  
             outParams);  
     }  
     catch(CIMException& e)  
     {  
 #ifdef PEGASUS_OS_OS400  
   
     if (e.getCode() == CIM_ERR_INVALID_NAMESPACE)  
     {  
         //l10n  
         //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
             //"Failed to shutdown server: $0", "The repository may be empty.");  
         Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
             "src.Server.cimserver.SHUTDOWN_FAILED_REPOSITORY_EMPTY",  
             "Error in server shutdown: The repository may be empty.");  
     }  
     else  
     {  
         //l10n  
         //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
             //"Failed to shutdown server: $0", e.getMessage());  
         Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
             "src.Server.cimserver.SHUTDOWN_FAILED",  
             "Error in server shutdown: $0", e.getMessage());  
     }  
     // Kill the server job.  
     if(_cimServerProcess->cimserver_kill(0) == -1)  
        _cimServerProcess->cimserver_exitRC(2);  
 #else  
         //l10n - TODO  
         MessageLoaderParms parms("src.Server.cimserver.SHUTDOWN_FAILED",  
                                  "Error in server shutdown: ");  
         PEGASUS_STD(cerr) << MessageLoader::getMessage(parms);  
         if (e.getCode() == CIM_ERR_INVALID_NAMESPACE)  
         {  
             //  
             // Repository may be empty.  
             //  
             //l10n - TODO  
             Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
                 "src.Server.cimserver.SHUTDOWN_FAILED_REPOSITORY_EMPTY",  
                 "Error in server shutdown: The repository may be empty.");  
             MessageLoaderParms parms("src.Server.cimserver.REPOSITORY_EMPTY",  
                                      "The repository may be empty.");  
             PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);  
         }  
         else  
         {  
             //l10n - TODO  
             Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
                 "src.Server.cimserver.SHUTDOWN_FAILED",  
                 "Error in server shutdown: $0", e.getMessage());  
             PEGASUS_STD(cerr) << e.getMessage() << PEGASUS_STD(endl);  
         }  
  
     // Kill the cimserver process              if (*end != '\0' || x > 2147483647)
     if (_cimServerProcess->cimserver_kill(0) == 0)  
         {         {
             //l10n - TODO                  MessageLoaderParms parms(
             Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,                      "src.Server.cimserver.BAD_OPTION_ARGUMENT",
                 "src.Server.cimserver.SERVER_FORCED_SHUTDOWN",                      "Bad $0 option argument: $1.",
             "Forced shutdown initiated.");                      OPT,
             MessageLoaderParms parms("src.Server.cimserver.SERVER_FORCED_SHUTDOWN",                      argv[i+1]);
                                      "Forced shutdown initiated.");                  cerr << argv[0] << ": " << MessageLoader::getMessage(parms) <<
             PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);                      endl;
         }  
         exit(1);         exit(1);
 #endif  
     }  
     catch(Exception&)  
     {  
         //  
         // This may mean that the CIM Server has terminated, causing this  
         // client to get a "Empty HTTP response message" exception.  It may  
         // also mean that the CIM Server is taking longer than 2 seconds  
         // (client timeout value) to terminate, causing this client to  
         // timeout with a "connection timeout" exception.  
         //  
         // Check to see if CIM Server is still running.  If CIM Server  
         // is still running and the shutdown timeout has not expired,  
         // loop and wait one second until either the CIM Server is  
         // terminated or timeout expires.  If timeout expires and  
         // the CIM Server is still running, kill the CIMServer process.  
         //  
         Uint32 maxWaitTime = timeoutValue - 2;  
         Boolean running = _cimServerProcess->isCIMServerRunning();  
         while ( running && maxWaitTime > 0 )  
         {  
             System::sleep(1);  
             running = _cimServerProcess->isCIMServerRunning();  
             maxWaitTime = maxWaitTime - 1;  
         }         }
  
         if (running)              sock = int(x);
         {  
        int kill_rc = _cimServerProcess->cimserver_kill(0);  
  
 #ifdef PEGASUS_OS_OS400              // Remove "-x <sock>" from argv-argc.
         if(kill_rc == -1)  
         _cimServerProcess->cimserver_exitRC(2);  
         _cimServerProcess->cimserver_exitRC(1);  
 #endif  
  
 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \              memmove(argv + i, argv + i + 2, sizeof(char*) * (argc - i - 1));
 || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) \              argc -= 2;
 || defined (PEGASUS_OS_VMS)              break;
         if (kill_rc != -1)  
             {  
                 //l10n - TODO  
                 Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
                     "src.Server.cimserver.TIMEOUT_EXPIRED_SERVER_KILLED",  
                     "Shutdown timeout expired.  Forced shutdown initiated.");  
                 MessageLoaderParms parms("src.Server.cimserver.TIMEOUT_EXPIRED_SERVER_KILLED",  
                     "Shutdown timeout expired.  Forced shutdown initiated.");  
                 cout << MessageLoader::getMessage(parms) << endl;  
                 exit(0);  
             }             }
 #endif  
         }         }
   
       if (sock == -1)
       {
           MessageLoaderParms parms(
               "src.Server.cimserver.MISSING_OPTION",
               "Missing $0 option.",
               OPT);
           cerr << argv[0] << ": " << MessageLoader::getMessage(parms) << endl;
           exit(1);
     }     }
  
     return;      return sock;
 } }
  
   #endif /* PEGASUS_ENABLE_PRIVILEGE_SEPARATION */
  
 ///////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////
 //  MAIN //  MAIN
 ////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
   
 int main(int argc, char** argv) int main(int argc, char** argv)
 { {
     String pegasusHome  = String::EMPTY;      String pegasusHome;
     Boolean shutdownOption = false;     Boolean shutdownOption = false;
       Boolean debugOutputOption = false;
  
 //l10n  
 // Set Message loading to process locale // Set Message loading to process locale
 MessageLoader::_useProcessLocale = true; MessageLoader::_useProcessLocale = true;
 //l10n  
  
 //l10n  #ifdef PEGASUS_OS_ZOS
 #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_HAS_MESSAGES)      // Direct standard input to /dev/null,
 setlocale(LC_ALL, "");      close(STDIN_FILENO);
       open("/dev/null", O_RDONLY);
   
       if ( setEBCDICEncoding(STDOUT_FILENO)==-1 ||
            setEBCDICEncoding(STDERR_FILENO)==-1 )
       {
          PEG_TRACE_CSTRING(TRC_SERVER,Tracer::LEVEL1,
              "Coud not set stdout or stderr to EBCDIC encoding.");
       }
       // Need to initialize timezone information in the
       // initial processing thread (IPT)
       tzset();
 #endif #endif
  
 #ifdef PEGASUS_OS_OS400  #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_HAS_MESSAGES)
       setlocale(LC_ALL, "");
   VFYPTRS_INCDCL;               // VFYPTRS local variables  
   
   // verify pointers  
   #pragma exception_handler (qsyvp_excp_hndlr,qsyvp_excp_comm_area,\  
     0,_C2_MH_ESCAPE)  
     for( int arg_index = 1; arg_index < argc; arg_index++ ){  
     VFYPTRS(VERIFY_SPP_NULL(argv[arg_index]));  
     }  
   #pragma disable_handler  
   
     // Convert the args to ASCII  
     for(Uint32 i = 0;i< argc;++i)  
     {  
     EtoA(argv[i]);  
     }  
   
     // Initialize Pegasus home to the shipped OS/400 directory.  
     pegasusHome = OS400_DEFAULT_PEGASUS_HOME;  
 #endif #endif
  
   
 #ifndef PEGASUS_OS_TYPE_WINDOWS #ifndef PEGASUS_OS_TYPE_WINDOWS
     //     //
     // Get environment variables:     // Get environment variables:
     //     //
 #ifdef PEGASUS_OS_OS400  
 #pragma convert(37)  
     const char* tmp = getenv("PEGASUS_HOME");  
 #pragma convert(0)  
     char home[256] = {0};  
     if (tmp && strlen(tmp) < 256)  
     {  
     strcpy(home, tmp);  
     EtoA(home);  
     pegasusHome = home;  
     }  
 #else  
   #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_USE_RELEASE_DIRS)   #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_USE_RELEASE_DIRS)
     pegasusHome = AIX_RELEASE_PEGASUS_HOME;     pegasusHome = AIX_RELEASE_PEGASUS_HOME;
   #elif !defined(PEGASUS_USE_RELEASE_DIRS)  # elif defined(PEGASUS_OS_PASE)
       const char *tmp = getenv("PEGASUS_HOME");
       pegasusHome = (tmp == 0) ? PASE_DEFAULT_PEGASUS_HOME : tmp;
   # elif !defined(PEGASUS_USE_RELEASE_DIRS) || \
       defined(PEGASUS_OS_ZOS)
     const char* tmp = getenv("PEGASUS_HOME");     const char* tmp = getenv("PEGASUS_HOME");
  
     if (tmp)     if (tmp)
Line 602 
Line 476 
         pegasusHome = tmp;         pegasusHome = tmp;
     }     }
   #endif   #endif
 #endif  
  
     FileSystem::translateSlashes(pegasusHome);     FileSystem::translateSlashes(pegasusHome);
 #else #else
Line 612 
Line 485 
   pegasusHome = _cimServerProcess->getHome();   pegasusHome = _cimServerProcess->getHome();
 #endif #endif
  
   #ifdef PEGASUS_ENABLE_PRIVILEGE_SEPARATION
   
       // If invoked with "--executor-socket <socket>" option, then use executor.
   
       Executor::setSock(_extractExecutorSockOpt(argc, argv));
   
       // Ping executor to verify the specified socket is valid.
   
       if (Executor::ping() != 0)
       {
           MessageLoaderParms parms("src.Server.cimserver.EXECUTOR_PING_FAILED",
               "Failed to ping the executor on the specified socket.");
           cerr << argv[0] << ": " << MessageLoader::getMessage(parms) << endl;
           exit(1);
       }
   
   #endif /* !defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) */
   
         // Get help, version, and shutdown options         // Get help, version, and shutdown options
  
         for (int i = 1; i < argc; )         for (int i = 1; i < argc; )
         {         {
             const char* arg = argv[i];             const char* arg = argv[i];
             if(String::equal(arg,"--help"))              if (strcmp(arg, "--help") == 0)
             {             {
                     PrintHelp(argv[0]);                     PrintHelp(argv[0]);
                   Executor::daemonizeExecutor();
                     exit(0);                     exit(0);
             }             }
             else if(String::equal(arg,"--version"))              else if (strcmp(arg, "--version") == 0)
             {             {
                 cout << _cimServerProcess->getVersion() << endl;                  cout << _cimServerProcess->getCompleteVersion() << endl;
                   Executor::daemonizeExecutor();
                 exit(0);                 exit(0);
             }             }
             // Check for -option             // Check for -option
Line 639 
Line 532 
                 if (*option == OPTION_VERSION &&                 if (*option == OPTION_VERSION &&
                     strlen(option) == 1)                     strlen(option) == 1)
                 {                 {
                     cout << _cimServerProcess->getVersion() << endl;                      cout << _cimServerProcess->getCompleteVersion() << endl;
                       Executor::daemonizeExecutor();
                     exit(0);                     exit(0);
                 }                 }
                 //                 //
Line 649 
Line 543 
                         (strlen(option) == 1))                         (strlen(option) == 1))
                 {                 {
                     PrintHelp(argv[0]);                     PrintHelp(argv[0]);
                       Executor::daemonizeExecutor();
                     exit(0);                     exit(0);
                 }                 }
 #if !defined(PEGASUS_USE_RELEASE_DIRS) #if !defined(PEGASUS_USE_RELEASE_DIRS)
Line 661 
Line 556 
                     }                     }
                     else                     else
                     {                     {
                         //l10n  
                         //cout << "Missing argument for option -" << option << endl;  
                         String opt(option);                         String opt(option);
                         MessageLoaderParms parms("src.Server.cimserver.MISSING_ARGUMENT",                          MessageLoaderParms parms(
                               "src.Server.cimserver.MISSING_ARGUMENT",
                                          "Missing argument for option -$0",                                          "Missing argument for option -$0",
                                          opt);                                          opt);
                         cout << MessageLoader::getMessage(parms) << endl;                         cout << MessageLoader::getMessage(parms) << endl;
                         exit(0);                          exit(1);
                     }                     }
  
                     memmove(&argv[i], &argv[i + 2], (argc-i-1) * sizeof(char*));                     memmove(&argv[i], &argv[i + 2], (argc-i-1) * sizeof(char*));
                     argc -= 2;                     argc -= 2;
                 }                 }
 #endif #endif
 #if defined(PEGASUS_OS_HPUX)  
                 //                 //
                 // Check to see if user asked for the version (-X option):                  // Check to see if user asked for debug output (-X option):
                 //                 //
                 if (*option == OPTION_BINDVERBOSE &&                  else if (*option == OPTION_DEBUGOUTPUT &&
                         (strlen(option) == 1))                         (strlen(option) == 1))
                 {                 {
             System::bindVerbose = true;                      MessageLoaderParms parms(
                     //l10n                          "src.Server.cimserver.UNSUPPORTED_DEBUG_OPTION",
                     //cout << "Unsupported debug option, BIND_VERBOSE, enabled."                          "Unsupported debug output option is enabled.");
                          //<< endl;  
                     MessageLoaderParms parms("src.Server.cimserver.UNSUPPORTED_DEBUG_OPTION",  
                                          "Unsupported debug option, BIND_VERBOSE, enabled.");  
                     cout << MessageLoader::getMessage(parms) << endl;                     cout << MessageLoader::getMessage(parms) << endl;
   
                       debugOutputOption = true;
   
   #if defined(PEGASUS_OS_HPUX)
                       System::bindVerbose = true;
   #endif
   
                     // remove the option from the command line                     // remove the option from the command line
                     memmove(&argv[i], &argv[i + 1], (argc-i) * sizeof(char*));                     memmove(&argv[i], &argv[i + 1], (argc-i) * sizeof(char*));
                     argc--;                     argc--;
                 }                 }
 #endif  
                 //                 //
                 // Check to see if user asked for shutdown (-s option):                 // Check to see if user asked for shutdown (-s option):
                 //                 //
Line 705 
Line 601 
                     //                     //
                     if (shutdownOption)                     if (shutdownOption)
                     {                     {
                         //l10n                          MessageLoaderParms parms(
                         //cout << "Duplicate shutdown option specified." << endl;                              "src.Server.cimserver.DUPLICATE_SHUTDOWN_OPTION",
                         MessageLoaderParms parms("src.Server.cimserver.DUPLICATE_SHUTDOWN_OPTION",  
                                                  "Duplicate shutdown option specified.");                                                  "Duplicate shutdown option specified.");
  
                         cout << MessageLoader::getMessage(parms) << endl;                         cout << MessageLoader::getMessage(parms) << endl;
                         exit(0);                          exit(1);
                     }                     }
  
                     shutdownOption = true;                     shutdownOption = true;
Line 733 
Line 628 
     ConfigManager::setPegasusHome(pegasusHome);     ConfigManager::setPegasusHome(pegasusHome);
  
     //     //
     // Do the plaform specific run      // Do the platform specific run
     //     //
  
     return _cimServerProcess->platform_run( argc, argv, shutdownOption );      return _cimServerProcess->platform_run(
           argc, argv, shutdownOption, debugOutputOption);
 } }
  
 void CIMServerProcess::cimserver_stop() void CIMServerProcess::cimserver_stop()
Line 751 
Line 647 
 // will fail to shutdown properly/cleanly. // will fail to shutdown properly/cleanly.
 // //
 // TODO: Current change minimal for platform "service" shutdown bug fixes. // TODO: Current change minimal for platform "service" shutdown bug fixes.
 // Perhpas further extract out common stuff and put into main(), put  // Perhaps further extract out common stuff and put into main(), put
 // daemon stuff into platform specific platform_run(), etc. // daemon stuff into platform specific platform_run(), etc.
 // Note: make sure to not put error handling stuff that platform // Note: make sure to not put error handling stuff that platform
 // specific runs may need to deal with bettter (instead of exit(), etc).  // specific runs may need to deal with better (instead of exit(), etc).
 // //
  
 int CIMServerProcess::cimserver_run( int argc, char** argv, Boolean shutdownOption )  int CIMServerProcess::cimserver_run(
       int argc,
       char** argv,
       Boolean shutdownOption,
       Boolean debugOutputOption)
 { {
     String logsDirectory = String::EMPTY;  
     Boolean daemonOption = false;     Boolean daemonOption = false;
  
   #if defined (PEGASUS_OS_PASE) && !defined (PEGASUS_DEBUG)
       // PASE have itself regular for checking privileged user
       if (!System::isPrivilegedUser("*CURRENT  "))
       {
           MessageLoaderParms parms(
                   "src.Server.cimserver.NO_AUTHORITY.PEGASUS_OS_PASE",
                   "The caller should be a privileged user,"
                   " or the server will not run.");
           cerr << MessageLoader::getMessage(parms) << endl;
           exit (1);
       }
       char jobName[11];
       // this function only can be found in PASE environment
       umeGetJobName(jobName, false);
       if (strncmp("QUMECIMOM ", jobName, 10) != 0
               && strncmp("QUMEENDCIM", jobName, 10) != 0)
       {
           MessageLoaderParms parms(
                   "src.Server.cimserver.NOT_OFFICIAL_START.PEGASUS_OS_PASE",
                   "cimserver can not be started by user.\nServer will not run.");
           cerr << MessageLoader::getMessage(parms) << endl;
           exit (1);
       }
   
       // Direct standard input, output, and error to /dev/null,
       // PASE run this job in background, any output in not allowed
       freopen("/dev/null", "r", stdin);
       freopen("/dev/null", "w", stdout);
       freopen("/dev/null", "w", stderr);
   #endif
   
     //     //
     // Get an instance of the Config Manager.     // Get an instance of the Config Manager.
     //     //
     configManager = ConfigManager::getInstance();      ConfigManager* configManager = ConfigManager::getInstance();
     configManager->useConfigFiles = true;     configManager->useConfigFiles = true;
  
 #ifdef PEGASUS_OS_OS400      try
     // In a special startup case for IBM OS400, when the server is  
     // automatically started when the machine starts up the config  
     // file cannot be read because of access restrictions for the  
     // user starting the server.  In this case, we need to skip  
     // reading the config options and therefore any use of the config  
     // manager also.  To make this determinations we will check to see  
     // if the daemon flag is set to true.  If so, then there will be a  
     // series of checks to bracket all the calls to the configManager  
     // which would otherwise fail.  All this will only be done for  
     // IBM OS400.  
   
     Boolean os400StartupOption = false;  
     // loop through args to check for daemon=true  
     for (int i=1; i < argc; i++)  
       if (strcmp(argv[i], "daemon=true") == 0)  
       {       {
         os400StartupOption = true;  
         daemonOption = true;  
       }  
 #endif  
   
     //     //
     // Get options (from command line and from configuration file); this     // Get options (from command line and from configuration file); this
     // removes corresponding options and their arguments from the command     // removes corresponding options and their arguments from the command
     // line.          // line.  NOTE: If shutdownOption=true, the contents of current config
           // file are not overwritten by the planned config file.
     //     //
     try          GetOptions(configManager, argc, argv, shutdownOption);
     {  
 #ifdef PEGASUS_OS_OS400  
     if (os400StartupOption == false)  
 #endif  
         GetOptions(configManager, argc, argv);  
     }  
     catch (Exception& e)  
     {  
         Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
             "src.Server.cimserver.SERVER_NOT_STARTED",  
             "cimserver not started:  $0", e.getMessage());  
  
 #if !defined(PEGASUS_OS_OS400)          //
         MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",          // Initialize the message home directory in the MessageLoader.
             "cimserver not started: $0", e.getMessage());          // This is the default directory where the resource bundles are found.
           //
           MessageLoader::setPegasusMsgHome(ConfigManager::getHomedPath(
               ConfigManager::getInstance()->getCurrentValue("messageDir")));
   
   #if !defined(PEGASUS_USE_SYSLOGS)
           String logsDirectory = ConfigManager::getHomedPath(
               configManager->getCurrentValue("logdir"));
  
         PEGASUS_STD(cerr) << argv[0] << ": " << MessageLoader::getMessage(parms)          // Set up the Logger.  This does not open the logs.
             << PEGASUS_STD(endl);          // Might be more logical to clean before set.
           Logger::setHomeDirectory(logsDirectory);
 #endif #endif
  
         return(1);  
     }  
  
 // l10n  #ifdef PEGASUS_OS_PASE
     // Set the home directory, msg sub-dir, into the MessageLoader.          /* write job log to tell where pegasus log is.*/
     // This will be the default directory where the resource bundles          if(logsDirectory.size() > 0)
     // are found.              // this function only can be found in PASE environment
     MessageLoader::setPegasusMsgHome(ConfigManager::getHomedPath(              logPegasusDir2joblog(logsDirectory.getCString());
         ConfigManager::getInstance()->getCurrentValue("messageDir")));          else
               logPegasusDir2joblog(".");
  
 #ifdef PEGASUS_OS_OS400          // set ccsid to unicode for entire job
     // Still need to declare and set the connection variables.          // ccsid is globolization mechanism in PASE environment
     // Will initialize to false since they are fixed at false for OS400.          if (_SETCCSID(1208) == -1)
           {
     // NOTE:  OS400 is a LOCAL_DOMAIN_SOCKET, so a few lines down              MessageLoaderParms parms(
     // the test will not be compiled in.  If OS400 ever turns off that                      "src.Server.cimserver.SET_CCSID_ERROR.PEGASUS_OS_PASE",
     // define, then we will need to change this code path to insure that                      "Failed to set CCSID, server will stop.");
     // one of the variables is true.              cerr << MessageLoader::getMessage(parms) << endl;
     Boolean enableHttpConnection = false;              Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::FATAL,
     Boolean enableHttpsConnection = false;                      parms);
     Boolean enableSSLExportClientVerification = false;              exit (1);
   
     if (os400StartupOption == false)  
     {  
       enableHttpConnection = String::equal(  
           configManager->getCurrentValue("enableHttpConnection"), "true");  
       enableHttpsConnection = String::equal(  
           configManager->getCurrentValue("enableHttpsConnection"), "true");  
       enableSSLExportClientVerification = String::equal(  
           configManager->getCurrentValue("enableSSLExportClientVerification"), "true");  
     }     }
 #else  
     Boolean enableHttpConnection = String::equal(          char fullJobName[29];
         configManager->getCurrentValue("enableHttpConnection"), "true");          umeGetJobName(fullJobName, true);
     Boolean enableHttpsConnection = String::equal(          Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
         configManager->getCurrentValue("enableHttpsConnection"), "true");                  Logger::INFORMATION,
     Boolean enableSSLExportClientVerification = String::equal(                  MessageLoaderParms(
         configManager->getCurrentValue("enableSSLExportClientVerification"), "true");                      "src.Server.cimserver.SERVER_JOB_NAME.PEGASUS_OS_PASE",
                       "CIM Server's Job Name is: $0", fullJobName));
 #endif #endif
  
   #ifdef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
     // Make sure at least one connection is enabled     // Make sure at least one connection is enabled
 #ifndef PEGASUS_LOCAL_DOMAIN_SOCKET  
           Boolean enableHttpConnection = ConfigManager::parseBooleanValue(
               configManager->getCurrentValue("enableHttpConnection"));
           Boolean enableHttpsConnection = ConfigManager::parseBooleanValue(
               configManager->getCurrentValue("enableHttpsConnection"));
   
     if (!enableHttpConnection && !enableHttpsConnection)     if (!enableHttpConnection && !enableHttpsConnection)
     {     {
         //l10n              MessageLoaderParms parms(
         //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,  
             //"Neither HTTP nor HTTPS connection is enabled.  "  
             //"CIMServer will not be started.");  
         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,  
             "src.Server.cimserver.HTTP_NOT_ENABLED_SERVER_NOT_STARTING",             "src.Server.cimserver.HTTP_NOT_ENABLED_SERVER_NOT_STARTING",
             "Neither HTTP nor HTTPS connection is enabled.  CIMServer will not be started.");                  "Neither HTTP nor HTTPS connection is enabled."
         //cerr << "Neither HTTP nor HTTPS connection is enabled.  "                      "  CIMServer will not be started.");
             //"CIMServer will not be started." << endl;              Logger::put_l(
         MessageLoaderParms parms("src.Server.cimserver.HTTP_NOT_ENABLED_SERVER_NOT_STARTING",                  Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
                                  "Neither HTTP nor HTTPS connection is enabled.  CIMServer will not be started.");                  parms);
         cerr << MessageLoader::getMessage(parms) << endl;         cerr << MessageLoader::getMessage(parms) << endl;
         return(1);              return 1;
     }     }
 #endif #endif
  
     try  
     {  
         //         //
         // Check to see if we should Pegasus as a daemon          // Check to see if we should start Pegasus as a daemon
         //         //
           daemonOption = ConfigManager::parseBooleanValue(
               configManager->getCurrentValue("daemon"));
  
         if (String::equal(configManager->getCurrentValue("daemon"), "true"))          if ((Executor::detectExecutor() == 0) && (daemonOption == false))
         {         {
               MessageLoaderParms parms(
                   "src.Server.cimserver.PRIVSEP_REQUIRES_DAEMON",
                   "Warning: The configuration setting daemon=false is ignored "
                       "with privilege separation enabled.");
               cerr << MessageLoader::getMessage(parms) << endl;
             daemonOption = true;             daemonOption = true;
         }         }
  
 #ifdef PEGASUS_OS_OS400  
     if (os400StartupOption == false)  
     {  
 #endif  
         // Get the log file directory definition.  
         // We put String into Cstring because  
         // Directory functions only handle Cstring.  
         // ATTN-KS: create String based directory functions.  
   
         logsDirectory = configManager->getCurrentValue("logdir");  
         logsDirectory =  
         ConfigManager::getHomedPath(configManager->getCurrentValue("logdir"));  
 #ifdef PEGASUS_OS_OS400  
     }  // end if (os400StartupOption == false)  
 #endif  
   
         // Set up the Logger. This does not open the logs  
         // Might be more logical to clean before set.  
         // ATTN: Need tool to completely disable logging.  
   
 #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \  
 !defined(PEGASUS_OS_OS400)  
         Logger::setHomeDirectory(logsDirectory);  
 #endif  
   
         //         //
         // Check to see if we need to shutdown CIMOM         // Check to see if we need to shutdown CIMOM
         //         //
Line 919 
Line 800 
         {         {
             String configTimeout =             String configTimeout =
                 configManager->getCurrentValue("shutdownTimeout");                 configManager->getCurrentValue("shutdownTimeout");
             Uint32 timeoutValue = strtol(configTimeout.getCString(), (char **)0, 10);              Uint32 timeoutValue =
                   strtol(configTimeout.getCString(), (char **)0, 10);
  
             shutdownCIMOM(timeoutValue);              ServerShutdownClient serverShutdownClient(&_serverRunStatus);
               serverShutdownClient.shutdown(timeoutValue);
  
 #ifdef PEGASUS_OS_OS400              MessageLoaderParms parms(
         //l10n  
         //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,  
             //"CIM Server stopped.");  
         Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,  
             "src.Server.cimserver.SERVER_STOPPED",             "src.Server.cimserver.SERVER_STOPPED",
             "CIM Server stopped.");             "CIM Server stopped.");
             cimserver_exitRC(0);  
 #else  
             //l10n  
             //cout << "CIM Server stopped." << endl;  
             MessageLoaderParms parms("src.Server.cimserver.SERVER_STOPPED",  
                                      "CIM Server stopped.");  
  
             cout << MessageLoader::getMessage(parms) << endl;             cout << MessageLoader::getMessage(parms) << endl;
             return(0);              return 0;
 #endif  
         }         }
  
 #if defined(PEGASUS_DEBUG)  #if defined(PEGASUS_DEBUG) && !defined(PEGASUS_USE_SYSLOGS)
         // Leave this in until people get familiar with the logs.         // Leave this in until people get familiar with the logs.
         //l10n  
         //cout << "Logs Directory = " << logsDirectory << endl;  
         MessageLoaderParms parms("src.Server.cimserver.LOGS_DIRECTORY",         MessageLoaderParms parms("src.Server.cimserver.LOGS_DIRECTORY",
                                  "Logs Directory = ");                                  "Logs Directory = ");
         cout << MessageLoader::getMessage(parms) << logsDirectory << endl;         cout << MessageLoader::getMessage(parms) << logsDirectory << endl;
 #endif #endif
     }     }
     catch (UnrecognizedConfigProperty& e)      catch (Exception& e)
     {     {
           MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
 #ifdef PEGASUS_OS_OS400              "cimserver not started: $0", e.getMessage());
     //l10n  
     //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
             //"Error: $0",e.getMessage());  
     Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,     Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
             "src.Server.cimserver.ERROR",              parms);
             "Error: $0",e.getMessage());          cerr << MessageLoader::getMessage(parms) << endl;
 #else  
     //l10n  
     //cout << "Error: " << e.getMessage() << endl;  
     MessageLoaderParms parms("src.Server.cimserver.ERROR",  
                              "Error: $0",  
                              e.getMessage());  
     cout << MessageLoader::getMessage(parms) << endl;  
 #endif  
     }  
   
     Uint32 portNumberHttps=0;  
     Uint32 portNumberHttp=0;  
     Uint32 portNumberExportHttps=0;  
   
     if (enableHttpsConnection)  
     {  
         String httpsPort = configManager->getCurrentValue("httpsPort");  
         CString portString = httpsPort.getCString();  
         char* end = 0;  
         Uint32 port = strtol(portString, &end, 10);  
         if(!(end != 0 && *end == '\0'))  
         {  
             PEGASUS_STD(cerr) << "Bad HTTPS Port Value" << PEGASUS_STD(endl);  
             exit(1);  
         }  
   
   
         //  
         // Look up the WBEM-HTTPS port number  
         //  
         portNumberHttps = System::lookupPort(WBEM_HTTPS_SERVICE_NAME, port);  
     }  
  
     if (enableHttpConnection)          return 1;
     {  
         String httpPort = configManager->getCurrentValue("httpPort");  
         CString portString = httpPort.getCString();  
         char* end = 0;  
         Uint32 port = strtol(portString, &end, 10);  
         if(!(end != 0 && *end == '\0'))  
         {  
             PEGASUS_STD(cerr) << "Bad HTTP Port Value" << PEGASUS_STD(endl);  
             exit(1);  
         }  
         //  
         // Look up the WBEM-HTTP port number  
         //  
         portNumberHttp = System::lookupPort(WBEM_HTTP_SERVICE_NAME, port);  
     }     }
  
     if (enableSSLExportClientVerification)  #if defined(PEGASUS_OS_ZOS) && defined(PEGASUS_ZOS_SECURITY)
     {      startupCheckBPXServer(true);
         //      startupCheckProfileCIMSERVclassWBEM();
         // No config property is looked up to get the default port number.      startupEnableMSC();
         // Lookup the port defined in /etc/services for the service name  #endif
         // wbem-exp-https and bind to that port. If the service is  not defined  
         // then log a warning message and do not start the cimserver.  
         //  
         Uint32 port = 0;  
   
         portNumberExportHttps = System::lookupPort(WBEM_EXPORT_HTTPS_SERVICE_NAME, port);  
   
         if (portNumberExportHttps == 0)  
         {  
             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,  
                 "src.Server.cimserver.EXPORT_HTTPS_PORT_NOT_DEFINED",  
                 "Port not defined for the service wbem-exp-https. CIMServer will not be started.");  
   
             MessageLoaderParms parms("src.Server.cimserver.EXPORT_HTTPS_PORT_NOT_DEFINED",  
                 "Port not defined for the service wbem-exp-https. CIMServer will not be started.");  
   
             cerr << MessageLoader::getMessage(parms) << endl;  
  
             return(1);  
         }  
     }  
 #if defined(PEGASUS_DEBUG) #if defined(PEGASUS_DEBUG)
     // Put out startup up message.     // Put out startup up message.
     cout << _cimServerProcess->getProductName() << " " << _cimServerProcess->getVersion() << endl;      cout << _cimServerProcess->getProductName() << " " <<
     //l10n          _cimServerProcess->getCompleteVersion() << endl;
     //cout << "Built " << __DATE__ << " " << __TIME__ << endl;  
     //cout <<"Starting..."  
     MessageLoaderParms parms("src.Server.cimserver.STARTUP_MESSAGE",  
                              "Built $0 $1\nStarting...",  
                              __DATE__,  
                              __TIME__);  
 #endif #endif
  
 //l10n  
 // reset message loading to NON-process locale // reset message loading to NON-process locale
 MessageLoader::_useProcessLocale = false; MessageLoader::_useProcessLocale = false;
 //l10n  
  
     // Get the parent's PID before forking     // Get the parent's PID before forking
     parentPid = System::getPID();      _serverRunStatus.setParentPid(System::getPID());
  
     // do we need to run as a daemon ?      // Do not fork when using privilege separation (executor will daemonize
       // itself later).
     if (daemonOption)     if (daemonOption)
     {     {
         if(-1 == _cimServerProcess->cimserver_fork())         if(-1 == _cimServerProcess->cimserver_fork())
 #ifndef PEGASUS_OS_OS400              return -1;
     {  
         return(-1);  
     }  
 #else  
     {  
             return(-1);  
     }  
     else  
     {  
         return(0);  
     }  
 #endif  
   
     }     }
  
 // l10n  
     // Now we are after the fork...     // Now we are after the fork...
     // Create a dummy Thread object that can be used to store the     // Create a dummy Thread object that can be used to store the
     // AcceptLanguages object for CIM requests that are serviced      // AcceptLanguageList object for CIM requests that are serviced
     // by this thread (initial thread of server).  Need to do this     // by this thread (initial thread of server).  Need to do this
     // because this thread is not in a ThreadPool, but is used     // because this thread is not in a ThreadPool, but is used
     // to service CIM requests.     // to service CIM requests.
     // The run function for the dummy Thread should never be called,     // The run function for the dummy Thread should never be called,
     Thread *dummyInitialThread = new Thread(dummyThreadFunc, NULL, false);      dummyInitialThread = new Thread(dummyThreadFunc, NULL, false);
     Thread::setCurrent(dummyInitialThread);     Thread::setCurrent(dummyInitialThread);
     AcceptLanguages default_al;      try
     try{      {
          default_al = AcceptLanguages::getDefaultAcceptLanguages();          Thread::setLanguages(LanguageParser::getDefaultAcceptLanguages());
          Thread::setLanguages(new AcceptLanguages(default_al));      }
     }catch(InvalidAcceptLanguageHeader& e){      catch (InvalidAcceptLanguageHeader& e)
       {
           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               MessageLoaderParms(
                   "src.Server.cimserver.FAILED_TO_SET_PROCESS_LOCALE",                   "src.Server.cimserver.FAILED_TO_SET_PROCESS_LOCALE",
                   "Could not convert the system process locale into a valid AcceptLanguage format.");                  "Could not convert the system process locale into a valid "
                       "AcceptLanguage format."));
           Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,           Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                              e.getMessage());                              e.getMessage());
     }     }
  
   #ifndef PEGASUS_OS_TYPE_WINDOWS
       umask(S_IRWXG|S_IRWXO);
 #ifdef PEGASUS_OS_OS400  
     // Special server initialization code for OS/400.  
     if (cimserver_initialize() != 0)  
     {  
     // do some logging here!  
     //l10n  
     //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
             //"CIM Server failed to initialize");  
     Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
                   "src.Server.cimserver.SERVER_FAILED_TO_INITIALIZE",  
                   "CIM Server failed to initialize");  
     return(-1);  
     }  
 #endif #endif
  
       // Start up the CIM Server
  
 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \      try
 || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \      {
 || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) || defined (PEGASUS_OS_VMS)  #if defined(PEGASUS_OS_TYPE_UNIX)
     umask(S_IWGRP|S_IWOTH);  
   
     //     //
     // check if CIMServer is already running          // Lock the CIMSERVER_LOCK_FILE during CIM Server start-up to prevent
     // if CIMServer is already running, print message and          // concurrent writes to this file by multiple cimserver processes
     // notify parent process (if there is a parent process) to terminate          // starting at the same time.
     //     //
     if(_cimServerProcess->isCIMServerRunning())          CString startupLockFileName = ConfigManager::getHomedPath(
               PEGASUS_CIMSERVER_START_LOCK_FILE).getCString();
   
           // Make sure the start-up lock file exists
           FILE* startupLockFile;
           if ((startupLockFile = fopen(startupLockFileName, "w")) != 0)
     {     {
     //l10n              fclose(startupLockFile);
         //cout << "Unable to start CIMServer." << endl;          }
         //cout << "CIMServer is already running." << endl;  
         MessageLoaderParms parms("src.Server.cimserver.UNABLE_TO_START_SERVER_ALREADY_RUNNING",          AutoFileLock fileLock(startupLockFileName);
                      "Unable to start CIMServer.\nCIMServer is already running.");  #endif
     PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);  
  
   #if defined(PEGASUS_OS_TYPE_UNIX) || defined(PEGASUS_OS_VMS)
     //     //
         // notify parent process (if there is a parent process) to terminate          // Check if a CIM Server is already running.  If so, print an error
           // message and notify the parent process (if there is one) to terminate
         //         //
           if (_serverRunStatus.isServerRunning())
           {
               MessageLoaderParms parms(
                   "src.Server.cimserver.UNABLE_TO_START_SERVER_ALREADY_RUNNING",
                   "Unable to start CIMServer. CIMServer is already running.");
               Logger::put_l(
                   Logger::ERROR_LOG, System::CIMSERVER, Logger::INFORMATION,
                   parms);
               cerr << MessageLoader::getMessage(parms) << endl;
   
         if (daemonOption)         if (daemonOption)
               {
                 _cimServerProcess->notify_parent(1);                 _cimServerProcess->notify_parent(1);
               }
  
         return(1);              return 1;
     }     }
  
           //
           // Declare ourselves as the running CIM Server process, and write our
           // PID to the PID file.
           //
           _serverRunStatus.setServerRunning();
 #endif #endif
  
     // try loop to bind the address, and run the server          // Create and initialize the CIMServer object
     try  
     {  
   
  
           _cimServer = new CIMServer();
  
           Boolean enableHttpConnection = ConfigManager::parseBooleanValue(
               configManager->getCurrentValue("enableHttpConnection"));
           Boolean enableHttpsConnection = ConfigManager::parseBooleanValue(
               configManager->getCurrentValue("enableHttpsConnection"));
  
   #ifdef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
           // Make sure at least one connection is enabled
           if (!enableHttpConnection && !enableHttpsConnection)
           {
               MessageLoaderParms parms(
                   "src.Server.cimserver.HTTP_NOT_ENABLED_SERVER_NOT_STARTING",
                   "Neither HTTP nor HTTPS connection is enabled.");
               throw Exception(parms);
           }
   #endif
  
     Monitor monitor;          Boolean addIP6Acceptor = false;
     //PEP#222          Boolean addIP4Acceptor = false;
     //CIMServer server(&monitor);  
     //CimserverHolder cimserverHolder( &server );  
     _cimServer = new CIMServer(&monitor);  
  
   #ifdef PEGASUS_OS_TYPE_WINDOWS
           addIP4Acceptor = true;
   #endif
  
         if (enableHttpConnection)  #ifdef PEGASUS_ENABLE_IPV6
           // If IPv6 stack is disabled swicth to IPv4 stack.
           if (System::isIPv6StackActive())
         {         {
             _cimServer->addAcceptor(false, portNumberHttp, false, false);              addIP6Acceptor = true;
             //l10n  
             //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,  
                         //"Listening on HTTP port $0.", portNumberHttp);  
   
             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,  
                             "src.Server.cimserver.LISTENING_ON_HTTP_PORT",  
                             "Listening on HTTP port $0.", portNumberHttp);  
         }         }
         if (enableHttpsConnection)          else
         {         {
             _cimServer->addAcceptor(false, portNumberHttps, true, false);              MessageLoaderParms parms(
             //l10n                  "src.Server.cimserver.IPV6_STACK_NOT_ACTIVE",
             //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,                  "IPv6 stack is not active, using IPv4 socket.");
                         //"Listening on HTTPS port $0.", portNumberHttps);              Logger::put_l(
             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,                  Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                             "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",                  parms);
                             "Listening on HTTPS port $0.", portNumberHttps);  #if defined(PEGASUS_DEBUG)
               cout << MessageLoader::getMessage(parms) << endl;
   #endif
         }         }
         if (enableSSLExportClientVerification)  #endif
           if (!addIP6Acceptor)
         {         {
             _cimServer->addAcceptor(false, portNumberExportHttps, true, true);              addIP4Acceptor = true;
   
             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,  
                 "src.Server.cimserver.LISTENING_ON_EXPORT_HTTPS_PORT",  
                 "Listening on Export HTTPS port $0.", portNumberExportHttps);  
         }         }
  
 #ifdef PEGASUS_LOCAL_DOMAIN_SOCKET          // The server HTTP and HTTPS ports are determined via this algorithm:
         _cimServer->addAcceptor(true, 0, false, false);          // 1) If the user explicitly specified a port, use it.
         //l10n          // 2) If the user did not specify a port, get the port from the
         //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,          //    services file.
                     //"Listening on local connection socket.");          // 3) If no value is specified in the services file, use the IANA WBEM
         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,          //    default port.
               "src.Server.cimserver.LISTENING_ON_LOCAL",          // Note that 2 and 3 are done within the System::lookupPort method
               "Listening on local connection socket.");          // An empty string from the ConfigManager implies that the user did not
 #endif          // specify a port.
  
 #if defined(PEGASUS_DEBUG)  
         if (enableHttpConnection)         if (enableHttpConnection)
         {         {
             //l10n              Uint32 portNumberHttp = 0;
             //cout << "Listening on HTTP port " << portNumberHttp << endl;              String httpPort = configManager->getCurrentValue("httpPort");
       MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_HTTP_PORT",              if (httpPort == String::EMPTY)
                    "Listening on HTTP port $0.", portNumberHttp);              {
                   //
                   // Look up the WBEM-HTTP port number
                   //
                   portNumberHttp = System::lookupPort(
                       WBEM_HTTP_SERVICE_NAME, WBEM_DEFAULT_HTTP_PORT);
               }
               else
               {
                   //
                   // user-specified
                   //
                   CString portString = httpPort.getCString();
                   char* end = 0;
                   portNumberHttp = strtol(portString, &end, 10);
                   if (!(end != 0 && *end == '\0'))
                   {
                       throw InvalidPropertyValue("httpPort", httpPort);
                   }
               }
   
               if (addIP6Acceptor)
               {
                   _cimServer->addAcceptor(HTTPAcceptor::IPV6_CONNECTION,
                       portNumberHttp, false);
               }
               if (addIP4Acceptor)
               {
                   _cimServer->addAcceptor(HTTPAcceptor::IPV4_CONNECTION,
                       portNumberHttp, false);
               }
               // The port number is converted to a string to avoid the
               //  addition of localized characters (e.g., "5,988").
               char scratchBuffer[22];
               Uint32 n;
               const char * portNumberHttpStr = Uint32ToString(
                   scratchBuffer, portNumberHttp, n);
               MessageLoaderParms parms(
                   "src.Server.cimserver.LISTENING_ON_HTTP_PORT",
                   "Listening on HTTP port $0.", portNumberHttpStr);
               Logger::put_l(
                   Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                   parms);
   #if defined(PEGASUS_DEBUG)
             cout << MessageLoader::getMessage(parms) << endl;             cout << MessageLoader::getMessage(parms) << endl;
   #endif
         }         }
   
         if (enableHttpsConnection)         if (enableHttpsConnection)
         {         {
             //l10n              Uint32 portNumberHttps = 0;
             //cout << "Listening on HTTPS port " << portNumberHttps << endl;              String httpsPort = configManager->getCurrentValue("httpsPort");
             MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_HTTPS_PORT",              if (httpsPort == String::EMPTY)
                      "Listening on HTTPS port $0.", portNumberHttps);              {
             cout << MessageLoader::getMessage(parms) << endl;                  //
                   // Look up the WBEM-HTTPS port number
                   //
                   portNumberHttps = System::lookupPort(
                       WBEM_HTTPS_SERVICE_NAME, WBEM_DEFAULT_HTTPS_PORT);
         }         }
         if (enableSSLExportClientVerification)              else
         {         {
             MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_EXPORT_HTTPS_PORT",                  //
                 "Listening on Export HTTPS port $0.", portNumberExportHttps);                  // user-specified
                   //
                   CString portString = httpsPort.getCString();
                   char* end = 0;
                   portNumberHttps = strtol(portString, &end, 10);
                   if (!(end != 0 && *end == '\0'))
                   {
                       throw InvalidPropertyValue("httpsPort", httpsPort);
                   }
               }
               if (addIP6Acceptor)
               {
                   _cimServer->addAcceptor(HTTPAcceptor::IPV6_CONNECTION,
                       portNumberHttps, true);
               }
               if (addIP4Acceptor)
               {
                   _cimServer->addAcceptor(HTTPAcceptor::IPV4_CONNECTION,
                       portNumberHttps, true);
               }
               // The port number is converted to a string to avoid the
               //  addition of localized characters (e.g., "5,989").
               char scratchBuffer[22];
               Uint32 n;
               const char * portNumberHttpsStr = Uint32ToString(
                   scratchBuffer, portNumberHttps, n);
               MessageLoaderParms parms(
                   "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
                   "Listening on HTTPS port $0.", portNumberHttpsStr);
               Logger::put_l(
                   Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                   parms);
   #if defined(PEGASUS_DEBUG)
             cout << MessageLoader::getMessage(parms) << endl;             cout << MessageLoader::getMessage(parms) << endl;
   #endif
         }         }
  
 # ifdef PEGASUS_LOCAL_DOMAIN_SOCKET  #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
         //l10n          {
         //cout << "Listening on local connection socket" << endl;              _cimServer->addAcceptor(HTTPAcceptor::LOCAL_CONNECTION, 0, false);
         MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_LOCAL",  
               MessageLoaderParms parms(
                   "src.Server.cimserver.LISTENING_ON_LOCAL",
                  "Listening on local connection socket.");                  "Listening on local connection socket.");
               Logger::put_l(
                   Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                   parms);
   # if defined(PEGASUS_DEBUG)
         cout << MessageLoader::getMessage(parms) << endl;         cout << MessageLoader::getMessage(parms) << endl;
 # endif # endif
           }
 #endif #endif
  
         // bind throws an exception if the bind fails  
         _cimServer->bind();         _cimServer->bind();
  
     // notify parent process (if there is a parent process) to terminate     // notify parent process (if there is a parent process) to terminate
         // so user knows that there is cimserver ready to serve CIM requests.         // so user knows that there is cimserver ready to serve CIM requests.
     if (daemonOption)     if (daemonOption)
         _cimServerProcess->notify_parent(0);  
   
     time_t last = 0;  
   
 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) \  
     || defined(PEGASUS_OS_AIX) || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) \  
     || defined(PEGASUS_OS_VMS)  
         //  
         // create a file to indicate that the cimserver has started and  
         // save the process id of the cimserver process in the file  
         //  
         // remove the old file if it exists  
         System::removeFile(_cimServerProcess->getPIDFileName());  
   
         // open the file  
         FILE *pid_file = fopen(_cimServerProcess->getPIDFileName(), "w");  
   
         if (pid_file)  
         {         {
             // save the pid in the file              _cimServerProcess->notify_parent(0);
             fprintf(pid_file, "%ld\n", _cimServerProcess->get_server_pid());  
             fclose(pid_file);  
         }         }
 #endif  
  
 #if defined(PEGASUS_DEBUG) #if defined(PEGASUS_DEBUG)
     cout << "Started. " << endl;     cout << "Started. " << endl;
Line 1274 
Line 1137 
         // Put server started message to the logger         // Put server started message to the logger
         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
             Logger::INFORMATION,             Logger::INFORMATION,
               MessageLoaderParms(
             "src.Server.cimserver.STARTED_VERSION",             "src.Server.cimserver.STARTED_VERSION",
             "Started $0 version $1.",             "Started $0 version $1.",
             _cimServerProcess->getProductName(), _cimServerProcess->getVersion());                  _cimServerProcess->getProductName(),
                   _cimServerProcess->getCompleteVersion()));
  
   #if defined(PEGASUS_OS_TYPE_UNIX) && !defined(PEGASUS_OS_ZOS)
           if (daemonOption && !debugOutputOption)
           {
               // Direct standard input, output, and error to /dev/null,
               // since we are running as a daemon.
               close(STDIN_FILENO);
               open("/dev/null", O_RDONLY);
               close(STDOUT_FILENO);
               open("/dev/null", O_RDWR);
               close(STDERR_FILENO);
               open("/dev/null", O_RDWR);
           }
   #endif
       }
       catch (Exception& e)
       {
           MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
               "cimserver not started: $0", e.getMessage());
           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               parms);
           cerr << MessageLoader::getMessage(parms) << endl;
   
           //
           // notify parent process (if there is a parent process) to terminate
           //
           if (daemonOption)
               _cimServerProcess->notify_parent(1);
   
           deleteCIMServer();
           return 1;
       }
   
       // Run the main CIM Server loop
   
       try
       {
   #if defined(PEGASUS_OS_ZOS)
   
           // ARM is a z/OS internal restart facility.
           // This is a z/OS specific change.
   
           // Instatiating the automatic restart manager for zOS
           ARM_zOS automaticRestartManager;
   
           // register to zOS ARM
           automaticRestartManager.Register();
   
   #endif
   
   #ifdef PEGASUS_ENABLE_SLP
           _cimServer->startSLPProvider();
   #endif
         //         //
         // Loop to call CIMServer's runForever() method until CIMServer         // Loop to call CIMServer's runForever() method until CIMServer
         // has been shutdown         // has been shutdown
         //         //
     while( !_cimServer->terminated() )     while( !_cimServer->terminated() )
     {     {
   
       _cimServer->runForever();       _cimServer->runForever();
   
     }     }
     MessageQueueService::force_shutdown(true);  
         //         //
         // normal termination         // normal termination
     //     //
  
         // Put server shutdown message to the logger  #if defined(PEGASUS_OS_ZOS)
         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,  
             Logger::INFORMATION, "src.Server.cimserver.STOPPED",          // ARM is a z/OS internal restart facility.
             "$0 stopped.", _cimServerProcess->getProductName());          // This is a z/OS specific change.
   
           // register to zOS ARM
           automaticRestartManager.DeRegister();
  
 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \  
 || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \  
 || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC) || defined(PEGASUS_OS_VMS)  
         //  
         // close the file created at startup time to indicate that the  
         // cimserver has terminated normally.  
         //  
         FileSystem::removeFile(_cimServerProcess->getPIDFileName());  
 #endif #endif
   
           // Put server shutdown message to the logger
           Logger::put_l(
               Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
               MessageLoaderParms(
                   "src.Server.cimserver.STOPPED",
                   "$0 stopped.", _cimServerProcess->getProductName()));
     }     }
     catch(Exception& e)     catch(Exception& e)
     {     {
           MessageLoaderParms parms(
     //l10n  
     //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,  
             //"Error: $0", e.getMessage());  
     Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,  
             "src.Server.cimserver.ERROR",             "src.Server.cimserver.ERROR",
             "Error: $0", e.getMessage());              "Error: $0",
               e.getMessage());
 #ifndef PEGASUS_OS_OS400          Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
     //l10n              parms);
     //PEGASUS_STD(cerr) << "Error: " << e.getMessage() << PEGASUS_STD(endl);          cerr << MessageLoader::getMessage(parms) << endl;
     MessageLoaderParms parms("src.Server.cimserver.ERROR",  
                              "Error: $0", e.getMessage());  
     PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);  
   
 #endif  
   
     //  
         // notify parent process (if there is a parent process) to terminate  
         //  
         if (daemonOption)  
                 _cimServerProcess->notify_parent(1);  
  
           deleteCIMServer();
         return 1;         return 1;
     }     }
  
       deleteCIMServer();
     return 0;     return 0;
 } }
   
   
   
   


Legend:
Removed from v.1.153  
changed lines
  Added in v.1.228

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2