version 1.71, 2007/06/26 20:26:13
|
version 1.91, 2012/07/03 15:23:11
|
|
|
//%2006//////////////////////////////////////////////////////////////////////// |
//%LICENSE//////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development |
// Licensed to The Open Group (TOG) under one or more contributor license |
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. |
// agreements. Refer to the OpenPegasusNOTICE.txt file distributed with |
// Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.; |
// this work for additional information regarding copyright ownership. |
// IBM Corp.; EMC Corporation, The Open Group. |
// Each contributor licenses this file to you under the OpenPegasus Open |
// Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.; |
// Source License; you may not use this file except in compliance with the |
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. |
// License. |
// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
|
// EMC Corporation; VERITAS Software Corporation; The Open Group. |
|
// 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 |
// of this software and associated documentation files (the "Software"), to |
// copy of this software and associated documentation files (the "Software"), |
// deal in the Software without restriction, including without limitation the |
// to deal in the Software without restriction, including without limitation |
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or |
// the rights to use, copy, modify, merge, publish, distribute, sublicense, |
// sell copies of the Software, and to permit persons to whom the Software is |
// and/or sell copies of the Software, and to permit persons to whom the |
// furnished to do so, subject to the following conditions: |
// Software is furnished to do so, subject to the following conditions: |
// | // |
// THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN |
// The above copyright notice and this permission notice shall be included |
// ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED |
// in all copies or substantial portions of the Software. |
// "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. |
|
// | // |
//============================================================================== |
// 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. |
|
// |
|
////////////////////////////////////////////////////////////////////////// |
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
|
|
| |
#include <Pegasus/Common/Config.h> | #include <Pegasus/Common/Config.h> |
#include <Pegasus/Common/String.h> | #include <Pegasus/Common/String.h> |
|
#include <Pegasus/Common/Array.h> |
#include <Pegasus/Common/Linkage.h> | #include <Pegasus/Common/Linkage.h> |
#include <Pegasus/Common/Logger.h> | #include <Pegasus/Common/Logger.h> |
|
#include <Pegasus/Common/Network.h> |
|
#include <Pegasus/Common/Mutex.h> |
#include <sys/stat.h> | #include <sys/stat.h> |
| |
| |
|
|
#ifndef mode_t | #ifndef mode_t |
typedef unsigned long mode_t; | typedef unsigned long mode_t; |
#endif | #endif |
|
#include <windows.h> |
#endif | #endif |
| |
#if defined (PEGASUS_OS_TYPE_UNIX) || (PEGASUS_OS_VMS) |
#if defined (PEGASUS_OS_TYPE_UNIX) || \ |
|
defined (PEGASUS_OS_VMS) |
# include <unistd.h> | # include <unistd.h> |
# include <fcntl.h> // File locking | # include <fcntl.h> // File locking |
# define PEGASUS_UID_T uid_t | # define PEGASUS_UID_T uid_t |
|
|
# define PEGASUS_GID_T Uint32 | # define PEGASUS_GID_T Uint32 |
#endif | #endif |
| |
|
#if defined(PEGASUS_OS_TYPE_WINDOWS) |
|
# define PEGASUS_SYSTEM_ERRORMSG_NLS \ |
|
System::getErrorMSG_NLS(GetLastError(),0) |
|
# define PEGASUS_SYSTEM_NETWORK_ERRORMSG_NLS \ |
|
System::getErrorMSG_NLS(WSAGetLastError(),0) |
|
# define PEGASUS_SYSTEM_ERRORMSG \ |
|
System::getErrorMSG(GetLastError(),0) |
|
# define PEGASUS_SYSTEM_NETWORK_ERRORMSG \ |
|
System::getErrorMSG(WSAGetLastError(),0) |
|
#elif defined(PEGASUS_OS_ZOS) |
|
# define PEGASUS_SYSTEM_ERRORMSG_NLS \ |
|
System::getErrorMSG_NLS(errno,__errno2()) |
|
# define PEGASUS_SYSTEM_NETWORK_ERRORMSG_NLS \ |
|
System::getErrorMSG_NLS(errno,__errno2()) |
|
# define PEGASUS_SYSTEM_ERRORMSG \ |
|
System::getErrorMSG(errno,__errno2()) |
|
# define PEGASUS_SYSTEM_NETWORK_ERRORMSG \ |
|
System::getErrorMSG(errno,__errno2()) |
|
#else |
|
# define PEGASUS_SYSTEM_ERRORMSG_NLS \ |
|
System::getErrorMSG_NLS(errno,0) |
|
# define PEGASUS_SYSTEM_NETWORK_ERRORMSG_NLS \ |
|
System::getErrorMSG_NLS(errno,0) |
|
# define PEGASUS_SYSTEM_ERRORMSG \ |
|
System::getErrorMSG(errno,0) |
|
# define PEGASUS_SYSTEM_NETWORK_ERRORMSG \ |
|
System::getErrorMSG(errno,0) |
|
#endif |
|
|
// | // |
// Protocal Type | // Protocal Type |
// | // |
|
|
class PEGASUS_COMMON_LINKAGE System | class PEGASUS_COMMON_LINKAGE System |
{ | { |
public: | public: |
|
|
|
/* Creates a String object containing the system message |
|
from the errno and if supported from a second level error |
|
number. The _NLS Method is looking up an internationalized version of |
|
the message. |
|
@param errorCode The system errno. |
|
@param errorCode2 The secondary error number like errno2 on z/OS |
|
*/ |
|
static String getErrorMSG_NLS(int errorCode,int errorCode2); |
|
static String getErrorMSG(int errorCode,int errorCode2); |
|
|
/** getCurrentTime - Gets the current time as seconds and milliseconds | /** getCurrentTime - Gets the current time as seconds and milliseconds |
into the provided variables using system functions. | into the provided variables using system functions. |
@param seconds Return for the seconds component of the time. | @param seconds Return for the seconds component of the time. |
|
|
*/ | */ |
static void getCurrentTimeUsec(Uint32& seconds, Uint32& microseconds); | static void getCurrentTimeUsec(Uint32& seconds, Uint32& microseconds); |
| |
|
/** Similar to getCurrentTime() above but get the full time in microseconds |
|
*/ |
|
static Uint64 getCurrentTimeUsec(); |
|
|
/** getCurrentASCIITime Gets time/date in a fixed format. The format is | /** getCurrentASCIITime Gets time/date in a fixed format. The format is |
YY MM DD-HH:MM:SS | YY MM DD-HH:MM:SS |
@return Returns String with the ASCII time date. | @return Returns String with the ASCII time date. |
|
|
| |
static Boolean removeFile(const char* path); | static Boolean removeFile(const char* path); |
| |
|
/** |
|
Renames a file. If the new name refers to an existing file, it is |
|
removed and replaced with the renamed file. The rename operation is |
|
performed atomically. |
|
@param oldPath A character string containing the name of the file to |
|
rename. |
|
@param newPath A character string containing the name to which to |
|
rename the file. |
|
@return A Boolean indicating whether the rename operation was |
|
successful. |
|
*/ |
static Boolean renameFile(const char* oldPath, const char* newPath); | static Boolean renameFile(const char* oldPath, const char* newPath); |
| |
static Boolean copyFile(const char* fromPath, const char* toPath); | static Boolean copyFile(const char* fromPath, const char* toPath); |
|
|
static String getFullyQualifiedHostName (); | static String getFullyQualifiedHostName (); |
static String getSystemCreationClassName (); | static String getSystemCreationClassName (); |
| |
|
// The following 2 methods are wrappers around system functions |
|
// gethostbyname/gethostbyaddr or gethostbyname_r/gethostbyaddr_r. |
|
// In addition to calling corresponding system functions, these |
|
// methods introduce re-tries when errno is set to TRY_AGAIN. |
|
// Optional parameters are required to cover systems which use '_r' |
|
// versions of the system functions. |
|
static struct hostent* getHostByName( |
|
const char* name, |
|
struct hostent* he = 0, |
|
char* buf = 0, |
|
size_t len = 0); |
|
static struct hostent* getHostByAddr( |
|
const char *addr, |
|
int len, |
|
int type, |
|
struct hostent* he = 0, |
|
char* buf = 0, |
|
size_t buflen = 0); |
|
|
|
#if defined(PEGASUS_OS_ZOS) || \ |
|
defined(PEGASUS_OS_VMS) || \ |
|
defined(PEGASUS_ENABLE_IPV6) |
|
|
|
// The following 2 methods are wrappers around system functions |
|
// getaddrinfo/getnameinfo. |
|
// In addition to calling corresponding system functions, these |
|
// methods introduce re-tries on EAI_AGAIN error returns. |
|
static int getAddrInfo( |
|
const char *hostname, |
|
const char *servname, |
|
const struct addrinfo *hints, |
|
struct addrinfo **res); |
|
static int getNameInfo( |
|
const struct sockaddr *sa, |
|
size_t salen, |
|
char *host, |
|
size_t hostlen, |
|
char *serv, |
|
size_t servlen, |
|
int flags); |
|
|
|
#endif |
|
|
// Gets IP address assosiated with hostName. af indicates the | // Gets IP address assosiated with hostName. af indicates the |
// type of address (ipv4 or ipv6) returned. | // type of address (ipv4 or ipv6) returned. |
static Boolean getHostIP(const String &hostName, int *af, String &hostIP); | static Boolean getHostIP(const String &hostName, int *af, String &hostIP); |
| |
// Gets IP address in binary form. af indicates the type of | // Gets IP address in binary form. af indicates the type of |
// address (ipv4 or ipv6) returned. Address will be copied to dst. | // address (ipv4 or ipv6) returned. Address will be copied to dst. |
static Boolean _acquireIP(const char* hostname, int *af, void *dst); |
static Boolean acquireIP(const char* hostname, int *af, void *dst); |
|
|
|
/** |
|
Returns true if IPv6 stack is active by checking return code from |
|
Socket::createSocket() and getSocketError() calls. |
|
|
|
ATTN: We return true if some error other than |
|
PEGASUS_INVALID_ADDRESS_FAMILY is returned while creating the socket |
|
because we will not be sure whether the IPv6 stack is active or not |
|
from the returned error code. Return value of "true" from this method |
|
should not be trusted absolutely. |
|
*/ |
|
#ifdef PEGASUS_ENABLE_IPV6 |
|
static Boolean isIPv6StackActive(); |
|
#endif |
|
|
|
/** |
|
Returns all interface addresses. Both ip4 and ip6 interface addresses |
|
will be returned. |
|
*/ |
|
static Array<String> getInterfaceAddrs(); |
| |
static Uint32 lookupPort( | static Uint32 lookupPort( |
const char * serviceName, | const char * serviceName, |
|
|
| |
/** | /** |
Changes the process user context to the specified user and group. | Changes the process user context to the specified user and group. |
IMPORTANT: This method uses non-reentrant functions and should only |
IMPORTANT: This method is not reentrant and not async signal safe. |
be called in a single-threaded program. |
It should only be called in a single-threaded program. |
@param userName User name to set as the process user context. | @param userName User name to set as the process user context. |
@param uid User ID to set as the process user context. | @param uid User ID to set as the process user context. |
@param gid Group ID to set as the process group context. | @param gid Group ID to set as the process group context. |
|
|
static Boolean truncateFile(const char* path, size_t newSize); | static Boolean truncateFile(const char* path, size_t newSize); |
| |
/** Compare two strings but ignore any case differences. | /** Compare two strings but ignore any case differences. |
This method is provided only because some platforms lack a strcasecmp |
This method is provided only because some platforms lack a fast enough |
function in the standard library. |
strcasecmp function in the standard library. |
*/ | */ |
static Sint32 strcasecmp(const char* s1, const char* s2); | static Sint32 strcasecmp(const char* s1, const char* s2); |
| |
|
/** Compare two strings for equality but ignore any case differences. |
|
This method should only be used if length of both strings is |
|
known already. If not, please use System::strcasecmp() |
|
*/ |
|
static bool strncasecmp( |
|
const char* s1, |
|
size_t s1_l, |
|
const char* s2, |
|
size_t s2_l); |
|
|
/** Return just the file or directory name from the path into basename. | /** Return just the file or directory name from the path into basename. |
This method returns a file or directory name at the end of a path. | This method returns a file or directory name at the end of a path. |
The path can be relative or absolute. If the path is the root, | The path can be relative or absolute. If the path is the root, |
|
|
| |
static void closelog(); | static void closelog(); |
| |
|
/** Function to set hostname and thus override system supplied value */ |
|
static void setHostName(const String & hostName); |
|
|
|
/** Function to set fully qualified hostname and thus override system |
|
supplied value */ |
|
static void setFullyQualifiedHostName(const String & fullHostName); |
|
|
// System ID constants for Logger::put and Logger::trace | // System ID constants for Logger::put and Logger::trace |
static const String CIMSERVER; | static const String CIMSERVER; |
| |
// System ID constants for Logger::put and Logger::trace | // System ID constants for Logger::put and Logger::trace |
static const String CIMLISTENER; | static const String CIMLISTENER; |
| |
|
// mutex used for synchronising threads calling getHostName. |
|
static Mutex _mutexForGetHostName; |
|
|
|
// mutex used for synchronising threads calling getFullyQualifiedHostName |
|
static Mutex _mutexForGetFQHN; |
|
|
|
private: |
|
// Strings caching hostnames to avoid repeated resolver lookups and to |
|
// enable setting by configuration |
|
static String _hostname; |
|
static String _fullyQualifiedHostname; |
}; | }; |
| |
/** | /** |
|
|
struct flock _fl; | struct flock _fl; |
int _fd; | int _fd; |
#endif | #endif |
|
#ifdef PEGASUS_OS_TYPE_WINDOWS |
|
HANDLE _hFile; |
|
#endif |
}; | }; |
| |
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |