rpms/tog-pegasus/devel pegasus-2.5.1-obz4955.patch, NONE, 1.1 pegasus-2.5.1-obz4956.patch, NONE, 1.1 pegasus-2.5.1-obz4968_upcalls_oop.patch, NONE, 1.1 pegasus-2.5.1-obz4978.patch, NONE, 1.1 pegasus-2.5.1-obz4983.patch, NONE, 1.1 pegasus-2.5.1-obz4984.patch, NONE, 1.1 pegasus-2.5.1-obz4986.patch, NONE, 1.1 pegasus-2.5.1-initscript.patch, 1.2, 1.3 pegasus-2.5.1-warnings.patch, 1.1, 1.2 tog-pegasus.spec, 1.30, 1.31

fedora-cvs-commits at redhat.com fedora-cvs-commits at redhat.com
Wed May 3 00:14:01 UTC 2006


Author: jvdias

Update of /cvs/dist/rpms/tog-pegasus/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv10040

Modified Files:
	pegasus-2.5.1-initscript.patch pegasus-2.5.1-warnings.patch 
	tog-pegasus.spec 
Added Files:
	pegasus-2.5.1-obz4955.patch pegasus-2.5.1-obz4956.patch 
	pegasus-2.5.1-obz4968_upcalls_oop.patch 
	pegasus-2.5.1-obz4978.patch pegasus-2.5.1-obz4983.patch 
	pegasus-2.5.1-obz4984.patch pegasus-2.5.1-obz4986.patch 
Log Message:
fix bug 190432; fix upstream bugs 4955 4956 4968 4978 4983 4984 4986 5017

pegasus-2.5.1-obz4955.patch:
 OperatingSystem_Linux.cpp                 |   95 +++---
 tests/OSTestClient/OSTestClient.cpp       |    2 
 tests/OSTestClient/OSTestClient_Linux.cpp |  449 ++++++++++++++++++++++++++++++
 3 files changed, 507 insertions(+), 39 deletions(-)

--- NEW FILE pegasus-2.5.1-obz4955.patch ---
--- pegasus/src/Providers/ManagedSystem/OperatingSystem/OperatingSystem_Linux.cpp.obz4955	2006-01-30 11:18:48.000000000 -0500
+++ pegasus/src/Providers/ManagedSystem/OperatingSystem/OperatingSystem_Linux.cpp	2006-05-02 14:43:14.000000000 -0400
@@ -96,59 +96,75 @@
 
 
 /**
-   getName method of the Linux implementation for the OS Provider
-
-   Calls uname() to get the operating system name.
+   getVendorInfo method for Linux implementation of OS Provider
 
+   Gets the system text from vendor's release file
   */
-Boolean OperatingSystem::getName(String& osName)
+static void getVendorInfo(
+    String& releaseText,
+    String& nameText )
 {
-   String s, buffer_s;
-   Uint32 buffer_index;	// rexex match index
+   static const Uint32 MAX_RELEASE_STRING_LEN=128;
    char info_file[MAXPATHLEN];
-   char buffer[MAXPATHLEN];
+   char buffer[MAX_RELEASE_STRING_LEN];
    struct stat statBuf;
-   FILE *vf;
 
-   s.clear();
+
    for (int ii = 0; LINUX_VENDOR_INFO[ii].vendor_name != NULL ; ii++)
    {
-      memset(info_file, 0, MAXPATHLEN);
-      strcat(info_file, "/etc/");
-      strcat(info_file, LINUX_VENDOR_INFO[ii].determining_filename);
-
+     sprintf(info_file,  "/etc/%s",
+             LINUX_VENDOR_INFO[ii].determining_filename );
 
       // If the file exists in /etc, we know what distro we're in
       if (!stat(info_file, &statBuf))
       {
-         s.assign(LINUX_VENDOR_INFO[ii].vendor_name);
-         s.append(" Distribution");
+         // Set the default OS name
+         nameText.assign(LINUX_VENDOR_INFO[ii].vendor_name);
+         nameText.append(" Distribution");
          if (LINUX_VENDOR_INFO[ii].optional_string == NULL)
          {
-	    // try to set s to a more descript value from the etc file
-            vf = fopen(info_file, "r");
+	    // try to set text to a more descriptive value from the etc file
+            FILE *vf = fopen(info_file, "r");
             if (vf)
             {
-               if (fgets(buffer, MAXPATHLEN, vf) != NULL)
-	       {
-                  buffer_s.assign(buffer);
-
-		  // parse the text to extract Distribution Name
-		  buffer_index = buffer_s.find(" release");
-		  if ( buffer_index != PEG_NOT_FOUND )
-		  {
-		     // then we have found a valid index into the config file
-		     s.assign(buffer_s.subString(0,buffer_index));
-		  }
+                if (fgets(buffer, MAX_RELEASE_STRING_LEN, vf) != NULL)
+                {
+		    String buffer_s = buffer;
+
+                    // parse the text to extract first line
+                    Uint32 buffer_index = buffer_s.find( '\n' );
+                    if ( buffer_index != PEG_NOT_FOUND )
+                    {
+                        // We have found a valid index into the
+                        // release string. Now get just the OS name.
+                        releaseText = buffer_s.subString(0,buffer_index);
+                        buffer_index = releaseText.find( " release" );
+                        if ( buffer_index != PEG_NOT_FOUND )
+                        {
+			    nameText.assign( releaseText.subString(0,buffer_index) );
+                        }
+                    }
 	       }
 	       fclose(vf);
 	    }
          }
+         break;
       }
    }
-   osName.assign(s);
-   return true;
+}
+
+/**
+   getName method of the Linux implementation for the OS Provider
+
+   Calls getVendorInfo() to get the operating system name.
 
+  */
+Boolean OperatingSystem::getName(String& osName)
+{
+    String releaseText;
+    getVendorInfo( releaseText, osName );
+
+    return true;
 }
 
 /**
@@ -204,23 +220,24 @@
 /**
    getCaption method for Linux implementation of OS Provider
 
-   Uses a string constant for the Caption.
+   Gets the text from the system's release file.
   */
 Boolean OperatingSystem::getCaption(String& caption)
 {
-
-   caption.assign("The current Operating System");
-
+   String osName;
+   getVendorInfo( caption, osName );
    return true;
 }
 
+/**
+   getDescription method for Linux implementation of OS Provider
+
+   Gets the text from the system's release file.
+  */
 Boolean OperatingSystem::getDescription(String& description)
 {
-
-   description.assign("This instance reflects the Operating System"
-        " on which the CIMOM is executing (as distinguished from instances"
-        " of other installed operating systems that could be run).");
-
+   String osName;
+   getVendorInfo( description, osName );
    return true;
 }
 
--- pegasus/src/Providers/ManagedSystem/OperatingSystem/tests/OSTestClient/OSTestClient.cpp.obz4955	2006-01-30 11:18:49.000000000 -0500
+++ pegasus/src/Providers/ManagedSystem/OperatingSystem/tests/OSTestClient/OSTestClient.cpp	2006-05-02 14:45:05.000000000 -0400
@@ -61,6 +61,8 @@
 #  include "OSTestClient_VMS.cpp"
 #elif defined (PEGASUS_OS_SOLARIS)
 #  include "OSTestClient_Solaris.cpp"
+#elif defined (PEGASUS_OS_LINUX)
+#  include "OSTestClient_Linux.cpp"
 # else
 #  include "OSTestClient_Stub.cpp"
 #endif
--- pegasus/src/Providers/ManagedSystem/OperatingSystem/tests/OSTestClient/OSTestClient_Linux.cpp.obz4955	2006-05-02 14:46:08.000000000 -0400
+++ pegasus/src/Providers/ManagedSystem/OperatingSystem/tests/OSTestClient/OSTestClient_Linux.cpp	2006-05-02 14:38:31.000000000 -0400
@@ -0,0 +1,449 @@
+//%2006////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
+// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
+// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
+// 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
+// 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.
+//
+//==============================================================================
+//
+//
+//%/////////////////////////////////////////////////////////////////////////////
+
+
+// This file has the OS-specific routines that will be called to get
+// a validation of the CIM information vs. the current test system
+
+#include "OSTestClient.h"
+
+PEGASUS_USING_PEGASUS;
+PEGASUS_USING_STD;
+
+
+static const struct
+{
+   const char *vendor_name;
+   const char *determining_filename;
+   const char *optional_string;
+} LINUX_VENDOR_INFO[] = {
+   { "Caldera",          "coas",               "Caldera Linux" },
+   { "Corel",            "environment.corel",  "Corel Linux"   },
+   { "Debian GNU/Linux", "debian_version",     NULL            },
+   { "Mandrake",         "mandrake-release",   NULL            },
+   { "Red Hat",          "redhat-release",     NULL            },
+   { "SuSE",             "SuSE-release",       NULL            },
+   { "Turbolinux",       "turbolinux-release", NULL            },
+   { NULL, NULL, NULL }
+};
+
+
+/**
+   getVendorInfo method for Linux implementation of OS Provider
+
+   Gets the system text from vendor's release file
+  */
+static void getVendorInfo(
+    String& releaseText,
+    String& nameText )
+{
+   static const Uint32 MAX_RELEASE_STRING_LEN=128;
+   char info_file[MAXPATHLEN];
+   char buffer[MAX_RELEASE_STRING_LEN];
+   struct stat statBuf;
+
+
+   for (int ii = 0; LINUX_VENDOR_INFO[ii].vendor_name != NULL ; ii++)
+   {
+     sprintf(info_file,  "/etc/%s",
+             LINUX_VENDOR_INFO[ii].determining_filename );
+
+      // If the file exists in /etc, we know what distro we're in
+      if (!stat(info_file, &statBuf))
+      {
+         // Set the default OS name
+         nameText.assign(LINUX_VENDOR_INFO[ii].vendor_name);
+         nameText.append(" Distribution");
+         if (LINUX_VENDOR_INFO[ii].optional_string == NULL)
+         {
+	    // try to set text to a more descriptive value from the etc file
+            FILE *vf = fopen(info_file, "r");
+            if (vf)
+            {
+                if (fgets(buffer, MAX_RELEASE_STRING_LEN, vf) != NULL)
+                {
+		    String buffer_s = buffer;
+
+                    // parse the text to extract first line
+                    Uint32 buffer_index = buffer_s.find( '\n' );
+                    if ( buffer_index != PEG_NOT_FOUND )
+                    {
+                        // We have found a valid index into the
+                        // release string. Now get just the OS name.
+                        releaseText = buffer_s.subString(0,buffer_index);
+                        buffer_index = releaseText.find( " release" );
+                        if ( buffer_index != PEG_NOT_FOUND )
+                        {
+			    nameText.assign( releaseText.subString(0,buffer_index) );
+                        }
+                    }
+	       }
+	       fclose(vf);
+	    }
+         }
+         break;
+      }
+   }
+}
+
+/**
+   goodCSCreationClassName method for the OS Provider Test Client
+
+   Checks the specified value against the expected value and
+   returns TRUE if valid, else FALSE.
+ */
+Boolean OSTestClient::goodCSCreationClassName(const String &cs_ccn,
+                                              Boolean verbose)
+{
+   // This assumes the only right answer is CIM_UnitaryComputerSystem
+   // replace with approprate check for the given OS/Provider
+
+   if (verbose)
+      cout<<"Checking " <<cs_ccn<< " against CIM_UnitaryComputerSystem"<<endl;
+   return (String::equalNoCase(cs_ccn, "CIM_UnitaryComputerSystem"));
+}
+
+/*
+   GoodCSName method for the OS Provider Test Client
+
+   Checks the specified value against the expected value and
+   returns TRUE if the same, else FALSE
+ */
+Boolean OSTestClient::goodCSName(const String &csname, Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking " <<csname<< " against hostname " <<endl;
+   cout<<"- No check written for CSName " <<endl;
+
+   // always returns success; replace with appropriate OS/Provider code
+   return true;
+}
+
+/*
+   GoodCreationClassName method for the OS Provider Test Client
+
+   Checks the specified value against the expected value and
+   returns TRUE if the same, else FALSE
+ */
+Boolean OSTestClient::goodCreationClassName(const String &ccn,
+                                            Boolean verbose)
+{
+   // This assumes the only right answer is CIM_OperatingSystem
+   // replace with approprate check for the given OS/Provider
+
+   if (verbose)
+      cout<<"Checking " << ccn << " against CIM_OperatingSystem"<<endl;
+
+   return (String::equalNoCase(ccn, "CIM_OperatingSystem"));
+}
+
+/*
+   GoodName method for the OS Provider Test Client
+
+   Checks the specified value against the expected value and
+   returns TRUE if the same, else FALSE
+ */
+Boolean OSTestClient::goodName(const String &name, Boolean verbose)
+{
+    String releaseText, osName;
+
+    if (verbose)
+        cout<<"Checking " << name << " against OS name "<<endl;
+    getVendorInfo( releaseText, osName );
+    return (String::equal( name, osName ));
+}
+/* GoodCaption method for the OS Provider Test Client
+
+   Checks the specified value against the expected value
+   and returns TRUE if the same, else FALSE
+ */
+Boolean OSTestClient::goodCaption(const String &cap,
+                                  Boolean verbose)
+{
+    String releaseText, osName;
+
+    // has check against standard caption
+    if (verbose)
+        cout<<"Checking Caption " << cap << endl;
+    getVendorInfo( releaseText, osName );
+    return (String::equal(cap, releaseText ) );
+}
+
+/*
+   GoodDescription method for the OS Provider Test Client
+
+   Checks the specified value against the expected value and
+   returns TRUE if the same, else FALSE
+ */
+Boolean OSTestClient::goodDescription(const String &desc,
+                                      Boolean verbose)
+{
+    String releaseText, osName;
+
+    // has check against standard description
+    if (verbose)
+        cout<<"Checking Description " << desc << endl;
+    getVendorInfo( releaseText, osName );
+    return (String::equal(desc, releaseText) );
+}
+
+/*
+   GoodInstallDate method for the OS Provider Test Client
+
+   Checks the specified value against the expected value and
+   returns TRUE if the same, else FALSE
+ */
+Boolean OSTestClient::goodInstallDate(const CIMDateTime &idate,
+                                      Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking InstallDate " << idate.toString() << endl;
+   cout<<"- No check written for InstallDate " << endl;
+   return true;
+}
+
+/*
+   GoodStatus method for the OS Provider Test Client
+
+   Checks the specified value against the expected value and
+   returns TRUE if the same, else FALSE
+ */
+Boolean OSTestClient::goodStatus(const String &stat,
+                                 Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking Status" << stat <<  endl;
+   cout<<"- No check written for Status " << endl;
+   return true;
+}
+
+/*
+   GoodOSType method for the OS Provider Test Client
+
+   Checks the specified value against the expected value and
+   returns TRUE if the same, else FALSE
+ */
+Boolean OSTestClient::goodOSType(const Uint16 &ostype,
+                                 Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking OSType " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodOtherTypeDescription(const String &otdesc,
+                                               Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking OtherTypeDescription " << otdesc << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodVersion(const String &version, Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking Version " << version << endl;
+   cout<<"- No check written for Version " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodLastBootUpTime(const CIMDateTime &btime,
+                                         Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking LastBootUpTime " << btime.toString() << endl;
+   cout<<"- No check written for LastBootUpTime " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodLocalDateTime(const CIMDateTime &ltime,
+                                        Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking LocalDateTime " << ltime.toString() << endl;
+   cout<<"- No check written for LocalDateTime " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodCurrentTimeZone(const Sint16 &tz, Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking CurrentTimeZone " << tz << endl;
+   cout<<"- No check written for CurrentTimeZone " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodNumberOfLicensedUsers(const Uint32 &nlusers,
+                                                Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking NumberOfLicensedUsers " << nlusers << endl;
+   cout<<"- No check written for NumberOfLicensedUsers " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodNumberOfUsers(const Uint32 &nusers,
+                                        Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking NumberOfUsers " << nusers << endl;
+   cout<<"- No check written for NumberOfUsers " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodNumberOfProcesses(const Uint32 &nprocs,
+                                            Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking NumberOfProcesses " << nprocs << endl;
+   cout<<"- No check written for NumberOfProcesses " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodMaxNumberOfProcesses(const Uint32 &maxprocs,
+                                               Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking MaxNumberOfProcs " << maxprocs << endl;
+   cout<<"- No check written for MaxNumberOfProcesses " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodTotalSwapSpaceSize(const Uint64 &totalswap,
+                                             Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking TotalSwapSpaceSize "  << endl;
+   cout<<"- No check written for TotalSwapSpaceSize " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodTotalVirtualMemorySize(const Uint64 &totalvmem,
+                                                 Boolean verbose)
+
+{
+   if (verbose)
+      cout<<"Checking TotalVirtualMemorySize "  << endl;
+   cout<<"- No check written for TotalVirtualMemorySize" << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodFreeVirtualMemory(const Uint64 &freevmem,
+                                            Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking FreeVirtualMemory " << endl;
+   cout<<"- No check written for FreeVirtualMemory" << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodFreePhysicalMemory(const Uint64 &freepmem,
+                                             Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking FreePhysicalMemory " << endl;
+   cout<<"- No check written for FreePhysicalMemory" << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodTotalVisibleMemorySize(const Uint64 &totalvmem,
+                                                 Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking TotalVisibleMemorySize " << endl;
+   cout<<"- No check written for TotalVisibleMemorySize" << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodSizeStoredInPagingFiles(const Uint64 &pgsize,
+                                                  Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking SizeStoredInPagingFiles " << endl;
+   cout<<"- No check written for SizeStoredInPagingFiles" << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodFreeSpaceInPagingFiles(const Uint64 &freepg,
+                                                 Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking FreeSpaceInPagingFiles " << endl;
+   cout<<"- No check written for FreeSpaceInPagingFiles" << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodMaxProcessMemorySize(const Uint64 &maxpmem,
+                                               Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking MaxProcessMemSize " << endl;
+   cout<<"- No check written for MaxProcessMemSize " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodDistributed(const Boolean &distr,
+                                      Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking Distributed " << endl;
+   cout<<"- No check written for Distributed " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodMaxProcessesPerUser(const Uint32 &umaxproc,
+                                              Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking MaxProcsPerUser " << umaxproc << endl;
+   cout<<"- No check written for MaxProcsPerUser " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodOSCapability(const String &cap, Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking OSCapability " << cap << endl;
+   cout<<"- No check written for OSCapability " << endl;
+   return true;
+}
+
+Boolean OSTestClient::goodSystemUpTime(const Uint64 &uptime, Boolean verbose)
+{
+   if (verbose)
+      cout<<"Checking SystemUpTime " << endl;
+   cout<<"- No check written for SystemUpTime " << endl;
+   return true;
+}
+

pegasus-2.5.1-obz4956.patch:
 Buffer.cpp         |    9 +++++++++
 HTTPConnection.cpp |   18 ++++++++++++++----
 String.cpp         |   11 ++++++-----
 3 files changed, 29 insertions(+), 9 deletions(-)

--- NEW FILE pegasus-2.5.1-obz4956.patch ---
--- pegasus/src/Pegasus/Common/HTTPConnection.cpp.obz4956	2006-05-02 14:27:39.000000000 -0400
+++ pegasus/src/Pegasus/Common/HTTPConnection.cpp	2006-05-02 15:09:56.000000000 -0400
@@ -1036,10 +1036,20 @@
             // reserve space for entire non-chunked message
             if (_contentLength > 0)
             {
-                Uint32 capacity = (Uint32)(_contentLength + _contentOffset + 1);
-                _incomingBuffer.reserveCapacity(capacity);
-                data = (char *)_incomingBuffer.getData();
-                data[capacity-1] = 0;
+		try
+		{
+		    Uint32 capacity = (Uint32)(_contentLength + _contentOffset + 1);
+		    _incomingBuffer.reserveCapacity(capacity);
+		    data = (char *)_incomingBuffer.getData();
+		    data[capacity-1] = 0;
+		}catch(const PEGASUS_STD(bad_alloc)&)
+		{
+		    _throwEventFailure(HTTP_STATUS_REQUEST_TOO_LARGE,
+		        "Error reserving space for non-chunked message");
+		}catch(...)
+		{
+		    _throwEventFailure(httpStatusInternal, "unexpected exception");    
+		}
             }
 
             break;
--- pegasus/src/Pegasus/Common/String.cpp.obz4956	2006-05-02 14:27:39.000000000 -0400
+++ pegasus/src/Pegasus/Common/String.cpp	2006-05-02 15:12:59.000000000 -0400
@@ -51,6 +51,10 @@
 #include <unicode/uchar.h>
 #endif
 
+#ifndef PEGASUS_CHECK_FOR_OVERFLOW
+#define PEGASUS_CHECK_FOR_OVERFLOW(capacity) { if (capacity > 0x3FFFFFFF) throw PEGASUS_STD(bad_alloc)(); }
+#endif
+
 PEGASUS_NAMESPACE_BEGIN
 
 //==============================================================================
@@ -166,8 +170,7 @@
 {
 #ifndef PEGASUS_STRING_NO_THROW
 
-    if (x > 0x0FFFFFFF)
-        throw PEGASUS_STD(bad_alloc)();
+    PEGASUS_CHECK_FOR_OVERFLOW(x);
 
 #endif
 
@@ -545,9 +548,7 @@
 {
 #ifndef PEGASUS_STRING_NO_THROW
 
-    // Any string bigger than this is seriously suspect.
-    if (cap > 0x0FFFFFFF)
-        throw PEGASUS_STD(bad_alloc)();
+    PEGASUS_CHECK_FOR_OVERFLOW(cap);
 
 #endif
 
--- pegasus/src/Pegasus/Common/Buffer.cpp.obz4956	2006-03-17 13:59:03.000000000 -0500
+++ pegasus/src/Pegasus/Common/Buffer.cpp	2006-05-02 15:06:06.000000000 -0400
@@ -43,11 +43,17 @@
 
 static const size_t MIN_CAPACITY = 2048;
 
+#ifndef PEGASUS_CHECK_FOR_OVERFLOW
+#define PEGASUS_CHECK_FOR_OVERFLOW(capacity) { if (capacity > 0x3FFFFFFF) throw PEGASUS_STD(bad_alloc)(); }
+#endif
+
 static Uint32 _next_pow_2(Uint32 x)
 {
     if (x < MIN_CAPACITY)
 	return MIN_CAPACITY;
 
+    PEGASUS_CHECK_FOR_OVERFLOW(x);
+
     x--;
     x |= (x >> 1);
     x |= (x >> 2);
@@ -132,7 +138,10 @@
 	_rep->size = 0;
     }
     else
+    {
+	PEGASUS_CHECK_FOR_OVERFLOW(_rep->cap);
 	_rep = _reallocate(_rep, _rep->cap ? (2 * _rep->cap) : MIN_CAPACITY);
+    }
 }
 
 void Buffer::insert(size_t pos, const char* data, size_t size)

pegasus-2.5.1-obz4968_upcalls_oop.patch:
 CMPI_Broker.cpp |   42 ++++++++++++++++++++++++++++++++++++------
 1 files changed, 36 insertions(+), 6 deletions(-)

--- NEW FILE pegasus-2.5.1-obz4968_upcalls_oop.patch ---
--- pegasus/src/Pegasus/ProviderManager2/CMPI/CMPI_Broker.cpp.obz4968_upcalls_oop	2006-03-15 07:53:08.000000000 -0500
+++ pegasus/src/Pegasus/ProviderManager2/CMPI/CMPI_Broker.cpp	2006-05-02 14:29:16.000000000 -0400
@@ -313,8 +313,18 @@
          CM_ObjectPath(cop)->getNameSpace(),
          CM_ObjectPath(cop)->getClassName());
          if (rc) CMSetStatus(rc,CMPI_RC_OK);
-         CMPI_Object *obj =
-             new CMPI_Object(new CMPI_OpEnumeration(new Array<CIMObjectPath>(en)));
+
+          // When running out of process the returned instances don't contain
+          // a name space. Create a writable copy of the array and add the
+          // namespace from the input parameters.
+          Array<CIMObjectPath> * aObj = new Array<CIMObjectPath>(en);
+          for (unsigned int index=0;index < aObj->size(); index++)
+          {
+            (*aObj)[index].setNameSpace(CM_ObjectPath(cop)->getNameSpace());
+          }
+
+          CMPI_Object *obj = new CMPI_Object(new CMPI_OpEnumeration(aObj));
+
          return (CMPI_OpEnumeration *)obj->getHdl();
 
       }
@@ -408,8 +418,18 @@
          role ? String(role) : String::EMPTY,
          resultRole ? String(resultRole) : String::EMPTY);
          if (rc) CMSetStatus(rc,CMPI_RC_OK);
-         CMPI_Object *obj =
-             new CMPI_Object(new CMPI_OpEnumeration(new Array<CIMObjectPath>(en)));
+
+         // When running out of process the returned instances don't contain
+         // a name space. Create a writable copy of the array and add the
+         // namespace from the input parameters.
+         Array<CIMObjectPath> * aObj = new Array<CIMObjectPath>(en);
+         for (unsigned int index=0;index < aObj->size(); index++)
+         {
+             (*aObj)[index].setNameSpace(CM_ObjectPath(cop)->getNameSpace());
+         }
+
+         CMPI_Object *obj = new CMPI_Object(new CMPI_OpEnumeration(aObj));
+
          return (CMPI_OpEnumeration *)obj->getHdl();
       }
       catch (const CIMException &e) {
@@ -493,8 +513,18 @@
          resultClass ? CIMName(resultClass) : CIMName(),
          role ? String(role) : String::EMPTY);
          if (rc) CMSetStatus(rc,CMPI_RC_OK);
-         CMPI_Object *obj =
-             new CMPI_Object(new CMPI_OpEnumeration(new Array<CIMObjectPath>(en)));
+
+         // When running out of process the returned instances don't contain
+         // a name space. Create a writable copy of the array and add the
+         // namespace from the input parameters.
+         Array<CIMObjectPath> * aObj = new Array<CIMObjectPath>(en);
+         for (unsigned int index=0;index < aObj->size(); index++)
+         {
+             (*aObj)[index].setNameSpace(CM_ObjectPath(cop)->getNameSpace());
+         }
+
+         CMPI_Object *obj = new CMPI_Object(new CMPI_OpEnumeration(aObj));
+
          return (CMPI_OpEnumeration *)obj->getHdl();
       }
       catch (const CIMException &e) {

pegasus-2.5.1-obz4978.patch:
 snmpDeliverTrap_netsnmp.cpp |   81 +++++++++++++++++++++++++++-----------------
 snmpDeliverTrap_netsnmp.h   |   11 ++++-
 snmpIndicationHandler.cpp   |   57 ++++++++++++++++++++++++++----
 snmpIndicationHandler.h     |   15 ++------
 4 files changed, 112 insertions(+), 52 deletions(-)

--- NEW FILE pegasus-2.5.1-obz4978.patch ---
--- pegasus/src/Pegasus/Handler/snmpIndicationHandler/snmpIndicationHandler.cpp.obz4978	2006-01-30 11:17:54.000000000 -0500
+++ pegasus/src/Pegasus/Handler/snmpIndicationHandler/snmpIndicationHandler.cpp	2006-05-02 15:23:37.000000000 -0400
@@ -62,9 +62,54 @@
 
 PEGASUS_USING_STD;
 
+#ifdef HPUX_EMANATE
+        static snmpDeliverTrap_emanate snmpTrap;
+#elif defined (PEGASUS_USE_NET_SNMP)
+        static snmpDeliverTrap_netsnmp snmpTrap;
+#else
+        static snmpDeliverTrap_stub snmpTrap;
+#endif
+
+snmpIndicationHandler::snmpIndicationHandler()
+{
+    PEG_METHOD_ENTER (TRC_IND_HANDLER,
+        "snmpIndicationHandler::snmpIndicationHandler");
+    PEG_METHOD_EXIT();
+}
+
 void snmpIndicationHandler::initialize(CIMRepository* repository)
 {
+    PEG_METHOD_ENTER (TRC_IND_HANDLER,
+        "snmpIndicationHandler::initialize");
+
     _repository = repository;
+
+#ifdef PEGASUS_USE_NET_SNMP
+    snmpTrap.initialize();
+#endif
+
+    PEG_METHOD_EXIT();
+}
+
+void snmpIndicationHandler::terminate()
+{
+    PEG_METHOD_ENTER (TRC_IND_HANDLER,
+        "snmpIndicationHandler::terminate");
+
+#ifdef PEGASUS_USE_NET_SNMP
+    snmpTrap.terminate();
+#endif
+
+    PEG_METHOD_EXIT();
+}
+
+snmpIndicationHandler::~snmpIndicationHandler()
+{
+    PEG_METHOD_ENTER (TRC_IND_HANDLER,
+        "snmpIndicationHandler::~snmpIndicationHandler");
+
+
+    PEG_METHOD_EXIT();
 }
 
 // l10n - note: ignoring indication language
@@ -153,14 +198,6 @@
         // trap destination and SNMP type are defined in handlerInstance
         // and passing this instance as it is to deliverTrap() call
 
-#ifdef HPUX_EMANATE
-        static snmpDeliverTrap_emanate emanateTrap;
-#elif defined (PEGASUS_USE_NET_SNMP)
-        static snmpDeliverTrap_netsnmp emanateTrap;
-#else
-        static snmpDeliverTrap_stub emanateTrap;
-#endif
-
         Uint32 targetHostPos = handler.findProperty(CIMName ("TargetHost"));
         Uint32 targetHostFormatPos = handler.findProperty(CIMName ("TargetHostFormat"));
         Uint32 otherTargetHostFormatPos = handler.findProperty(CIMName (
@@ -263,7 +300,7 @@
 	        handler.getProperty(engineIDPos).getValue().get(engineID);
 	    }
 
-	    emanateTrap.deliverTrap(
+	    snmpTrap.deliverTrap(
                 trapOid,
                 securityName,
                 targetHost,
@@ -315,6 +352,8 @@
 		MessageLoaderParms("Handler.snmpIndicationHandler.snmpIndicationHandler.FAILED_TO_DELIVER_TRAP", 
 				   "Failed to deliver trap."));
     }
+
+    PEG_METHOD_EXIT();
 }
 
 // This is the dynamic entry point into this dynamic module. The name of
--- pegasus/src/Pegasus/Handler/snmpIndicationHandler/snmpDeliverTrap_netsnmp.cpp.obz4978	2006-01-30 11:17:54.000000000 -0500
+++ pegasus/src/Pegasus/Handler/snmpIndicationHandler/snmpDeliverTrap_netsnmp.cpp	2006-05-02 15:23:37.000000000 -0400
@@ -41,6 +41,49 @@
 
 PEGASUS_NAMESPACE_BEGIN
 
+void snmpDeliverTrap_netsnmp::initialize()
+{
+
+    PEG_METHOD_ENTER (TRC_IND_HANDLER, 
+        "snmpDeliverTrap_netsnmp::initialize"); 
+
+    // Defined default MIB modules (in net-snmp-config.h) do not need to be 
+    // loaded and loading them can cause some stderr;
+    // use environment variable MIBS to override the default MIB modules.
+    // If there is no MIBS environment variable, add it in. 
+    char *envVar;
+    envVar = getenv("MIBS");
+
+    if (envVar == NULL)
+    {
+        putenv("MIBS=");
+    }
+
+    // Initialize the mib reader
+    netsnmp_set_mib_directory("");
+    init_mib();
+    
+    // Initializes the SNMP library
+    init_snmp("snmpIndicationHandler");
+
+    // windows32 specific initialization (is a NOOP on unix)
+    SOCK_STARTUP;
+
+    PEG_METHOD_EXIT ();
+    
+}
+
+void snmpDeliverTrap_netsnmp::terminate()
+{
+
+    PEG_METHOD_ENTER (TRC_IND_HANDLER, 
+        "snmpDeliverTrap_netsnmp::terminate"); 
+
+    SOCK_CLEANUP;
+
+    PEG_METHOD_EXIT ();
+}
+
 void snmpDeliverTrap_netsnmp::deliverTrap(
         const String& trapOid,
         const String& securityName, 
@@ -59,12 +102,12 @@
         "snmpDeliverTrap_netsnmp::deliverTrap"); 
 
     void *sessionHandle;
-    struct snmp_session snmpSession, *sessionPtr;
+    struct snmp_session *sessionPtr;
 
     struct snmp_pdu *snmpPdu;
 
     // Creates a SNMP session
-    _createSession(targetHost, portNumber, securityName, snmpSession,
+    _createSession(targetHost, portNumber, securityName,
                    sessionHandle, sessionPtr);
 
     try
@@ -138,7 +181,6 @@
     const String & targetHost,
     Uint32 portNumber,
     const String & securityName,
-    snmp_session & snmpSession,
     void *&sessionHandle,
     snmp_session *&sessionPtr)
 {
@@ -148,34 +190,13 @@
     Sint32 libErr, sysErr;
     char *errStr;
     String exceptionStr;
+    
+    struct snmp_session snmpSession;
 
-    // Defined default MIB modules (in net-snmp-config.h) do not need to be 
-    // loaded and loading them can cause some stderr;
-    // use environment variable MIBS to override the default MIB modules.
-    // If there is no MIBS environment variable, add it in. 
-
-    char *envVar;
-    envVar = getenv("MIBS");
-
-    if (envVar == NULL)
     {
-        putenv("MIBS=");
-    }
-
-    // Initialize the mib reader
-    netsnmp_set_mib_directory("");
-    init_mib();
-
-    // Initializes the SNMP library
-    init_snmp("snmpIndicationHandler");
-
-    // Prepares a struct snmp_session that will be used for a set of
-    // SNMP transactions
+    AutoMutex autoMut(_sessionInitMutex);
     snmp_sess_init(&snmpSession);
 
-    // windows32 specific initialization (is a NOOP on unix)
-    SOCK_STARTUP;
-
     CString targetHostCStr = targetHost.getCString();
 
     // peername has format: targetHost:portNumber
@@ -183,7 +204,9 @@
                                           1+32));
     sprintf(snmpSession.peername, "%s:%u", (const char*)targetHostCStr, 
             portNumber);
+
     sessionHandle = snmp_sess_open(&snmpSession);
+    }
 
     if (sessionHandle == NULL)
     {
@@ -196,8 +219,6 @@
 
         free(errStr);
 
-        SOCK_CLEANUP;
-
         PEG_METHOD_EXIT ();
         
         throw PEGASUS_CIM_EXCEPTION_L (CIM_ERR_FAILED,
@@ -276,8 +297,6 @@
 
     snmp_sess_close(sessionHandle);
 
-    SOCK_CLEANUP;
-    
     PEG_METHOD_EXIT ();
 }
 
--- pegasus/src/Pegasus/Handler/snmpIndicationHandler/snmpIndicationHandler.h.obz4978	2006-01-30 11:17:54.000000000 -0500
+++ pegasus/src/Pegasus/Handler/snmpIndicationHandler/snmpIndicationHandler.h	2006-05-02 15:23:37.000000000 -0400
@@ -50,19 +50,13 @@
 
     CIMRepository* _repository;
 
-    snmpIndicationHandler()
-    {
-    }
-
-    virtual ~snmpIndicationHandler()
-    {
-    }
+    snmpIndicationHandler();
+
+    virtual ~snmpIndicationHandler();
 
     void initialize(CIMRepository* repository);
 
-    void terminate()
-    {
-    }
+    void terminate();
 
     void handleIndication(
 	const OperationContext& context,
@@ -71,6 +65,7 @@
 	CIMInstance& handler, 
 	CIMInstance& subscription,
 	ContentLanguageList& contentLanguages);
+
 };
 
 PEGASUS_NAMESPACE_END
--- pegasus/src/Pegasus/Handler/snmpIndicationHandler/snmpDeliverTrap_netsnmp.h.obz4978	2006-01-30 11:17:54.000000000 -0500
+++ pegasus/src/Pegasus/Handler/snmpIndicationHandler/snmpDeliverTrap_netsnmp.h	2006-05-02 15:23:37.000000000 -0400
@@ -37,6 +37,7 @@
 
 #include <iostream>
 
+#include <Pegasus/Common/IPC.h>
 #include <net-snmp/net-snmp-config.h>
 #include <net-snmp/net-snmp-includes.h>
 #include "snmpDeliverTrap.h"
@@ -120,6 +121,10 @@
 {
 public:
 
+    void initialize();
+
+    void terminate();
+
     void deliverTrap(
         const String& trapOid,
         const String& securityName, 
@@ -135,6 +140,10 @@
 
 private:
 
+    // Mutex is needed before a session is created. Sessions created 
+    // using the Single API do not interact with other SNMP sessions.
+    Mutex _sessionInitMutex;
+
     /**
         Creates a SNMP session.
       
@@ -143,7 +152,6 @@
                               to receive a trap
         @param portNumber     the port number to receive a trap
         @param securityName   the human readable community name
-        @param snmpSession    the SNMP session
         @param sessionHandle  an opaque pointer of the SNMP session
         @param sessionPtr     the SNMP session pointer to its associated 
                               struct snmp_session
@@ -153,7 +161,6 @@
     void _createSession(const String & targetHost,
                         Uint32 portNumber,
                         const String & securityName,
-                        struct snmp_session & snmpSession,
                         void *&sessionHandle,
                         struct snmp_session *&sessionPtr);
 

pegasus-2.5.1-obz4983.patch:
 ProviderAgent.cpp |    2 ++
 1 files changed, 2 insertions(+)

--- NEW FILE pegasus-2.5.1-obz4983.patch ---
--- pegasus/src/Pegasus/ProviderManager2/ProviderAgent/ProviderAgent.cpp.obz4983	2006-02-28 14:53:31.000000000 -0500
+++ pegasus/src/Pegasus/ProviderManager2/ProviderAgent/ProviderAgent.cpp	2006-05-02 15:30:34.000000000 -0400
@@ -589,6 +589,7 @@
 
     // Send request back to the server to process
     _providerAgent->_writeResponse(message);
+    delete message;
 
     PEG_METHOD_EXIT();
 }
@@ -601,6 +602,7 @@
 
     // Send request back to the server to process
     _providerAgent->_writeResponse(response);
+    delete response;
 
     PEG_METHOD_EXIT();
 }

pegasus-2.5.1-obz4984.patch:
 Common/System.h                               |   39 ++++++++++++++++++++++----
 Common/SystemNsk.cpp                          |   13 ++++++++
 Common/SystemUnix.cpp                         |   23 ++++++++++++---
 Common/SystemVms.cpp                          |   21 +++++++++++---
 Common/SystemWindows.cpp                      |   13 ++++++++
 ProviderManager2/OOPProviderManagerRouter.cpp |   32 ++++++++++++++++++---
 6 files changed, 120 insertions(+), 21 deletions(-)

--- NEW FILE pegasus-2.5.1-obz4984.patch ---
--- pegasus/src/Pegasus/ProviderManager2/OOPProviderManagerRouter.cpp.obz4980	2006-03-15 16:28:36.000000000 -0500
+++ pegasus/src/Pegasus/ProviderManager2/OOPProviderManagerRouter.cpp	2006-05-02 15:34:36.000000000 -0400
@@ -523,6 +523,28 @@
     //Out of provider support for OS400 goes here when needed.
 
 #else
+
+# ifndef PEGASUS_DISABLE_PROV_USERCTXT
+    // Get and save the effective user name and the uid/gid for the user
+    // context of the agent process
+ 
+    String effectiveUserName = System::getEffectiveUserName();
+    PEGASUS_UID_T newUid = (PEGASUS_UID_T) -1;
+    PEGASUS_GID_T newGid = (PEGASUS_GID_T) -1;
+    if (_userName != effectiveUserName)
+    {
+        if (!System::lookupUserId(_userName.getCString(), newUid, newGid))
+        {
+            throw PEGASUS_CIM_EXCEPTION_L(
+                CIM_ERR_FAILED,
+                MessageLoaderParms(
+                    "ProviderManager.OOPProviderManagerRouter."
+                        "USER_CONTEXT_CHANGE_FAILED",
+                    "Unable to change user context to \"$0\".", _userName));
+        }
+    }
+# endif
+
     pid_t pid = fork();
     if (pid < 0)
     {
@@ -558,11 +580,11 @@
             pipeToAgent->exportReadHandle(readHandle);
             pipeFromAgent->exportWriteHandle(writeHandle);
 
-#ifndef PEGASUS_DISABLE_PROV_USERCTXT
+# ifndef PEGASUS_DISABLE_PROV_USERCTXT
             // Set the user context of the Provider Agent process
-            if (_userName != System::getEffectiveUserName())
+            if (_userName != effectiveUserName)
             {
-                if (!System::changeUserContext(_userName.getCString()))
+                if (!System::changeUserContext(newUid, newGid))
                 {
                     Tracer::trace(TRC_DISCARDED_DATA, Tracer::LEVEL2,
                         "System::changeUserContext() failed.  userName = %s.",
@@ -575,7 +597,7 @@
                     _exit(1);
                 }
             }
-#endif
+# endif
 
             execl(agentCommandPathCString, agentCommandPathCString,
                 readHandle, writeHandle,
@@ -1667,7 +1689,7 @@
                     request->operationContext.get(IdentityContainer::NAME);
                 userName = ic.getUserName();
             }
-            catch (Exception& e)
+            catch (Exception&)
             {
                 // If no IdentityContainer is present, default to the CIM
                 // Server's user context
--- pegasus/src/Pegasus/Common/SystemVms.cpp.obz4980	2006-01-30 11:17:08.000000000 -0500
+++ pegasus/src/Pegasus/Common/SystemVms.cpp	2006-05-02 15:34:36.000000000 -0400
@@ -674,7 +674,10 @@
 
 #endif
 
-Boolean System::changeUserContext(const char *userName)
+Boolean System::lookupUserId(
+    const char* userName,
+    PEGASUS_UID_T& uid,
+    PEGASUS_GID_T& gid)
 {
   const unsigned int PWD_BUFF_SIZE = 1024;
   struct passwd pwd;
@@ -697,18 +700,28 @@
     return false;
   }
 
+  uid = pwd.pw_uid;
+  gid = pwd.pw_gid;
+
+  return true;
+}
+
+Boolean System::changeUserContext(
+    const PEGASUS_UID_T& uid,
+    const PEGASUS_GID_T& gid)
+{
   Tracer::trace(TRC_OS_ABSTRACTION, Tracer::LEVEL4,
 	"Changing user context to: uid = %d, gid = %d",
-	(int) pwd.pw_uid, (int) pwd.pw_gid);
+	(int) uid, (int) gid);
 
-  if (setgid(pwd.pw_gid) != 0)
+  if (setgid(gid) != 0)
   {
     PEG_TRACE_STRING(TRC_OS_ABSTRACTION, Tracer::LEVEL2,
 		     String("setgid failed: ") + String(strerror(errno)));
     return false;
   }
 
-  if (setuid(pwd.pw_uid) != 0)
+  if (setuid(uid) != 0)
   {
     PEG_TRACE_STRING(TRC_OS_ABSTRACTION, Tracer::LEVEL2,
 		     String("setuid failed: ") + String(strerror(errno)));
--- pegasus/src/Pegasus/Common/SystemWindows.cpp.obz4980	2006-02-08 15:50:59.000000000 -0500
+++ pegasus/src/Pegasus/Common/SystemWindows.cpp	2006-05-02 15:34:36.000000000 -0400
@@ -838,7 +838,18 @@
     return retVal;
 }
 
-Boolean System::changeUserContext(const char* userName)
+Boolean System::lookupUserId(
+    const char* userName,
+    PEGASUS_UID_T& uid,
+    PEGASUS_GID_T& gid)
+{
+    // ATTN: Implement this method to look up the specified user
+    return false;
+}
+
+Boolean System::changeUserContext(
+    const PEGASUS_UID_T& uid,
+    const PEGASUS_GID_T& gid)
 {
     // ATTN: Implement this method to change the process user context to the
     //       specified user
--- pegasus/src/Pegasus/Common/SystemNsk.cpp.obz4980	2006-01-30 11:17:08.000000000 -0500
+++ pegasus/src/Pegasus/Common/SystemNsk.cpp	2006-05-02 15:34:36.000000000 -0400
@@ -157,7 +157,18 @@
     return true;
 }
 
-Boolean System::changeUserContext(const char* userName)
+Boolean System::lookupUserId(
+    const char* userName,
+    PEGASUS_UID_T& uid,
+    PEGASUS_GID_T& gid)
+{
+    // ATTN: Implement this method to look up the specified user
+    return false;
+}
+
+Boolean System::changeUserContext(
+    const PEGASUS_UID_T& uid,
+    const PEGASUS_GID_T& gid)
 {
     // ATTN: Implement this method to change the process user context to the
     //       specified user
--- pegasus/src/Pegasus/Common/SystemUnix.cpp.obz4980	2006-01-30 11:17:08.000000000 -0500
+++ pegasus/src/Pegasus/Common/SystemUnix.cpp	2006-05-02 15:34:36.000000000 -0400
@@ -1097,8 +1097,12 @@
 
     return retVal;
 }
+
 #ifndef PEGASUS_OS_OS400
-Boolean System::changeUserContext(const char* userName)
+Boolean System::lookupUserId(
+    const char* userName,
+    PEGASUS_UID_T& uid,
+    PEGASUS_GID_T& gid)
 {
     const unsigned int PWD_BUFF_SIZE = 1024;
     struct passwd pwd;
@@ -1129,18 +1133,28 @@
         return false;
     }
 
+    uid = pwd.pw_uid;
+    gid = pwd.pw_gid;
+
+    return true;
+}
+
+Boolean System::changeUserContext(
+    const PEGASUS_UID_T& uid,
+    const PEGASUS_GID_T& gid)
+{
     Tracer::trace(TRC_OS_ABSTRACTION, Tracer::LEVEL4,
         "Changing user context to: uid = %d, gid = %d",
-        (int)pwd.pw_uid, (int)pwd.pw_gid);
+        (int)uid, (int)gid);
 
-    if (setgid(pwd.pw_gid) != 0)
+    if (setgid(gid) != 0)
     {
         PEG_TRACE_STRING(TRC_OS_ABSTRACTION, Tracer::LEVEL2,
             String("setgid failed: ") + String(strerror(errno)));
         return false;
     }
 
-    if (setuid(pwd.pw_uid) != 0)
+    if (setuid(uid) != 0)
     {
         PEG_TRACE_STRING(TRC_OS_ABSTRACTION, Tracer::LEVEL2,
             String("setuid failed: ") + String(strerror(errno)));
@@ -1150,6 +1164,7 @@
     return true;
 }
 #endif
+
 Uint32 System::getPID()
 {
     //
--- pegasus/src/Pegasus/Common/System.h.obz4980	2006-01-30 11:17:08.000000000 -0500
+++ pegasus/src/Pegasus/Common/System.h	2006-05-02 15:34:36.000000000 -0400
@@ -57,6 +57,16 @@
 #endif
 #endif
 
+#ifdef PEGASUS_OS_TYPE_UNIX
+# ifndef PEGASUS_OS_OS400
+#  include <unistd.h>
+# endif
+# define PEGASUS_UID_T uid_t
+# define PEGASUS_GID_T gid_t
+#else
+# define PEGASUS_UID_T Uint32
+# define PEGASUS_GID_T Uint32
+#endif
 
 //
 // Protocal Type
@@ -246,16 +256,33 @@
     static Boolean isGroupMember(const char* userName, const char* groupName);
 
     /**
-    Changes the process user context to the specified user.
-
-    @param userName     User name to set as the process user context.
+        Gets the user and group IDs associated with the specified user.
+        @param userName  User name for which to look up user and group IDs.
+        @param uid       User ID for the specified user name.
+        @param gid       Group ID for the specified user name.
+        @return          True if the user and group IDs were retrieved
+                         successfully, false otherwise.
+    */
+#ifndef PEGASUS_OS_OS400
+    static Boolean lookupUserId(
+        const char* userName,
+        PEGASUS_UID_T& uid,
+        PEGASUS_GID_T& gid);
+#endif
 
-    @return             True if the user context is successfully changed,
-                        false otherwise.
+    /**
+        Changes the process user context to the specified user and group ID.
+        @param uid       User ID to set as the process user context.
+        @param gid       Group ID to set as the process group context.
+        @return          True if the user context is successfully changed,
+                         false otherwise.
     */
 #ifndef PEGASUS_OS_OS400
-    static Boolean changeUserContext(const char* userName);
+    static Boolean changeUserContext(
+        const PEGASUS_UID_T& uid,
+        const PEGASUS_GID_T& gid);
 #endif
+
     /**
     This function is used to get the process ID of the calling process.
 

pegasus-2.5.1-obz4986.patch:
 Makefile            |   63 +++
 testSnmpHandler.cpp |  961 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1024 insertions(+)

--- NEW FILE pegasus-2.5.1-obz4986.patch ---
diff -Nur pegasus.orig/src/Pegasus/Handler/snmpIndicationHandler/tests/testclient/Makefile pegasus/src/Pegasus/Handler/snmpIndicationHandler/tests/testclient/Makefile
--- pegasus.orig/src/Pegasus/Handler/snmpIndicationHandler/tests/testclient/Makefile	1969-12-31 19:00:00.000000000 -0500
+++ pegasus/src/Pegasus/Handler/snmpIndicationHandler/tests/testclient/Makefile	2006-05-02 15:45:49.000000000 -0400
@@ -0,0 +1,63 @@
+#//%2006////////////////////////////////////////////////////////////////////////
+#//
+#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
+#// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
+#// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
+#// 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
+#// 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.
+#//
+#//==============================================================================
+
+ROOT = ../../../../../..
+DIR = Pegasus/Handler/snmpIndicationHandler/tests/testclient
+include $(ROOT)/mak/config.mak
+
+LIBRARIES = \
+    pegclient \
+    pegcommon
+
+EXTRA_INCLUDES = $(SYS_INCLUDES)
+
+LOCAL_DEFINES = -DPEGASUS_INTERNALONLY
+
+PROGRAM = TestSnmpHandler
+
+SOURCES = testSnmpHandler.cpp
+
+include $(ROOT)/mak/program.mak
+
+tests:
+
+poststarttests:
+ifdef PEGASUS_USE_NET_SNMP
+	$(MAKE) wql_4_2
+else
+	 @ $(ECHO) +++++ PEGASUS_USE_NET_SNMP is not set, test can not be run
+endif
+
+wql_4_2:
+	$(PROGRAM) setup WQL
+	$(PROGRAM) run 4 2
+	$(PROGRAM) cleanup
+	$(PROGRAM) removelog
diff -Nur pegasus.orig/src/Pegasus/Handler/snmpIndicationHandler/tests/testclient/testSnmpHandler.cpp pegasus/src/Pegasus/Handler/snmpIndicationHandler/tests/testclient/testSnmpHandler.cpp
--- pegasus.orig/src/Pegasus/Handler/snmpIndicationHandler/tests/testclient/testSnmpHandler.cpp	1969-12-31 19:00:00.000000000 -0500
+++ pegasus/src/Pegasus/Handler/snmpIndicationHandler/tests/testclient/testSnmpHandler.cpp	2006-05-02 15:46:12.000000000 -0400
@@ -0,0 +1,961 @@
+//%2006////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
+// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
+// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
+// 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
+// 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: Yi Zhou, Hewlett-Packard Company (Yi.Zhou at hp.com) 
+//
+// Modified By: 
+//
+//%/////////////////////////////////////////////////////////////////////////////
+
+#include <Pegasus/Common/PegasusAssert.h>
+#include <Pegasus/Common/Thread.h>
+#include <Pegasus/Common/Constants.h>
+#include <Pegasus/Common/FileSystem.h>
+#include <Pegasus/Common/Stopwatch.h>
+#include <Pegasus/Client/CIMClient.h>
+
+PEGASUS_USING_PEGASUS;
+PEGASUS_USING_STD;
+
+const CIMNamespaceName INTEROP_NAMESPACE = CIMNamespaceName ("root/PG_InterOp");
+const CIMNamespaceName SOURCE_NAMESPACE = 
+    CIMNamespaceName ("root/SampleProvider");
+
+const String INDICATION_CLASS_NAME = String ("RT_TestIndication");
+
+const String SNMPV1_HANDLER_NAME = String ("SNMPHandler01");
+const String SNMPV2C_HANDLER_NAME = String ("SNMPHandler02");
+const String FILTER_NAME = String ("IPFilter01");
+
+enum SNMPVersion {_SNMPV1_TRAP = 2, _SNMPV2C_TRAP = 3};
+enum TargetHostFormat {_HOST_NAME = 2, _IPV4_ADDRESS = 3};
+
+#define PORT_NUMBER 2006
+
+Uint32 indicationSendCountTotal = 0;
+
+AtomicInt errorsEncountered(0);
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Thread Parameters Class
+//
+////////////////////////////////////////////////////////////////////////////////
+
+class T_Parms{
+   public:
+    AutoPtr<CIMClient> client;
+    Uint32 indicationSendCount;
+    Uint32 uniqueID;
+};
+
+///////////////////////////////////////////////////////////////////////////
+
+CIMObjectPath _getFilterObjectPath
+    (const String & name)
+{
+    Array<CIMKeyBinding> keyBindings;
+    keyBindings.append (CIMKeyBinding ("SystemCreationClassName",
+        System::getSystemCreationClassName (), CIMKeyBinding::STRING));
+    keyBindings.append (CIMKeyBinding ("SystemName",
+        System::getFullyQualifiedHostName (), CIMKeyBinding::STRING));
+    keyBindings.append (CIMKeyBinding ("CreationClassName",
+        PEGASUS_CLASSNAME_INDFILTER.getString(), CIMKeyBinding::STRING));
+    keyBindings.append (CIMKeyBinding ("Name", name,
+        CIMKeyBinding::STRING));
+    return(CIMObjectPath("", CIMNamespaceName (),
+        PEGASUS_CLASSNAME_INDFILTER, keyBindings));
+}
+
+CIMObjectPath _getHandlerObjectPath
+    (const String & name)
+{
+    Array<CIMKeyBinding> keyBindings;
+    keyBindings.append (CIMKeyBinding ("SystemCreationClassName",
+        System::getSystemCreationClassName (), CIMKeyBinding::STRING));
+    keyBindings.append (CIMKeyBinding ("SystemName",
+        System::getFullyQualifiedHostName (), CIMKeyBinding::STRING));
+    keyBindings.append (CIMKeyBinding ("CreationClassName",
+        PEGASUS_CLASSNAME_INDHANDLER_SNMP.getString(),
+        CIMKeyBinding::STRING));
+    keyBindings.append (CIMKeyBinding ("Name", name,
+        CIMKeyBinding::STRING));
+    return(CIMObjectPath("", CIMNamespaceName (),
+        PEGASUS_CLASSNAME_INDHANDLER_SNMP, keyBindings));
+}
+
+CIMObjectPath _getSubscriptionObjectPath
+    (const String & filterName,
+     const String & handlerName)
+{
+    CIMObjectPath filterObjectPath = _getFilterObjectPath(filterName);
+
+    CIMObjectPath handlerObjectPath = _getHandlerObjectPath(handlerName);
+
+    Array<CIMKeyBinding> subscriptionKeyBindings;
+    subscriptionKeyBindings.append (CIMKeyBinding ("Filter",
+        CIMValue(filterObjectPath)));
+    subscriptionKeyBindings.append (CIMKeyBinding ("Handler",
+        CIMValue(handlerObjectPath)));
+    return(CIMObjectPath("", CIMNamespaceName (),
+        PEGASUS_CLASSNAME_INDSUBSCRIPTION, subscriptionKeyBindings));
+}
+
+CIMObjectPath _createHandlerInstance
+    (CIMClient & client,
+     const String & name,
+     const String & targetHost,
+     const String & securityName,
+     const Uint16 targetHostFormat,
+     const Uint16 snmpVersion)
+{
+    CIMInstance handlerInstance (PEGASUS_CLASSNAME_INDHANDLER_SNMP);
+    handlerInstance.addProperty (CIMProperty (CIMName
+        ("SystemCreationClassName"), System::getSystemCreationClassName ()));
+    handlerInstance.addProperty (CIMProperty (CIMName ("SystemName"),
+        System::getFullyQualifiedHostName ()));
+    handlerInstance.addProperty (CIMProperty (CIMName ("CreationClassName"),
+        PEGASUS_CLASSNAME_INDHANDLER_SNMP.getString ()));
+    handlerInstance.addProperty (CIMProperty (CIMName ("Name"), name));
+    handlerInstance.addProperty (CIMProperty (CIMName ("TargetHost"),
+        targetHost));
+    handlerInstance.addProperty (CIMProperty (CIMName ("TargetHostFormat"),
+        CIMValue ((Uint16) targetHostFormat)));
+    handlerInstance.addProperty (CIMProperty (CIMName ("SNMPSecurityName"),
+        securityName));
+    handlerInstance.addProperty (CIMProperty (CIMName ("SnmpVersion"),
+        CIMValue ((Uint16) snmpVersion)));
+    handlerInstance.addProperty (CIMProperty (CIMName ("PortNumber"),
+        CIMValue ((Uint32) PORT_NUMBER)));
+
+    return(client.createInstance (INTEROP_NAMESPACE, handlerInstance));
+}
+
+CIMObjectPath _createFilterInstance
+    (CIMClient & client,
+     const String & name,
+     const String & query,
+     const String & qlang)
+{
+    CIMInstance filterInstance (PEGASUS_CLASSNAME_INDFILTER);
+    filterInstance.addProperty (CIMProperty (CIMName
+        ("SystemCreationClassName"), System::getSystemCreationClassName ()));
+    filterInstance.addProperty (CIMProperty (CIMName ("SystemName"),
+        System::getFullyQualifiedHostName ()));
+    filterInstance.addProperty (CIMProperty (CIMName ("CreationClassName"),
+        PEGASUS_CLASSNAME_INDFILTER.getString ()));
+    filterInstance.addProperty (CIMProperty (CIMName ("Name"), name));
+    filterInstance.addProperty (CIMProperty (CIMName ("Query"), query));
+    filterInstance.addProperty (CIMProperty (CIMName ("QueryLanguage"),
+        String (qlang)));
+    filterInstance.addProperty (CIMProperty (CIMName ("SourceNamespace"),
+        SOURCE_NAMESPACE.getString ()));
+
+    return(client.createInstance (INTEROP_NAMESPACE, filterInstance));
+}
+
+CIMObjectPath _createSubscriptionInstance
+    (CIMClient & client,
+     const CIMObjectPath & filterPath,
+     const CIMObjectPath & handlerPath)
+{
+    CIMInstance subscriptionInstance (PEGASUS_CLASSNAME_INDSUBSCRIPTION);
+    subscriptionInstance.addProperty (CIMProperty (CIMName ("Filter"),
+        filterPath, 0, PEGASUS_CLASSNAME_INDFILTER));
+    subscriptionInstance.addProperty (CIMProperty (CIMName ("Handler"),
+        handlerPath, 0, PEGASUS_CLASSNAME_INDHANDLER_SNMP));
+    subscriptionInstance.addProperty (CIMProperty
+        (CIMName ("SubscriptionState"), CIMValue ((Uint16) 2)));
+
+    return(client.createInstance (INTEROP_NAMESPACE, subscriptionInstance));
+}
+
+void _sendTestIndication(CIMClient* client, const CIMName & methodName, 
+                         Uint32 indicationSendCount)
+{
+    //
+    //  Invoke method to send test indication
+    //
+    Array <CIMParamValue> inParams;
+    Array <CIMParamValue> outParams;
+    Array <CIMKeyBinding> keyBindings;
+    Sint32 result;
+
+    CIMObjectPath className (String::EMPTY, CIMNamespaceName (),
+        CIMName ("RT_TestIndication"), keyBindings);
+
+    inParams.append(CIMParamValue(String("indicationSendCount"), 
+        CIMValue(indicationSendCount)));
+
+    CIMValue retValue = client->invokeMethod
+        (SOURCE_NAMESPACE,
+         className,
+         methodName,
+         inParams,
+         outParams);
+
+    retValue.get (result);
+    PEGASUS_TEST_ASSERT (result == 0);
+}
+
+void _deleteSubscriptionInstance
+    (CIMClient & client,
+     const String & filterName,
+     const String & handlerName)
+{
+    CIMObjectPath subscriptionObjectPath =
+       _getSubscriptionObjectPath(filterName, handlerName);
+    client.deleteInstance (INTEROP_NAMESPACE, subscriptionObjectPath);
+}
+
+void _deleteHandlerInstance
+    (CIMClient & client,
+     const String & name)
+{
+    CIMObjectPath handlerObjectPath = _getHandlerObjectPath(name);
+    client.deleteInstance (INTEROP_NAMESPACE, handlerObjectPath);
+}
+
+void _deleteFilterInstance
+    (CIMClient & client,
+     const String & name)
+{
+    CIMObjectPath filterObjectPath = _getFilterObjectPath(name);
+    client.deleteInstance (INTEROP_NAMESPACE, filterObjectPath);
+}
+
+void _usage ()
+{
+   cerr << endl
+        << "Usage:" << endl
+        << "    TestSnmpHandler setup [ WQL | DMTF:CQL ]\n"
+        << "    TestSnmpHandler run <indicationSendCount> "
+        << "[<threads>]\n"
+        << "    where: " << endl
+        << "       <indicationSendCount> is the number of indications to\n"
+        << "            generate and has to be greater than zero." << endl
+        << "       <threads> is an optional number of client threads to\n"
+        << "            create, default is one." << endl
+        << "    TestSnmpHandler cleanup\n"
+        << "    TestSnmpHandler removelog"
+        << endl << endl;
+}
+
+void _setup (CIMClient & client, const String& qlang)
+{
+    CIMObjectPath filterObjectPath;
+    CIMObjectPath snmpv1HandlerObjectPath;
+    CIMObjectPath snmpv2HandlerObjectPath;
+
+    try
+    {
+        filterObjectPath = _createFilterInstance (client, FILTER_NAME,
+            String ("SELECT * FROM RT_TestIndication"),
+            qlang);
+    }
+    catch (CIMException& e)
+    {
+        if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
+        {
+            filterObjectPath = _getFilterObjectPath(FILTER_NAME);
+            cerr << "----- Warning: Filter Instance Not Created: "
+                << e.getMessage () << endl;
+        }
+        else
+        {
+            cerr << "----- Error: Filter Instance Not Created: " << endl;
+            throw;
+        }
+    }
+
+    try
+    {
+        // Create SNMPv1 trap handler 
+        snmpv1HandlerObjectPath = _createHandlerInstance (client,
+            SNMPV1_HANDLER_NAME,
+            System::getFullyQualifiedHostName(),
+            "",
+            _HOST_NAME,
+            _SNMPV1_TRAP);
+    }
+    catch (CIMException& e)
+    {
+        if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
+        {
+            snmpv1HandlerObjectPath = _getHandlerObjectPath(
+                SNMPV1_HANDLER_NAME);
+            cerr << "----- Warning: SNMPv1 Trap Handler Instance Not Created: "
+                << e.getMessage () << endl;
+        }
+        else
+        {
+            cerr << "----- Error: SNMPv1 Trap Handler Instance Not Created: "
+                << endl;
+            throw;
+        }
+    }
+
+    try
+    {
+        _createSubscriptionInstance (client, filterObjectPath,
+             snmpv1HandlerObjectPath);
+    }
+    catch (CIMException& e)
+    {
+        if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
+        {
+            cerr << "----- Warning: Client Subscription Instance: "
+                << e.getMessage () << endl;
+        }
+        else
+        {
+            cerr << "----- Error: Client Subscription Instance: " << endl;
+            throw;
+        }
+    }
+
+    try
+    {
+        // Create SNMPv2 trap handler 
+        snmpv2HandlerObjectPath = _createHandlerInstance (client,
+            SNMPV2C_HANDLER_NAME,
+            System::getHostIP(System::getFullyQualifiedHostName ()),
+            "public",
+            _IPV4_ADDRESS,
+            _SNMPV2C_TRAP);
+    }
+    catch (CIMException& e)
+    {
+        if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
+        {
+            snmpv2HandlerObjectPath = _getHandlerObjectPath(
+                SNMPV2C_HANDLER_NAME);
+            cerr << "----- Warning: SNMPv2c Trap Handler Instance Not Created: "
+                << e.getMessage () << endl;
+        }
+        else
+        {
+            cerr << "----- Error: SNMPv2c Trap Handler Instance Not Created: "
+                << endl;
+            throw;
+        }
+    }
+
+    try
+    {
+        _createSubscriptionInstance (client, filterObjectPath,
+             snmpv2HandlerObjectPath);
+    }
+    catch (CIMException& e)
+    {
+        if (e.getCode() == CIM_ERR_ALREADY_EXISTS)
+        {
+            cerr << "----- Warning: Client Subscription Instance: "
+                << e.getMessage () << endl;
+        }
+        else
+        {
+            cerr << "----- Error: Client Subscription Instance: " << endl;
+            throw;
+        }
+    }
+}
+
+void _cleanup (CIMClient & client)
+{
+    try
+    {
+        _deleteSubscriptionInstance (client, FILTER_NAME,
+            SNMPV1_HANDLER_NAME);
+    }
+    catch (CIMException& e)
+    {
+        if (e.getCode() != CIM_ERR_NOT_FOUND)
+        {
+            cerr << "----- Error: deleteSubscriptionInstance failure: "
+                 << endl;
+            throw;
+        }
+    }
+    try
+    {
+        _deleteSubscriptionInstance (client, FILTER_NAME,
+            SNMPV2C_HANDLER_NAME);
+    }
+    catch (CIMException& e)
+    {
+        if (e.getCode() != CIM_ERR_NOT_FOUND)
+        {
+            cerr << "----- Error: deleteSubscriptionInstance failure: "
+                 << endl;
+            throw;
+        }
+    }
+    try
+    {
+        _deleteFilterInstance (client, FILTER_NAME);
+    }
+    catch (CIMException& e)
+    {
+        if (e.getCode() != CIM_ERR_NOT_FOUND)
+        {
+            cerr << "----- Error: deleteFilterInstance failure: " << endl;
+            throw;
+        }
+    }
+
+    try
+    {
+        _deleteHandlerInstance (client, SNMPV1_HANDLER_NAME);
+    }
+    catch (CIMException& e)
+    {
+        if (e.getCode() != CIM_ERR_NOT_FOUND)
+        {
+            cerr << "----- Error: deleteHandlerInstance failure: " << endl;
+            throw;
+        }
+    }
+    try
+    {
+        _deleteHandlerInstance (client, SNMPV2C_HANDLER_NAME);
+    }
+    catch (CIMException& e)
+    {
+        if (e.getCode() != CIM_ERR_NOT_FOUND)
+        {
+            cerr << "----- Error: deleteHandlerInstance failure: " << endl;
+            throw;
+        }
+    }
+}
+
+static void _testEnd(const String& uniqueID, const double elapsedTime)
+{
+    cout << "+++++ thread" << uniqueID << ": passed in " << elapsedTime
+        << " seconds" << endl;
+}
+
+PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL _executeTests(void *parm)
+{
+    Thread *my_thread = (Thread *)parm;
+    T_Parms *parms = (T_Parms *)my_thread->get_parm();
+    CIMClient *client = parms->client.get();
+    Uint32 indicationSendCount = parms->indicationSendCount;
+    Uint32 id = parms->uniqueID;
+    char id_[4];
+    memset(id_,0x00,sizeof(id_));
+    sprintf(id_,"%i",id);
+    String uniqueID = "_";
+    uniqueID.append(id_);
+
+    try
+    {
+        Stopwatch elapsedTime;
+
+        elapsedTime.start();
+        try
+        {
+            _sendTestIndication (client, CIMName ("SendTestIndicationTrap"),
+            indicationSendCount);
+        }
+        catch (Exception & e)
+        {
+            cerr << "----- sendTestIndication failed: " << e.getMessage () << endl;
+            exit (-1);
+        }
+        elapsedTime.stop();
+        _testEnd(uniqueID, elapsedTime.getElapsed());
+    }
+    catch(Exception  & e)
+    {
+        cout << e.getMessage() << endl;
+    }
+    my_thread->exit_self((PEGASUS_THREAD_RETURN)1);
+    return(0);
+}
+
+Thread * _runTestThreads(
+    CIMClient* client,
+    Uint32 indicationSendCount,
+    Uint32 uniqueID)
+{
+    // package parameters, create thread and run...
+    AutoPtr<T_Parms> parms(new T_Parms());
+    parms->client.reset(client);
+    parms->indicationSendCount = indicationSendCount;
+    parms->uniqueID = uniqueID;
+    AutoPtr<Thread> t(new Thread(_executeTests, (void*)parms.release(), false));
+    t->run();
+    return t.release();
+}
+
+String _getLogFile()
+{
+    return("trapLogFile");
+}
+
+Uint32 _getReceivedTrapCount(Uint16 snmpVersion)
+{
+    String trap1 = "Trap Info: TRAP, SNMP v1, community public";
+    String trap2 = "Trap Info: TRAP2, SNMP v2c, community public";
+
+    Uint32 receivedTrap1Count = 0;
+    Uint32 receivedTrap2Count = 0;
+ 
+    ifstream ifs(_getLogFile().getCString());
+    if (!ifs)
+    {
+        return (0);
+    }
+
+    String line;
+    while (GetLine(ifs, line))
+    {
+        if (String::compare(line, trap1) == 0)
+        {
+            receivedTrap1Count++;
+        }
+        if (String::compare(line, trap2) == 0)
+        {
+            receivedTrap2Count++;
+        }
+    }
+
+    ifs.close();
+
+    switch (snmpVersion)
+    {
+        case _SNMPV1_TRAP:
+        {
+            return (receivedTrap1Count);
+        }
+        case _SNMPV2C_TRAP:
+        {
+            return (receivedTrap2Count);
+        }
+        default:
+        {
+            return (0);
+        }
+    }
+
+}
+
+#ifdef PEGASUS_USE_NET_SNMP
+// Stop snmptrapd process if it is running and remove 
+// procIdFile file if it exists
+// 
+void _stopSnmptrapd()
+{
+    String procIdFileName = "procIdFile";
+
+    Uint32 receiverPid;
+    FILE *fd;
+    if ((fd = fopen(procIdFileName.getCString(), "r")) != NULL)
+    {
+        fscanf(fd, "%d\n", &receiverPid);
+        
+        kill(receiverPid, SIGTERM);
+
+        fclose(fd);
+    }
+
+    if (FileSystem::exists(procIdFileName))
+    {
+        FileSystem::removeFile(procIdFileName);
+    }
+}
+
+static Boolean _startSnmptrapd(
+    FILE **trapInfo)
+{
+    String snmptrapdCmd;
+
+    Uint32 portNumber = PORT_NUMBER;
+    char portNumberStr[32];
+    sprintf(portNumberStr, "%lu", (unsigned long) portNumber);
+
+    //
+    // build snmptrapd cmd options
+    //
+
+    // Specify logging incoming traps to trapLogFile 
+    // Save the process ID of the snmptrapd in procIdFile
+    snmptrapdCmd.append(
+        "/usr/sbin/snmptrapd -f -Lf trapLogFile -p procIdFile");
+
+    // Specify incoming trap format
+    snmptrapdCmd.append( " -F \"\nTrap Info: %P\nVariable: %v\n\"");
+
+    // Specify listening address
+    snmptrapdCmd.append(" UDP:");
+    snmptrapdCmd.append(System::getFullyQualifiedHostName ());
+
+    snmptrapdCmd.append(":");
+    snmptrapdCmd.append(portNumberStr);
+
+    if ((*trapInfo = popen(snmptrapdCmd.getCString(), "r")) == NULL)
+    {
+        throw Exception ("snmptrapd can not be started");
+    }
+
+#define MAX_ITERATIONS 300
+#define SLEEP_SEC 1
+
+    Uint32 iterations = 0;
+
+    // Wait until snmptrapd startted 
+    while (iterations < MAX_ITERATIONS)
+    {
+        iterations++;
+        if (FileSystem::exists("procIdFile"))
+        {
+            return (true);
+        }
+        else
+        {
+            System::sleep(SLEEP_SEC);
+        
+        }
+    }
+
+    throw Exception ("snmptrapd can not be started");
+}
+#endif
+
+void _removeTrapLogFile ()
+{
+    String logFile = _getLogFile();
+
+    // if trapLogFile exists, remove it
+    if (FileSystem::exists(logFile))
+    {
+        FileSystem::removeFile(logFile);
+    }
+}
+
+int _beginTest(CIMClient& workClient, 
+    Uint32 indicationSendCount,
+    Uint32 runClientThreadCount)
+{
+
+#ifdef PEGASUS_USE_NET_SNMP
+
+    // Stop snmptrapd process if it is running
+    _stopSnmptrapd();
+
+    // if trapLogFile exists, remove it
+    _removeTrapLogFile();
+
+    FILE * trapInfo;
+
+    try
+    {
+        _startSnmptrapd(&trapInfo);
+    }
+    catch (Exception & e)
+    {
+        cerr << e.getMessage() << endl;
+        return (-1);
+    }
+#else
+    cerr << "Cannot create a trap receiver." << endl;
+    return (-1);
+#endif
+ 
+    CIMClient * clientConnections = new CIMClient[runClientThreadCount];
+
+    // determine total number of indication send count
+    indicationSendCountTotal = indicationSendCount * runClientThreadCount;
+
+    // calculate the timeout based on the total send count allowing
+    // using the MSG_PER_SEC rate 
+    // allow 20 seconds of test overhead for very small tests 
+
+#define MSG_PER_SEC 4
+
+    Uint32 testTimeout = 20000+(indicationSendCountTotal/MSG_PER_SEC)*1000;
+
+    // connect the clients
+    for(Uint32 i = 0; i < runClientThreadCount; i++)
+    {
+        clientConnections[i].setTimeout(testTimeout);
+        clientConnections[i].connectLocal();
+    }
+
+    // run tests
+    Thread ** clientThreads = new Thread *[runClientThreadCount];
+
+    Stopwatch trapReceiverElapsedTime;
+
+    trapReceiverElapsedTime.start();
+
+    for(Uint32 i = 0; i < runClientThreadCount; i++)
+    {
+        clientThreads[i] = _runTestThreads(&clientConnections[i],
+            indicationSendCount, i);
+    }
+
+    for(Uint32 i=0; i< runClientThreadCount; i++)
+    {
+        clientThreads[i]->join();
+    }
+
+    delete[] clientConnections;
+    delete[] clientThreads;
+
+    //
+    //  Allow time for the trap to be received
+    //  Wait in SLEEP_SEC second intervals.
+    //  Put msg out every MSG_SEC intervals
+    //
+
+#define SLEEP_SEC 1
+#define COUT_TIME_INTERVAL 30
+#define MAX_NO_CHANGE_ITERATIONS COUT_TIME_INTERVAL*3
+
+    Uint32 noChangeIterations = 0;
+    Uint32 priorReceivedTrap1Count = 0;
+    Uint32 priorReceivedTrap2Count = 0;
+    Uint32 currentReceivedTrap1Count = 0;
+    Uint32 currentReceivedTrap2Count = 0;
+    Uint32 totalIterations = 0;
+
+    //
+    // Wait for the trap receiver to receive the expected
+    // number of Indication traps, indicationSendCountTotal. 
+    //
+    // We will continue to wait until either indicationSendCountTotal
+    // Indications have been received by the trap receiver or no new
+    // Indications have been received in the previous
+    // MAX_NO_CHANGE_ITERATIONS.
+    // iterations. 
+    //
+
+    Boolean receivedTrapCountComplete = false;
+    Boolean receiverTrap1NoChange = true;
+    Boolean receiverTrap2NoChange = true;
+
+    while (noChangeIterations <= MAX_NO_CHANGE_ITERATIONS)
+    {
+        totalIterations++;
+
+        currentReceivedTrap1Count = _getReceivedTrapCount(_SNMPV1_TRAP); 
+        currentReceivedTrap2Count = _getReceivedTrapCount(_SNMPV2C_TRAP); 
+
+        if (totalIterations % COUT_TIME_INTERVAL == 1 &&
+            !(receivedTrapCountComplete))
+        {
+            cout << "++++ The trap receiver has received "
+            << currentReceivedTrap1Count << " of "
+            << indicationSendCountTotal << " SNMPv1 trap."
+            << endl;
+            cout << "++++ The trap receiver has received "
+            << currentReceivedTrap2Count << " of "
+            << indicationSendCountTotal << " SNMPv2c trap."
+            << endl;
+        }
+
+        if ((indicationSendCountTotal == currentReceivedTrap1Count) &&
+            (indicationSendCountTotal == currentReceivedTrap2Count))
+        {
+             receivedTrapCountComplete = true;
+             trapReceiverElapsedTime.stop();
+        }
+        if (!(receiverTrap1NoChange =
+                (priorReceivedTrap1Count == currentReceivedTrap1Count)))
+        {
+             priorReceivedTrap1Count = currentReceivedTrap1Count;
+        }
+
+        if (!(receiverTrap2NoChange =
+                (priorReceivedTrap2Count == currentReceivedTrap2Count)))
+        {
+             priorReceivedTrap2Count = currentReceivedTrap2Count;
+        }
+
+        if (receivedTrapCountComplete)
+        {
+            cout << "++++ The trap receiver has received "
+            << currentReceivedTrap1Count << " of "
+            << indicationSendCountTotal << " SNMPv1 trap."
+            << endl;
+            cout << "++++ The trap receiver has received "
+            << currentReceivedTrap2Count << " of "
+            << indicationSendCountTotal << " SNMPv2c trap."
+            << endl;
+
+            break;
+        }
+        if (receiverTrap1NoChange || receiverTrap2NoChange)
+        {
+           noChangeIterations++;
+        }
+        else
+        {
+           noChangeIterations = 0;
+        }
+
+        System::sleep (SLEEP_SEC);
+    }
+
+    if (!receivedTrapCountComplete)
+    {
+        trapReceiverElapsedTime.stop();
+    }
+
+    // assert that all indications sent have been received. 
+    PEGASUS_TEST_ASSERT(indicationSendCountTotal ==
+       currentReceivedTrap1Count);
+    PEGASUS_TEST_ASSERT(indicationSendCountTotal ==
+       currentReceivedTrap2Count);
+
+#ifdef PEGASUS_USE_NET_SNMP
+    // Stop snmptrapd process if it is running and remove procIdFile
+    _stopSnmptrapd();
+
+    pclose(trapInfo);
+#endif
+
+    // if error encountered then fail the test.
+    if (errorsEncountered.get())
+    {  
+        cout << "+++++ test failed" << endl;
+        return (-1);
+    }
+    else
+    {
+        cout << "+++++ passed all tests" << endl;
+    }
+        
+    return 0;
+}
+
+int main (int argc, char** argv)
+{
+    // This client connection is used solely to create and delete subscriptions.
+    CIMClient workClient;
+    try
+    {
+        workClient.connectLocal();
+
+        if (argc <= 1 || argc > 4)
+        {
+            cerr << "Invalid argument count: " << argc << endl;
+            _usage();
+            return 1;
+        }
+        else if (strcmp(argv[1], "setup") == 0)
+        {
+            if (argc < 3)
+            {
+                cerr << "Missing query language" << endl;
+                _usage();
+                return -1;
+            }
+
+            if ((strcmp(argv[2], "WQL") != 0) &&
+                (strcmp(argv[2], "DMTF:CQL") != 0))
+            {
+                cerr << "Invalid query language: '" << argv[2] << "'" << endl;
+                _usage();
+                return -1;
+            }
+        
+            _setup(workClient, argv[2]);
+
+            cout << "+++++ setup completed successfully" << endl;
+            return 0;
+        } 
+        else if (String::equalNoCase(argv[1], "run"))
+        {
+            if (argc < 3)
+            {
+                cerr << "Invalid indicationSendCount." << endl;
+                _usage ();
+                return -1;
+            }
+
+            Uint32 indicationSendCount = atoi(argv[2]);
+
+            Uint32 runClientThreadCount = 1;
+
+            if (argc == 4) 
+            {
+                runClientThreadCount = atoi(argv[3]);
+            }
+
+            int rc = _beginTest(workClient, indicationSendCount, 
+                runClientThreadCount);
+            return rc;
+        } 
+        else if (String::equalNoCase(argv[1], "cleanup"))
+        {
+            if (argc > 2)
+            {
+                cerr << "Invalid argument count." << endl;
+                _usage ();
+                return -1;
+            }
+       
+            _cleanup (workClient);
+
+            cout << "+++++ cleanup completed successfully" << endl;
+            return 0;
+        }
+        else if (String::equalNoCase(argv[1], "removelog"))
+        {
+            if (argc > 2)
+            {
+                cerr << "Invalid argument count." << endl;
+                _usage ();
+                return -1;
+            }
+       
+            _removeTrapLogFile ();
+            cout << "+++++ removelog completed successfully" << endl;
+            return 0;
+        }
+        else
+        {
+            cerr << "Invalid option: " << argv[1] << endl;
+            _usage ();
+            return -1;
+        }
+    }
+    catch (Exception & e)
+    {
+        cerr << "Error: " << e.getMessage() << endl;
+    }
+
+    PEGASUS_UNREACHABLE( return 0; )
+}

pegasus-2.5.1-initscript.patch:
 tog-pegasus.rc |  123 ++++++++++++++++++++++++++++++---------------------------
 1 files changed, 66 insertions(+), 57 deletions(-)

Index: pegasus-2.5.1-initscript.patch
===================================================================
RCS file: /cvs/dist/rpms/tog-pegasus/devel/pegasus-2.5.1-initscript.patch,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- pegasus-2.5.1-initscript.patch	11 Apr 2006 19:40:55 -0000	1.2
+++ pegasus-2.5.1-initscript.patch	3 May 2006 00:13:59 -0000	1.3
@@ -1,6 +1,6 @@
 --- pegasus/rpm/tog-pegasus.rc.initscript	2006-01-30 11:16:24.000000000 -0500
-+++ pegasus/rpm/tog-pegasus.rc	2006-04-11 13:57:31.000000000 -0400
-@@ -1,80 +1,85 @@
++++ pegasus/rpm/tog-pegasus.rc	2006-05-02 18:44:18.000000000 -0400
+@@ -1,80 +1,84 @@
 -#//%2006////////////////////////////////////////////////////////////////////////
 -#//
 -#// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
@@ -113,8 +113,7 @@
 -	[ "$RETVAL" -eq 0 ] && log_success_msg $"$prog stop" || log_failure_msg $"$prog stop"
 +	if [ "$RETVAL" -eq 0 ]; then
 +	    rm -f $LOCKFILE;
-+	    rm -f /var/run/tog-pegasus/socket/*;
-+	    rm -f /var/run/tog-pegasus/cimserver.pid;
++	    rm -f /var/run/tog-pegasus/*;
 +	    success;
 +	else
 +	    failure;
@@ -140,7 +139,7 @@
       condrestart)
  	pid=`pidofproc $CIMSERVER_BIN`
  	RETVAL=$?
-@@ -83,13 +88,18 @@
+@@ -83,13 +87,18 @@
  	    RETVAL=$?;
  	fi;
          ;;

pegasus-2.5.1-warnings.patch:
 Common/Packer.h                               |    4 ++--
 Common/ResponseHandler.cpp                    |    4 ++--
 Common/String.cpp                             |    4 ++--
 Common/StringInline.h                         |    4 ++--
 Config/ConfigManager.cpp                      |    2 +-
 ProviderManager2/CMPI/CMPIProviderManager.cpp |    6 +++---
 6 files changed, 12 insertions(+), 12 deletions(-)

Index: pegasus-2.5.1-warnings.patch
===================================================================
RCS file: /cvs/dist/rpms/tog-pegasus/devel/pegasus-2.5.1-warnings.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- pegasus-2.5.1-warnings.patch	7 Apr 2006 02:40:20 -0000	1.1
+++ pegasus-2.5.1-warnings.patch	3 May 2006 00:13:59 -0000	1.2
@@ -45,13 +45,13 @@
  inline void Packer::packReal32(Buffer& out, Real32 x)
  {
 -    packUint32(out, *((Uint32*)&x));
-+    packUint32(out, (Uint32)x);
++    packUint32(out, *(reinterpret_cast<Uint32*>(&x)));
  }
  
  inline void Packer::packReal64(Buffer& out, Real64 x)
  {
 -    packUint64(out, *((Uint64*)&x));
-+    packUint64(out, (Uint64)x);
++    packUint64(out, *(reinterpret_cast<Uint64*>(&x)));
  }
  
  inline void Packer::packChar16(Buffer& out, Char16 x)


Index: tog-pegasus.spec
===================================================================
RCS file: /cvs/dist/rpms/tog-pegasus/devel/tog-pegasus.spec,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -r1.30 -r1.31
--- tog-pegasus.spec	17 Apr 2006 21:29:22 -0000	1.30
+++ tog-pegasus.spec	3 May 2006 00:13:59 -0000	1.31
@@ -31,7 +31,7 @@
 %define pegasus_uid	66
 
 Version: 		2.5.1
-Release: 		3%{?LINUX_VERSION:.%{LINUX_VERSION}}
+Release: 		4%{?LINUX_VERSION:.%{LINUX_VERSION}}
 Epoch:   		2
 #
 Summary:   		OpenPegasus WBEM Services for Linux
@@ -66,6 +66,13 @@
 Patch15:		pegasus-2.5.1-PATH_MAX.patch
 Patch16:		pegasus-2.5.1-HOSTNAME_MAX.patch
 Patch17:		pegasus-2.5.1-fix_repupgrade.patch
+Patch18:		pegasus-2.5.1-obz4968_upcalls_oop.patch
+Patch19:		pegasus-2.5.1-obz4955.patch
+Patch20:		pegasus-2.5.1-obz4956.patch
+Patch21:		pegasus-2.5.1-obz4978.patch
+Patch22:		pegasus-2.5.1-obz4983.patch
+Patch23:		pegasus-2.5.1-obz4984.patch
+Patch24:		pegasus-2.5.1-obz4986.patch
 #
 Conflicts: 		openwbem
 Provides: 		tog-pegasus-cimserver
@@ -132,12 +139,20 @@
 %patch9 -p1 -b .parallel-make
 %patch10 -p1 -b .fix-zseries-flags
 %patch11 -p1 -b .fix-tests
-%patch12 -p1 -b .AutoPtr-Core
+#%patch12 -p1 -b .AutoPtr-Core
+#^- now fixed with upstream obz4968 patch
 %patch13 -p1 -b .obz4934
 %patch14 -p1 -b .obz4945
 %patch15 -p1 -b .PATH_MAX
 %patch16 -p1 -b .HOSTNAME_MAX
 %patch17 -p1 -b .fix_repupgrade
+%patch18 -p1 -b .obz4968_upcalls_oop
+%patch19 -p1 -b .obz4955
+%patch20 -p1 -b .obz4956
+%patch21 -p1 -b .obz4978
+%patch22 -p1 -b .obz4983
+%patch23 -p1 -b	.obz4984
+%patch24 -p1 -b .obz4986
 
 %build
 rm -rf ${RPM_BUILD_ROOT} || :;
@@ -163,6 +178,9 @@
 
 %files
 %defattr(0750, root, pegasus, 0750)
+%if !%{NODEBUGINFO}
+%exclude /usr/lib/debug
+%endif
 /usr/%{_lib}/*
 /usr/sbin/*
 /usr/bin/*
@@ -272,6 +290,19 @@
 :;
 
 %changelog
+* Tue May 02 2006 Jason Vas Dias <jvdias at redhat.com> - 2:2.5.1-4
+- fix bug 190432: %exclude /usr/lib/debug from RPM
+- fix upstream OpenPegasus '2.5.2_APPROVED' bugs, applying upstream patches:
+  o 4955 : Bogus Description property for OperatingSystem provider
+  o 4956 : reserveCapacity method may cause size overflow on invalid input
+  o 4968 : CMPI provider up-calls cause failure with out-of-process
+  o 4978 : snmpDeliverTrap_netsnmp::_createSession function is not thread safe
+  o 4983 : Memory leak in OOP indication generation
+  o 4984 : Forked process hangs in system call
+  o 4986 : Adding automated test for snmpIndication Handler
+  (  http://cvs.opengroup.org/bugzilla/show_bug.cgi?id=? )
+- apply upstream update to 'pegasus-2.5.1-warnings.patch' 
+
 * Mon Apr 17 2006 Jason Vas Dias <jvdias at redhat.com> - 2:2.5.1-3
 - Fix repupgrade (make it use correct paths)
 




More information about the fedora-cvs-commits mailing list