(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.138 and 1.202

version 1.138, 2004/07/22 23:13:11 version 1.202, 2007/06/19 17:58:04
Line 1 
Line 1 
 //%2003////////////////////////////////////////////////////////////////////////  //%2006////////////////////////////////////////////////////////////////////////
 // //
 // Copyright (c) 2000, 2001, 2002  BMC Software, Hewlett-Packard Development  // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
 // Company, L. P., IBM Corp., The Open Group, Tivoli Systems.  // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.; // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L. P.;
 // IBM Corp.; EMC Corporation, The Open Group. // IBM Corp.; EMC Corporation, The Open Group.
   // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
   // EMC Corporation; VERITAS Software Corporation; The Open Group.
   // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
   // EMC Corporation; Symantec Corporation; The Open Group.
 // //
 // Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
 // of this software and associated documentation files (the "Software"), to // of this software and associated documentation files (the "Software"), to
Line 23 
Line 29 
 // //
 //============================================================================== //==============================================================================
 // //
 // 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)  
 //  
 //%///////////////////////////////////////////////////////////////////////////// //%/////////////////////////////////////////////////////////////////////////////
  
  
 ////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
 // //
 // 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 91 
Line 76 
 // 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/Monitor.h>
 #include <Pegasus/Server/CIMServer.h>  
 #include <Pegasus/Common/PegasusVersion.h> #include <Pegasus/Common/PegasusVersion.h>
 #include <Pegasus/Common/Logger.h> #include <Pegasus/Common/Logger.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 <Service/ServerProcess.h>
 PEGASUS_USING_PEGASUS;  #include <Service/ServerShutdownClient.h>
 PEGASUS_USING_STD;  #include <Service/ServerRunStatus.h>
  
 int cimserver_run( int argc, char** argv, Boolean shutdownOption );  #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)
   #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
  
 Uint32 parentPid = 0;  #if defined(PEGASUS_OS_TYPE_UNIX)
   # include <unistd.h>
   # include <sys/types.h>
   # include <sys/stat.h>
   # include <fcntl.h>
   #endif
  
 #if defined(PEGASUS_OS_TYPE_WINDOWS)  #ifdef PEGASUS_ENABLE_PRIVILEGE_SEPARATION
 # include "cimserver_windows.cpp"  # define PEGASUS_PROCESS_NAME "cimservermain"
 #elif defined(PEGASUS_OS_TYPE_UNIX)  
 # if defined(PEGASUS_OS_OS400)  
 #  include "vfyptrs.cinc"  
 #  include "OS400ConvertChar.h"  
 #  include "cimserver_os400.cpp"  
 # else # else
 #  include "cimserver_unix.cpp"  # define PEGASUS_PROCESS_NAME "cimserver"
 #endif #endif
 #else  
 # error "Unsupported platform"  #include <Pegasus/Common/Executor.h>
   
   PEGASUS_USING_PEGASUS;
   PEGASUS_USING_STD;
   
   //Windows service variables are not defined elsewhere in the product
   //enable ability to override these
   #ifndef PEGASUS_SERVICE_NAME
   #define PEGASUS_SERVICE_NAME "Pegasus CIM Object Manager";
   #endif
   #ifndef PEGASUS_SERVICE_DESCRIPTION
   #define PEGASUS_SERVICE_DESCRIPTION "Pegasus CIM Object Manager Service";
 #endif #endif
  
   class CIMServerProcess : public ServerProcess
   {
   public:
   
       CIMServerProcess(void)
       {
           cimserver_set_process(this);
       }
   
       virtual ~CIMServerProcess(void)
       {
       }
   
       //defined in PegasusVersion.h
       virtual const char* getProductName() const
       {
           return PEGASUS_PRODUCT_NAME;
       }
   
       virtual const char* getExtendedName() const
       {
           return PEGASUS_SERVICE_NAME;
       }
   
       virtual const char* getDescription() const
       {
           return PEGASUS_SERVICE_DESCRIPTION;
       }
   
       //defined in PegasusVersion.h
       virtual const char* getCompleteVersion() const
       {
         if (*PEGASUS_PRODUCT_STATUS == '\0' )
           return PEGASUS_PRODUCT_VERSION;
         else
           return PEGASUS_PRODUCT_VERSION " " PEGASUS_PRODUCT_STATUS;
       }
   
       //defined in PegasusVersion.h
       virtual const char* getVersion() const
       {
           return PEGASUS_PRODUCT_VERSION;
       }
   
       virtual const char* getProcessName() const
       {
           return PEGASUS_PROCESS_NAME;
       }
   
       //defined in Constants.h
       virtual const char* getPIDFileName() const
       {
           return PEGASUS_CIMSERVER_START_FILE;
       }
   
       int cimserver_run(
           int argc,
           char** argv,
           Boolean shutdownOption,
           Boolean debugOutputOption);
   
       void cimserver_stop(void);
   };
   
   ServerRunStatus _serverRunStatus(
       PEGASUS_PROCESS_NAME, PEGASUS_CIMSERVER_START_FILE);
   AutoPtr<CIMServerProcess> _cimServerProcess(new CIMServerProcess());
   static CIMServer* _cimServer = 0;
   static Monitor* _monitor = 0;
   static Thread* dummyInitialThread = 0;
 // //
 //  The command name. //  The command name.
 // //
Line 155 
Line 223 
  
 static const char OPTION_SHUTDOWN    = 's'; static const char OPTION_SHUTDOWN    = 's';
  
 #if defined(PEGASUS_OS_HPUX)  static const char   LONG_HELP []  = "help";
 static const char OPTION_BINDVERBOSE = 'X';  
 #endif  static const char   LONG_VERSION []  = "version";
   
   static const char OPTION_DEBUGOUTPUT = 'X';
  
 static const String PROPERTY_TIMEOUT = "shutdownTimeout"; static const String PROPERTY_TIMEOUT = "shutdownTimeout";
  
 ConfigManager*    configManager; ConfigManager*    configManager;
  
 /** Helper for platform specific handling. So platform specific code  
     can use our single instance of CIMServer.  
 */  
 class CimserverHolder  
 {  
 public:  
         CimserverHolder( CIMServer* s )  
         {  
                 cimserver_set( s );  
         }  
         virtual ~CimserverHolder()  
         {  
                 cimserver_set( 0 );  
         }  
 };  
   
 /** 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;      if (shutdownOption)
     }  
     catch (FileNotReadable&)  
     {  
         throw;  
     }  
     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 229 
Line 271 
 */ */
 void PrintHelp(const char* arg0) void PrintHelp(const char* arg0)
 { {
     /**  
         Build the usage string for the config command.  
     */  
     /* l10n  
     String usage = String (USAGE);     String usage = String (USAGE);
     usage.append (COMMAND_NAME);     usage.append (COMMAND_NAME);
     usage.append (" [ [ options ] | [ configProperty=value, ... ] ]\n");     usage.append (" [ [ options ] | [ configProperty=value, ... ] ]\n");
     usage.append ("  options\n");     usage.append ("  options\n");
     usage.append ("    -v              - displays CIM Server version number\n");      usage.append("    -v, --version   - displays CIM Server version number\n");
     usage.append ("    -h              - prints this help message\n");      usage.append("    -h, --help      - prints this help message\n");
     usage.append ("    -s              - shuts down CIM Server\n");     usage.append ("    -s              - shuts down CIM Server\n");
 #if !defined(PEGASUS_USE_RELEASE_DIRS) #if !defined(PEGASUS_USE_RELEASE_DIRS)
     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 NT 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 NT 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 ("    -start [name]   - starts pegasus as a Windows NT Service\n");      usage.append("                      by appending [name]\n");
     usage.append ("                      [name] is optional and overrides the\n");      usage.append("    -start [name]   - starts 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 ("    -stop [name]    - stops pegasus as a Windows NT Service\n");      usage.append("                      by appending [name]\n");
     usage.append ("                      [name] is optional and overrides the\n");      usage.append("    -stop [name]    - stops pegasus as a Windows Service\n");
     usage.append ("                      default CIM Server Service Name\n\n");      usage.append("                      [name] is optional and overrides "
 #endif          "the\n");
     usage.append ("  configProperty=value\n");  
     usage.append ("                    - sets CIM Server configuration property\n");  
   
     cout << endl;  
 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_IA64_GNU)  
     cout << PLATFORM_PRODUCT_NAME << " " << PLATFORM_PRODUCT_VERSION << endl;  
 #else  
     cout << PEGASUS_NAME << PEGASUS_VERSION << endl;  
 #endif  
     cout << endl;  
     cout << usage << endl;  
     */  
   
     String usage = String (USAGE);  
     usage.append (COMMAND_NAME);  
     usage.append (" [ [ options ] | [ configProperty=value, ... ] ]\n");  
     usage.append ("  options\n");  
     usage.append ("    -v              - displays CIM Server version number\n");  
     usage.append ("    -h              - prints this help message\n");  
     usage.append ("    -s              - shuts down CIM Server\n");  
 #if !defined(PEGASUS_USE_RELEASE_DIRS)  
     usage.append ("    -D [home]       - sets pegasus home directory\n");  
 #endif  
 #if defined(PEGASUS_OS_TYPE_WINDOWS)  
     usage.append ("    -install [name] - installs pegasus as a Windows NT Service\n");  
     usage.append ("                      [name] is optional and overrides the\n");  
     usage.append ("                      default CIM Server Service Name\n");  
     usage.append ("    -remove [name]  - removes pegasus as a Windows NT Service\n");  
     usage.append ("                      [name] is optional and overrides the\n");  
     usage.append ("                      default CIM Server Service Name\n");  
     usage.append ("    -start [name]   - starts pegasus as a Windows NT 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 ("    -stop [name]    - stops pegasus as a Windows NT Service\n");      usage.append("                      by appending [name]\n\n");
     usage.append ("                      [name] is optional and overrides the\n");  
     usage.append ("                      default CIM Server Service 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;
 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_IA64_GNU)      cout << _cimServerProcess->getProductName() << " " <<
     cout << PLATFORM_PRODUCT_NAME << " " << PLATFORM_PRODUCT_VERSION << endl;          _cimServerProcess->getCompleteVersion() << endl;
 #else  
     cout << PEGASUS_NAME << PEGASUS_VERSION << endl;  
 #endif  
     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_OS_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.
 // Dummy function for the Thread object associated with the initial thread.  // We need to delete the _cimServer reference on exit in order for the
 // Since the initial thread is used to process CIM requests, this is  // destructors to get called.
 // needed to localize the exceptions thrown during CIM request processing.  void deleteCIMServer()
 // Note: This function should never be called!  
 //  
 PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL dummyThreadFunc(void *parm)  
 { {
    return((PEGASUS_THREAD_RETURN)0);      if (_cimServer)
 }  
   
 void shutdownCIMOM(Uint32 timeoutValue)  
 {  
     //  
     // Create CIMClient object  
     //  
     CIMClient client;  
   
     //  
     // Get local host name  
     //  
     String hostStr = System::getHostName();  
   
     //  
     // open connection to CIMOM  
     //  
     try  
     {     {
         client.connectLocal();          delete _cimServer;
           _cimServer = 0;
  
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) || \
       defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) || \
       defined(PEGASUS_OS_SOLARIS) || defined(PEGASUS_OS_VMS)
         //         //
         // set client timeout to 2 seconds          //  Remove the PID file to indicate CIMServer termination
         //         //
         client.setTimeout(2000);          FileSystem::removeFile(_cimServerProcess->getPIDFileName());
     }  
     catch(Exception&)  
     {  
 #ifdef PEGASUS_OS_OS400  
         //l10n  
         //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
                     //"Unable to connect to CIM Server.  CIM Server may not be running." );  
         Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
                         "src.Server.cimserver.UNABLE_CONNECT_SERVER_MAY_NOT_BE_RUNNING",  
                     "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(cimserver_kill() == -1)  
            cimserver_exitRC(2);  
         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);  
 #endif #endif
     }     }
  
     try      delete _monitor;
   
       if (dummyInitialThread)
     {     {
         //          Thread::clearLanguages();
         // construct CIMObjectPath          delete dummyInitialThread;
         //      }
         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  // Dummy function for the Thread object associated with the initial thread.
   // Since the initial thread is used to process CIM requests, this is
   // needed to localize the exceptions thrown during CIM request processing.
   // Note: This function should never be called!
         //         //
         Array<CIMParamValue> inParams;  ThreadReturnType PEGASUS_THREAD_CDECL dummyThreadFunc(void* parm)
         Array<CIMParamValue> outParams;  {
       return (ThreadReturnType)0;
         // set force option to true for now  }
         inParams.append(CIMParamValue("force",  
             CIMValue(Boolean(true))));  
  
         inParams.append(CIMParamValue("timeout",  #ifdef PEGASUS_ENABLE_PRIVILEGE_SEPARATION
             CIMValue(Uint32(timeoutValue))));  
  
         CIMValue retValue = client.invokeMethod(  static int _extractExecutorSockOpt(int& argc, char**& argv)
             PEGASUS_NAMESPACENAME_SHUTDOWN,  
             reference,  
             "shutdown",  
             inParams,  
             outParams);  
     }  
     catch(CIMException& e)  
     {     {
 #ifdef PEGASUS_OS_OS400      // Extract the "--executor-socket <sock>" option if any. This indicates
       // that the e[x]ecutor is running. The option argument is the socket used
       // to communicate with the executor. Remove the option from the
       // argv list and decrease argc by two.
  
         if (e.getCode() == CIM_ERR_INVALID_NAMESPACE)      int sock = -1;
         {      const char OPT[] = "--executor-socket";
             //l10n  
             //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,      for (int i = 1; i < argc; i++)
                     //"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(cimserver_kill() == -1)  
            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)  
         {         {
             //          if (strcmp(argv[i], OPT) == 0)
             // 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              // Check for missing option argument.
             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 (i + 1 == argc)
         if (cimserver_kill() == 0)  
         {         {
             //l10n - TODO                  MessageLoaderParms parms(
             Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,                      "src.Server.cimserver.MISSING_OPTION_ARGUMENT",
                 "src.Server.cimserver.SERVER_FORCED_SHUTDOWN",                      "Missing argument for $0 option.",
                         "Forced shutdown initiated.");                      OPT);
             MessageLoaderParms parms("src.Server.cimserver.SERVER_FORCED_SHUTDOWN",                  cerr << argv[0] << ": " << MessageLoader::getMessage(parms) <<
                                      "Forced shutdown initiated.");                      endl;
             PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);  
         }  
         exit(1);         exit(1);
 #endif  
     }     }
     catch(Exception&)  
     {              // Convert argument to positive integer.
         //  
         // This may mean that the CIM Server has terminated, causing this              char* end;
         // client to get a "Empty HTTP response message" exception.  It may              unsigned long x = strtoul(argv[i+1], &end, 10);
         // also mean that the CIM Server is taking longer than 2 seconds  
         // (client timeout value) to terminate, causing this client to              // Check whether option argument will fit in a signed integer.
         // timeout with a "connection timeout" exception.  
         //              if (*end != '\0' || x > 2147483647)
         // 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 = isCIMServerRunning();  
         while ( running && maxWaitTime > 0 )  
         {         {
             System::sleep(1);                  MessageLoaderParms parms(
             running = isCIMServerRunning();                      "src.Server.cimserver.BAD_OPTION_ARGUMENT",
             maxWaitTime = maxWaitTime - 1;                      "Bad $0 option argument: $1.",
                       OPT,
                       argv[i+1]);
                   cerr << argv[0] << ": " << MessageLoader::getMessage(parms) <<
                       endl;
                   exit(1);
         }         }
  
         if (running)              sock = int(x);
         {  
            int kill_rc = cimserver_kill();  
  
 #ifdef PEGASUS_OS_OS400              // Remove "-x <sock>" from argv-argc.
             if(kill_rc == -1)  
                 cimserver_exitRC(2);  
             cimserver_exitRC(1);  
 #endif  
  
 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_PLATFORM_SOLARIS_SPARC_CC)              memmove(argv + i, argv + i + 2, sizeof(char*) * (argc - i - 1));
             if (kill_rc != -1)              argc -= 2;
             {              break;
                 //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  
   
 #ifdef PEGASUS_OS_OS400  
   
   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.  #if defined(PEGASUS_OS_AIX) && defined(PEGASUS_HAS_MESSAGES)
     pegasusHome = OS400_DEFAULT_PEGASUS_HOME;      setlocale(LC_ALL, "");
 #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_USE_RELEASE_DIRS) || \
       defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)
     const char* tmp = getenv("PEGASUS_HOME");     const char* tmp = getenv("PEGASUS_HOME");
  
     if (tmp)     if (tmp)
Line 591 
Line 472 
         pegasusHome = tmp;         pegasusHome = tmp;
     }     }
   #endif   #endif
 #endif  
  
     FileSystem::translateSlashes(pegasusHome);     FileSystem::translateSlashes(pegasusHome);
 #else #else
  
   // windows only   // windows only
   setHome(pegasusHome);      //setHome(pegasusHome);
       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"))
               {
                       PrintHelp(argv[0]);
                       exit(0);
               }
               else if (String::equal(arg,"--version"))
               {
                   cout << _cimServerProcess->getCompleteVersion() << endl;
                   exit(0);
               }
             // Check for -option             // Check for -option
             if (*arg == '-')              else if (*arg == '-')
             {             {
                 // Get the option                 // Get the option
                 const char* option = arg + 1;                 const char* option = arg + 1;
Line 618 
Line 526 
                 if (*option == OPTION_VERSION &&                 if (*option == OPTION_VERSION &&
                     strlen(option) == 1)                     strlen(option) == 1)
                 {                 {
 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_IA64_GNU)                      cout << _cimServerProcess->getCompleteVersion() << endl;
                     cout << PLATFORM_PRODUCT_VERSION << endl;  
 #else  
                     cout << PEGASUS_VERSION << endl;  
 #endif  
                     exit(0);                     exit(0);
                 }                 }
                 //                 //
Line 644 
Line 548 
                     }                     }
                     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;
Line 658 
Line 561 
                     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 688 
Line 593 
                     //                     //
                     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;
Line 716 
Line 620 
     ConfigManager::setPegasusHome(pegasusHome);     ConfigManager::setPegasusHome(pegasusHome);
  
     //     //
     // Do the plaform specific run      // Do the platform specific run
     //     //
  
     return platform_run( argc, argv, shutdownOption );      return _cimServerProcess->platform_run(
           argc, argv, shutdownOption, debugOutputOption);
 } }
  
   void CIMServerProcess::cimserver_stop()
   {
       _cimServer->shutdownSignal();
   }
  
 // //
 // The main, common, running code // The main, common, running code
Line 730 
Line 639 
 // 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 cimserver_run( int argc, char** argv, Boolean shutdownOption )  int CIMServerProcess::cimserver_run(
       int argc,
       char** argv,
       Boolean shutdownOption,
       Boolean debugOutputOption)
 { {
     String logsDirectory = String::EMPTY;      String logsDirectory;
     Boolean daemonOption = false;     Boolean daemonOption = false;
  
     //     //
Line 747 
Line 660 
     configManager = ConfigManager::getInstance();     configManager = ConfigManager::getInstance();
     configManager->useConfigFiles = true;     configManager->useConfigFiles = true;
  
 #ifdef PEGASUS_OS_OS400  
     // 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 776 
Line 667 
     //     //
     try     try
     {     {
 #ifdef PEGASUS_OS_OS400          // If current process is "cimserver -s" (shutdown option = true) the
     if (os400StartupOption == false)          // contents of current config should not be overwritten by planned
 #endif          // config
         GetOptions(configManager, argc, argv);          GetOptions(configManager, argc, argv, shutdownOption);
     }     }
     catch (Exception& e)     catch (Exception& e)
     {     {
Line 787 
Line 678 
             "src.Server.cimserver.SERVER_NOT_STARTED",             "src.Server.cimserver.SERVER_NOT_STARTED",
             "cimserver not started:  $0", e.getMessage());             "cimserver not started:  $0", e.getMessage());
  
 #if !defined(PEGASUS_OS_OS400)  
         MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",         MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
             "cimserver not started: $0", e.getMessage());             "cimserver not started: $0", e.getMessage());
  
         PEGASUS_STD(cerr) << argv[0] << ": " << MessageLoader::getMessage(parms)         PEGASUS_STD(cerr) << argv[0] << ": " << MessageLoader::getMessage(parms)
             << PEGASUS_STD(endl);             << PEGASUS_STD(endl);
 #endif  
  
         return(1);         return(1);
     }     }
  
 // l10n  
         // Set the home directory, msg sub-dir, into the MessageLoader.         // Set the home directory, msg sub-dir, into the MessageLoader.
         // This will be the default directory where the resource bundles         // This will be the default directory where the resource bundles
         // are found.         // are found.
         MessageLoader::setPegasusMsgHome(ConfigManager::getHomedPath(         MessageLoader::setPegasusMsgHome(ConfigManager::getHomedPath(
                 ConfigManager::getInstance()->getCurrentValue("messageDir")));                 ConfigManager::getInstance()->getCurrentValue("messageDir")));
  
 #ifdef PEGASUS_OS_OS400      Boolean enableHttpConnection = ConfigManager::parseBooleanValue(
     // Still need to declare and set the connection variables.          configManager->getCurrentValue("enableHttpConnection"));
     // Will initialize to false since they are fixed at false for OS400.      Boolean enableHttpsConnection = ConfigManager::parseBooleanValue(
           configManager->getCurrentValue("enableHttpsConnection"));
     // NOTE:  OS400 is a LOCAL_DOMAIN_SOCKET, so a few lines down  
     // the test will not be compiled in.  If OS400 ever turns off that  
     // define, then we will need to change this code path to insure that  
     // one of the variables is true.  
     Boolean enableHttpConnection = false;  
     Boolean enableHttpsConnection = false;  
     Boolean enableSSLExportClientVerification = false;  
   
     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(  
         configManager->getCurrentValue("enableHttpConnection"), "true");  
     Boolean enableHttpsConnection = String::equal(  
         configManager->getCurrentValue("enableHttpsConnection"), "true");  
     Boolean enableSSLExportClientVerification = String::equal(  
         configManager->getCurrentValue("enableSSLExportClientVerification"), "true");  
 #endif  
  
     // Make sure at least one connection is enabled     // Make sure at least one connection is enabled
 #ifndef PEGASUS_LOCAL_DOMAIN_SOCKET  #ifdef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
     if (!enableHttpConnection && !enableHttpsConnection)     if (!enableHttpConnection && !enableHttpsConnection)
     {     {
         //l10n  
         //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,         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.  CIMServer will "
         //cerr << "Neither HTTP nor HTTPS connection is enabled.  "                  "not be started.");
             //"CIMServer will not be started." << endl;          MessageLoaderParms parms(
         MessageLoaderParms parms("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.  CIMServer will "
                   "not be started.");
         cerr << MessageLoader::getMessage(parms) << endl;         cerr << MessageLoader::getMessage(parms) << endl;
         return(1);         return(1);
     }     }
Line 858 
Line 718 
     try     try
     {     {
         //         //
         // Check to see if we should Pegasus as a daemon          // Check to see if we should start Pegasus as a daemon
         //         //
  
         if (String::equal(configManager->getCurrentValue("daemon"), "true"))          daemonOption = ConfigManager::parseBooleanValue(
         {              configManager->getCurrentValue("daemon"));
             daemonOption = true;  
         }  
  
 #ifdef PEGASUS_OS_OS400  #if !defined(PEGASUS_USE_SYSLOGS)
     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 =         logsDirectory =
             ConfigManager::getHomedPath(configManager->getCurrentValue("logdir"));             ConfigManager::getHomedPath(configManager->getCurrentValue("logdir"));
 #ifdef PEGASUS_OS_OS400  
     }  // end if (os400StartupOption == false)  
 #endif #endif
  
         // Set up the Logger. This does not open the logs         // Set up the Logger. This does not open the logs
Line 887 
Line 734 
         // ATTN: Need tool to completely disable logging.         // ATTN: Need tool to completely disable logging.
  
 #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \ #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \
 !defined(PEGASUS_OS_OS400)      !defined(PEGASUS_USE_SYSLOGS)
         Logger::setHomeDirectory(logsDirectory);         Logger::setHomeDirectory(logsDirectory);
 #endif #endif
  
Line 898 
Line 745 
         {         {
             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);
   #ifdef PEGASUS_SLP_REG_TIMEOUT
               // To deregister Pegasus with SLP
               unregisterPegasusFromSLP();
   #endif
  
             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) && !defined(PEGASUS_USE_SYSLOGS)
         // Leave this in until people get familiar with the logs.         // Leave this in until people get familiar with the logs.
 #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \  
 !defined(PEGASUS_OS_OS400)  
         //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 (UnrecognizedConfigProperty& e)
     {     {
           // UnrecognizedConfigProperty is already translated
 #ifdef PEGASUS_OS_OS400          // thus, just output the message
         //l10n          Logger::put(Logger::ERROR_LOG,
         //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,                      System::CIMSERVER,
                     //"Error: $0",e.getMessage());                      Logger::SEVERE,
         Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,  
                         "src.Server.cimserver.ERROR",  
                     "Error: $0",e.getMessage());  
 #else  
         //l10n  
         //cout << "Error: " << e.getMessage() << endl;  
         MessageLoaderParms parms("src.Server.cimserver.ERROR",  
                                                          "Error: $0",  
                                                          e.getMessage());                                                          e.getMessage());
         cout << MessageLoader::getMessage(parms) << endl;          cout << e.getMessage() << endl;
 #endif      }
       catch (Exception& ex)
       {
           Logger::put(Logger::ERROR_LOG,
                         System::CIMSERVER,
                         Logger::SEVERE,
                         ex.getMessage());
           cout << ex.getMessage() << endl;
           exit(1);
     }     }
  
     Uint32 portNumberHttps;  #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) && defined(PEGASUS_ZOS_SECURITY)
     Uint32 portNumberHttp;      startupCheckBPXServer(true);
     Uint32 portNumberExportHttps;      startupCheckProfileCIMSERVclassWBEM();
       startupEnableMSC();
   #endif
   
       // Bug 2148 - Here is the order of operations for determining the server
       // HTTP and HTTPS ports.
       // 1) If the user explicitly specified a port, use it.
       // 2) If the user did not specify a port, get the port from the services
       //    file.
       // 3) If no value is specified in the services file, use the IANA WBEM
       //    default port.
       // Note that 2 and 3 are done within the System::lookupPort method
       // An empty string from the ConfigManager implies that the user did not
       // specify a port.
   
       Uint32 portNumberHttps = 0;
       Uint32 portNumberHttp = 0;
       Uint32 portNumberExportHttps = 0;
  
     if (enableHttpsConnection)     if (enableHttpsConnection)
     {     {
         String httpsPort = configManager->getCurrentValue("httpsPort");         String httpsPort = configManager->getCurrentValue("httpsPort");
         CString portString = httpsPort.getCString();          if (httpsPort == String::EMPTY)
         char* end = 0;          {
         Uint32 port = strtol(portString, &end, 10);  
         assert(end != 0 && *end == '\0');  
   
         //         //
         // Look up the WBEM-HTTPS port number         // Look up the WBEM-HTTPS port number
         //         //
         portNumberHttps = System::lookupPort(WBEM_HTTPS_SERVICE_NAME, port);              portNumberHttps = System::lookupPort(
                   WBEM_HTTPS_SERVICE_NAME, WBEM_DEFAULT_HTTPS_PORT);
           }
           else
           {
               //
               // user-specified
               //
               CString portString = httpsPort.getCString();
               char* end = 0;
               portNumberHttps = strtol(portString, &end, 10);
               if (!(end != 0 && *end == '\0'))
               {
                   InvalidPropertyValue e("httpsPort", httpsPort);
                   Logger::put_l(
                       Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                       "src.Server.cimserver.SERVER_NOT_STARTED",
                       "cimserver not started:  $0",
                       e.getMessage());
                   MessageLoaderParms parms(
                       "src.Server.cimserver.SERVER_NOT_STARTED",
                       "cimserver not started: $0",
                       e.getMessage());
                   PEGASUS_STD(cerr) << argv[0] << ": " <<
                       MessageLoader::getMessage(parms) << PEGASUS_STD(endl);
                   exit(1);
               }
           }
     }     }
  
     if (enableHttpConnection)     if (enableHttpConnection)
     {     {
         String httpPort = configManager->getCurrentValue("httpPort");         String httpPort = configManager->getCurrentValue("httpPort");
         CString portString = httpPort.getCString();          if (httpPort == String::EMPTY)
         char* end = 0;          {
         Uint32 port = strtol(portString, &end, 10);  
         assert(end != 0 && *end == '\0');  
   
         //         //
         // Look up the WBEM-HTTP port number         // Look up the WBEM-HTTP port number
         //         //
         portNumberHttp = System::lookupPort(WBEM_HTTP_SERVICE_NAME, port);              portNumberHttp = System::lookupPort(
                   WBEM_HTTP_SERVICE_NAME, WBEM_DEFAULT_HTTP_PORT);
     }     }
           else
     if (enableSSLExportClientVerification)  
     {     {
         //         //
         // No config property is looked up to get the default port number.              // user-specified
         // Lookup the port defined in /etc/services for the service name  
         // 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;              CString portString = httpPort.getCString();
               char* end = 0;
         portNumberExportHttps = System::lookupPort(WBEM_EXPORT_HTTPS_SERVICE_NAME, port);              portNumberHttp = strtol(portString, &end, 10);
               if (!(end != 0 && *end == '\0'))
         if (portNumberExportHttps == 0)  
         {         {
             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,                  InvalidPropertyValue e("httpPort", httpPort);
                 "src.Server.cimserver.EXPORT_HTTPS_PORT_NOT_DEFINED",                  Logger::put_l(
                 "Port not defined for the service wbem-exp-https. CIMServer will not be started.");                      Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                       "src.Server.cimserver.SERVER_NOT_STARTED",
             MessageLoaderParms parms("src.Server.cimserver.EXPORT_HTTPS_PORT_NOT_DEFINED",                      "cimserver not started:  $0",
                 "Port not defined for the service wbem-exp-https. CIMServer will not be started.");                      e.getMessage());
                   MessageLoaderParms parms(
             cerr << MessageLoader::getMessage(parms) << endl;                      "src.Server.cimserver.SERVER_NOT_STARTED",
                       "cimserver not started: $0",
             return(1);                      e.getMessage());
                   PEGASUS_STD(cerr) << argv[0] << ": " <<
                       MessageLoader::getMessage(parms) << PEGASUS_STD(endl);
                   exit(1);
               }
         }         }
     }     }
   
   #if defined(PEGASUS_DEBUG)
     // Put out startup up message.     // Put out startup up message.
 #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \      cout << _cimServerProcess->getProductName() << " " <<
 !defined(PEGASUS_OS_OS400)          _cimServerProcess->getCompleteVersion() << endl;
     cout << PEGASUS_NAME << PEGASUS_VERSION << endl;  
     //l10n  
     //cout << "Built " << __DATE__ << " " << __TIME__ << endl;  
     //cout <<"Starting..."  
     MessageLoaderParms parms("src.Server.cimserver.STARTUP_MESSAGE",     MessageLoaderParms parms("src.Server.cimserver.STARTUP_MESSAGE",
                                                  "Built $0 $1\nStarting...",                                                  "Built $0 $1\nStarting...",
                                                  __DATE__,                                                  __DATE__,
                                                  __TIME__);                                                  __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 == 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;      AcceptLanguageList default_al;
     try{      try
          default_al = AcceptLanguages::getDefaultAcceptLanguages();      {
          Thread::setLanguages(new AcceptLanguages(default_al));           default_al = LanguageParser::getDefaultAcceptLanguages();
     }catch(InvalidAcceptLanguageHeader& e){           Thread::setLanguages(new AcceptLanguageList(default_al));
       }
       catch (InvalidAcceptLanguageHeader& e)
       {
           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
                                   "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);
   #endif
  
  
 #ifdef PEGASUS_OS_OS400  #if defined(PEGASUS_OS_TYPE_UNIX)
     // Special server initialization code for OS/400.      //
     if (cimserver_initialize() != 0)      // CRITICAL SECTION BEGIN
     {      //
         // do some logging here!      // This is the beginning of the critical section regarding the
         //l10n      // access to pidfile (file to indicate that the cimserver has started).
         //Logger::put(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,      // Sometimes, when 2 or more cimserver processes are started at the same
                     //"CIM Server failed to initialize");      // time, they can't detect the concurrent process execution because the
         Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,      // logic fails when pidfile is accessed concurrently.
                                   "src.Server.cimserver.SERVER_FAILED_TO_INITIALIZE",  
                           "CIM Server failed to initialize");      FILE* startupLockFile;
         return(-1);  
       if ((startupLockFile = fopen(ConfigManager::getHomedPath(
               CIMSERVER_LOCK_FILE).getCString(), "w")) != 0)
       {
           lockf(fileno(startupLockFile), F_LOCK, 0);
     }     }
 #endif #endif
  
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_GENERIC_GNU) \
 #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_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
     umask(S_IWGRP|S_IWOTH);      || defined(PEGASUS_OS_SOLARIS) || defined (PEGASUS_OS_VMS)
  
     //     //
     // check if CIMServer is already running     // check if CIMServer is already running
     // if CIMServer is already running, print message and     // if CIMServer is already running, print message and
     // notify parent process (if there is a parent process) to terminate     // notify parent process (if there is a parent process) to terminate
     //     //
     if(isCIMServerRunning())      if (_serverRunStatus.isServerRunning())
     {     {
         //l10n          MessageLoaderParms parms(
                 //cout << "Unable to start CIMServer." << endl;              "src.Server.cimserver.UNABLE_TO_START_SERVER_ALREADY_RUNNING",
                 //cout << "CIMServer is already running." << endl;              "Unable to start CIMServer. CIMServer is already running.");
                 MessageLoaderParms parms("src.Server.cimserver.UNABLE_TO_START_SERVER_ALREADY_RUNNING",          PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) <<
                                          "Unable to start CIMServer.\nCIMServer is already running.");              PEGASUS_STD(endl);
         PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);          Logger::put(Logger::ERROR_LOG,System::CIMSERVER,Logger::INFORMATION,
               MessageLoader::getMessage(parms));
  
         //         //
         // notify parent process (if there is a parent process) to terminate         // notify parent process (if there is a parent process) to terminate
         //         //
         if (daemonOption)         if (daemonOption)
                 notify_parent(1);          {
               _cimServerProcess->notify_parent(1);
           }
  
         return(1);          return 1;
     }     }
  
 #endif #endif
Line 1123 
Line 995 
     // try loop to bind the address, and run the server     // try loop to bind the address, and run the server
     try     try
     {     {
           _monitor = new Monitor();
           _cimServer = new CIMServer(_monitor);
   
   
   
 #if defined(PEGASUS_USE_23HTTPMONITOR_SERVER)  
         Monitor monitor(true);  
         CIMServer server(&monitor);  
 #else  
         monitor_2 monitor;  
         CIMServer server(&monitor);  
 #endif  
   
         CimserverHolder cimserverHolder( &server );  
  
         if (enableHttpConnection)         if (enableHttpConnection)
         {         {
             server.addAcceptor(false, portNumberHttp, false, false);              _cimServer->addAcceptor(false, portNumberHttp, false);
             //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,              Logger::put_l(
                   Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
                                         "src.Server.cimserver.LISTENING_ON_HTTP_PORT",                                         "src.Server.cimserver.LISTENING_ON_HTTP_PORT",
                                 "Listening on HTTP port $0.", portNumberHttp);                                 "Listening on HTTP port $0.", portNumberHttp);
         }         }
   
         if (enableHttpsConnection)         if (enableHttpsConnection)
         {         {
             server.addAcceptor(false, portNumberHttps, true, false);              _cimServer->addAcceptor(false, portNumberHttps, true);
             //l10n  
             //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,              Logger::put_l(
                         //"Listening on HTTPS port $0.", portNumberHttps);                  Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,  
                                         "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",                                         "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
                                 "Listening on HTTPS port $0.", portNumberHttps);                                 "Listening on HTTPS port $0.", portNumberHttps);
         }         }
         if (enableSSLExportClientVerification)  
         {  
             server.addAcceptor(false, portNumberExportHttps, true, true);  
  
             Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,  #ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
                 "src.Server.cimserver.LISTENING_ON_EXPORT_HTTPS_PORT",          _cimServer->addAcceptor(true, 0, false);
                 "Listening on Export HTTPS port $0.", portNumberExportHttps);  
         }  
  
 #ifdef PEGASUS_LOCAL_DOMAIN_SOCKET          Logger::put_l(
         server.addAcceptor(true, 0, false, false);              Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,
         //l10n  
         //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,  
                     //"Listening on local connection socket.");  
         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,  
                       "src.Server.cimserver.LISTENING_ON_LOCAL",                       "src.Server.cimserver.LISTENING_ON_LOCAL",
                       "Listening on local connection socket.");                       "Listening on local connection socket.");
 #endif #endif
  
 #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && !defined(PEGASUS_OS_OS400)  #if defined(PEGASUS_DEBUG)
         if (enableHttpConnection)         if (enableHttpConnection)
         {         {
             //l10n              MessageLoaderParms parms(
             //cout << "Listening on HTTP port " << portNumberHttp << endl;                  "src.Server.cimserver.LISTENING_ON_HTTP_PORT",
           MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_HTTP_PORT",  
                                    "Listening on HTTP port $0.", portNumberHttp);                                    "Listening on HTTP port $0.", portNumberHttp);
                 cout << MessageLoader::getMessage(parms) << endl;                 cout << MessageLoader::getMessage(parms) << endl;
         }         }
         if (enableHttpsConnection)         if (enableHttpsConnection)
         {         {
             //l10n              MessageLoaderParms parms(
             //cout << "Listening on HTTPS port " << portNumberHttps << endl;                  "src.Server.cimserver.LISTENING_ON_HTTPS_PORT",
             MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_HTTPS_PORT",  
                                      "Listening on HTTPS port $0.", portNumberHttps);                                      "Listening on HTTPS port $0.", portNumberHttps);
                 cout << MessageLoader::getMessage(parms) << endl;                 cout << MessageLoader::getMessage(parms) << endl;
         }         }
         if (enableSSLExportClientVerification)  
         {  
             MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_EXPORT_HTTPS_PORT",  
                 "Listening on Export HTTPS port $0.", portNumberExportHttps);  
   
             cout << MessageLoader::getMessage(parms) << endl;  
         }  
  
 # ifdef PEGASUS_LOCAL_DOMAIN_SOCKET  # ifndef PEGASUS_DISABLE_LOCAL_DOMAIN_SOCKET
         //l10n          MessageLoaderParms parms(
         //cout << "Listening on local connection socket" << endl;              "src.Server.cimserver.LISTENING_ON_LOCAL",
         MessageLoaderParms parms("src.Server.cimserver.LISTENING_ON_LOCAL",  
                                  "Listening on local connection socket.");                                  "Listening on local connection socket.");
         cout << MessageLoader::getMessage(parms) << endl;         cout << MessageLoader::getMessage(parms) << endl;
 # endif # endif
 #endif #endif
  
         // bind throws an exception if the bind fails          _cimServer->bind();
         server.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)
                 notify_parent(0);          {
   #if defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION)
         time_t last = 0;              Executor::daemonizeExecutor();
   #else
               _cimServerProcess->notify_parent(0);
   #endif
           }
  
 #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)  #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) || \
       defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) || \
       defined(PEGASUS_OS_SOLARIS) || defined(PEGASUS_OS_VMS)
         //         //
         // create a file to indicate that the cimserver has started and         // create a file to indicate that the cimserver has started and
         // save the process id of the cimserver process in the file         // save the process id of the cimserver process in the file
         //         //
         // remove the old file if it exists          _serverRunStatus.setServerRunning();
         System::removeFile(CIMSERVER_START_FILE);  #endif
  
         // open the file  #if defined(PEGASUS_DEBUG)
         FILE *pid_file = fopen(CIMSERVER_START_FILE, "w");          cout << "Started. " << endl;
   #endif
   
   #if defined(PEGASUS_OS_TYPE_UNIX)
           //
           // CRITICAL SECTION END
           //
           // Here is the unlock of file 'lock_file'. It closes the
           // the critical section that guarantees the non concurrent access to
           // pid file (file to indicate that the cimserver has started).
           //
  
         if (pid_file)          if (startupLockFile)
         {         {
             // save the pid in the file              lockf(fileno(startupLockFile), F_ULOCK, 0);
             fprintf(pid_file, "%ld\n", (long)server_pid);              fclose(startupLockFile);
             fclose(pid_file);  
         }         }
 #endif #endif
  
 #if !defined(PEGASUS_OS_HPUX) && !defined(PEGASUS_PLATFORM_LINUX_IA64_GNU) && \  
 !defined(PEGASUS_OS_OS400)  
         cout << "Started. " << endl;  
 #endif  
  
         // Put server started message to the logger         // Put server started message to the logger
 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_IA64_GNU)          Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
         //l10n              Logger::INFORMATION,
         //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,  
                     //"Started $0 version $1.",  
                     //PLATFORM_PRODUCT_NAME, PLATFORM_PRODUCT_VERSION);  
         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,  
                                 "src.Server.cimserver.STARTED_VERSION",                                 "src.Server.cimserver.STARTED_VERSION",
                     "Started $0 version $1.",                     "Started $0 version $1.",
                     PLATFORM_PRODUCT_NAME, PLATFORM_PRODUCT_VERSION);              _cimServerProcess->getProductName(),
 #else              _cimServerProcess->getCompleteVersion());
                 //l10n  
         //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,  #if defined(PEGASUS_OS_TYPE_UNIX) && !defined(PEGASUS_OS_ZOS)
                     //"Started $0 version $1.",          if (daemonOption && !debugOutputOption)
                     //PEGASUS_NAME, PEGASUS_VERSION);          {
         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,              // Direct standard input, output, and error to /dev/null,
                                 "src.Server.cimserver.STARTED_VERSION",              // since we are running as a daemon.
                     "Started $0 version $1.",              close(0);
                     PEGASUS_NAME, PEGASUS_VERSION);              open("/dev/null", O_RDONLY);
               close(1);
               open("/dev/null", O_RDWR);
               close(2);
               open("/dev/null", O_RDWR);
           }
 #endif #endif
  
   #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)
   
           // 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
  
         //         //
         // 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( !server.terminated() )          while (!_cimServer->terminated())
         {         {
               _cimServer->runForever();
           server.runForever();  
   
         }         }
         MessageQueueService::force_shutdown(true);  
         //         //
         // normal termination         // normal termination
         //         //
         // Put server shutdown message to the logger  #if defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM)
 #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_PLATFORM_LINUX_IA64_GNU)  
         //l10n          // ARM is a z/OS internal restart facility.
         //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,          // This is a z/OS specific change.
             //"$0 stopped.", PLATFORM_PRODUCT_NAME);  
         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,          // register to zOS ARM
                 "src.Server.cimserver.STOPPED",          automaticRestartManager.DeRegister();
             "$0 stopped.", PLATFORM_PRODUCT_NAME);  
 #else  
                 //l10n  
         //Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,  
             //"$0 stopped.", PEGASUS_NAME);  
         Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::INFORMATION,  
                 "src.Server.cimserver.STOPPED",  
             "$0 stopped.", PEGASUS_NAME);  
 #endif #endif
  
 #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)          // Put server shutdown message to the logger
           Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER,
               Logger::INFORMATION, "src.Server.cimserver.STOPPED",
               "$0 stopped.", _cimServerProcess->getProductName());
   
   #if defined(PEGASUS_OS_HPUX) || defined(PEGASUS_OS_LINUX) \
   || defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) || defined(PEGASUS_OS_AIX) \
   || defined(PEGASUS_OS_SOLARIS) || defined(PEGASUS_OS_VMS)
         //         //
         // close the file created at startup time to indicate that the          //  Note: do not remove the PID file created at startup time, since
         // cimserver has terminated normally.          //  shutdown is not complete until the CIMServer destructor completes.
         //         //
         FileSystem::removeFile(CIMSERVER_START_FILE);  
 #endif #endif
     }     }
     catch(Exception& e)      catch (BindFailedException& e)
     {     {
           Logger::put_l(Logger::ERROR_LOG, System::CIMSERVER, Logger::SEVERE,
               "src.Server.cimserver.SERVER_NOT_STARTED",
               "cimserver not started:  $0", e.getMessage());
           MessageLoaderParms parms("src.Server.cimserver.SERVER_NOT_STARTED",
               "cimserver not started: $0", e.getMessage());
  
         //l10n          cerr << MessageLoader::getMessage(parms) << endl;
         //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",  
                     "Error: $0", e.getMessage());  
  
 #ifndef PEGASUS_OS_OS400          //
         //l10n          // notify parent process (if there is a parent process) to terminate
         //PEGASUS_STD(cerr) << "Error: " << e.getMessage() << PEGASUS_STD(endl);          //
         MessageLoaderParms parms("src.Server.cimserver.ERROR",          if (daemonOption)
                                                          "Error: $0", e.getMessage());              _cimServerProcess->notify_parent(1);
         PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) << PEGASUS_STD(endl);  
  
 #endif          deleteCIMServer();
           return 1;
       }
       catch (Exception& e)
       {
           Logger::put_l(Logger::STANDARD_LOG, System::CIMSERVER, Logger::WARNING,
               "src.Server.cimserver.ERROR",
               "Error: $0",
               e.getMessage());
           MessageLoaderParms parms(
               "src.Server.cimserver.ERROR",
               "Error: $0",
               e.getMessage());
           PEGASUS_STD(cerr) << MessageLoader::getMessage(parms) <<
               PEGASUS_STD(endl);
  
         //         //
         // notify parent process (if there is a parent process) to terminate         // notify parent process (if there is a parent process) to terminate
         //         //
         if (daemonOption)         if (daemonOption)
                 notify_parent(1);              _cimServerProcess->notify_parent(1);
  
           deleteCIMServer();
         return 1;         return 1;
     }     }
  
       deleteCIMServer();
     return 0;     return 0;
 } }
   
   
   
   


Legend:
Removed from v.1.138  
changed lines
  Added in v.1.202

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2