version 1.52, 2005/03/08 02:54:34
|
version 1.75, 2007/09/07 20:08:37
|
|
|
//%2005//////////////////////////////////////////////////////////////////////// |
//%2006//////////////////////////////////////////////////////////////////////// |
// | // |
// Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development | // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development |
// Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. | // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. |
|
|
// IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. | // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. |
// Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; | // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
// EMC Corporation; VERITAS Software Corporation; The Open Group. | // EMC Corporation; VERITAS Software Corporation; The Open Group. |
|
// Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.; |
|
// EMC Corporation; Symantec Corporation; The Open Group. |
// | // |
// Permission is hereby granted, free of charge, to any person obtaining a copy | // Permission is hereby granted, free of charge, to any person obtaining a copy |
// of this software and associated documentation files (the "Software"), to | // of this software and associated documentation files (the "Software"), to |
|
|
// | // |
//============================================================================== | //============================================================================== |
// | // |
// Author: Mike Brasher (mbrasher@bmc.com) |
|
// |
|
// Modified By: |
|
// Nag Boranna, Hewlett-Packard Company (nagaraja_boranna@hp.com) |
|
// |
|
// Modified By: Dave Rosckes (rosckes@us.ibm.com) |
|
// Robert Kieninger, IBM (kieningr@de.ibm.com) for Bug#667 |
|
// David Dillard, VERITAS Software Corp. |
|
// (david.dillard@veritas.com) |
|
// Sean Keenan, Hewlett-Packard Company (sean.keenan@hp.com) |
|
// |
|
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
| |
#ifndef Pegasus_System_h | #ifndef Pegasus_System_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) |
|
# include <unistd.h> |
|
# include <fcntl.h> // File locking |
|
# 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 | // Protocal Type |
|
|
| |
PEGASUS_NAMESPACE_BEGIN | PEGASUS_NAMESPACE_BEGIN |
| |
|
|
#if defined(PEGASUS_OS_VMS) |
|
// |
|
// Needed to save filename. We do NOT use dlopen and dlsym. |
|
// VMS implementation uses OS specific code for these functions. |
|
// |
|
static String saveFileName; |
|
#endif |
|
|
|
/** This is an opaque type which is used to represent dynamic library |
|
handles returned by the System::loadDynamicLibrary() method and |
|
accepted by the System::loadDynamicProcedure() method. |
|
*/ |
|
typedef struct DynamicLibraryHandle_* DynamicLibraryHandle; |
|
|
|
/** This is an opaque type which is returned by System::loadDynamicSymbol(). |
|
Values of this type may be casted to the appropriate target type. |
|
*/ |
|
#if !defined(PEGASUS_PLATFORM_ZOS_ZSERIES_IBM) && !defined(PEGASUS_PLATFORM_OS400_ISERIES_IBM) && !defined(PEGASUS_PLATFORM_AIX_RS_IBMCXX) |
|
typedef struct DynamicSymbolHandle_* DynamicSymbolHandle; |
|
#else |
|
extern "C" {typedef int (* DynamicSymbolHandle)(void);} |
|
#endif |
|
|
|
|
|
|
|
/** The System class defines wrappers for operating system related calls. | /** The System class defines wrappers for operating system related calls. |
These are only placed here if they are extremely light. These are | These are only placed here if they are extremely light. These are |
usually just direct wrappers which map more or less one to one to the | usually just direct wrappers which map more or less one to one to the |
|
|
*/ | */ |
static void getCurrentTime(Uint32& seconds, Uint32& milliseconds); | static void getCurrentTime(Uint32& seconds, Uint32& milliseconds); |
| |
|
/** Similar to getCurrentTime() above but get microseconds (rather than |
|
milliseconds). |
|
*/ |
|
static void getCurrentTimeUsec(Uint32& seconds, Uint32& microseconds); |
|
|
/** 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 copyFile(const char* fromPath, const char* toPath); | static Boolean copyFile(const char* fromPath, const char* toPath); |
| |
/** Unix issue:<br><br><b>RTLD_<bah></b> issue. Currently Pegasus uses RTLD_NOW during |
|
loading of the library if supported by OS. Previous to 2.2, Pegasus used RTLD_GLOBAL on Linux |
|
- that behaviour is now deprecated. |
|
*/ |
|
static DynamicLibraryHandle loadDynamicLibrary(const char* fileName); |
|
|
|
static void unloadDynamicLibrary(DynamicLibraryHandle libraryHandle); |
|
|
|
static String dynamicLoadError(void); |
|
|
|
static DynamicSymbolHandle loadDynamicSymbol( |
|
DynamicLibraryHandle libraryHandle, |
|
const char* symbolName); |
|
|
|
#if defined(PEGASUS_OS_VMS) |
|
static DynamicSymbolHandle loadVmsDynamicSymbol( |
|
const char* symbolName, |
|
const char* fileName, |
|
const char *vmsProviderDir); |
|
#endif |
|
|
|
static String getHostName(); | static String getHostName(); |
static String getFullyQualifiedHostName (); | static String getFullyQualifiedHostName (); |
static String getSystemCreationClassName (); | static String getSystemCreationClassName (); |
static String getHostIP(const String &hostName); |
|
| |
static Uint32 _acquireIP(const char* hostname); |
// Gets IP address assosiated with hostName. af indicates the |
|
// type of address (ipv4 or ipv6) returned. |
|
static Boolean getHostIP(const String &hostName, int *af, String &hostIP); |
|
|
|
// Gets IP address in binary form. af indicates the type of |
|
// address (ipv4 or ipv6) returned. Address will be copied to 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 |
| |
static Uint32 lookupPort( | static Uint32 lookupPort( |
const char * serviceName, | const char * serviceName, |
Uint32 defaultPort); | Uint32 defaultPort); |
| |
|
/** |
|
Attempts to find the given IP address(32bit) on any of the local defined |
|
network interfaces |
|
*/ |
|
static Boolean isIpOnNetworkInterface(Uint32 inIP); |
|
|
|
/** |
|
Attempts to resolve a given hostname |
|
this function possibly can take some as it can request information |
|
from the DNS |
|
|
|
@param resolvedNameIP On successful hostname resolution, this output |
|
parameter contains the IP address that was determined. |
|
@return true if successful, false if not successful. |
|
*/ |
|
static Boolean resolveHostNameAtDNS( |
|
const char* hostname, |
|
Uint32* resolvedNameIP); |
|
|
|
/** |
|
Attempts to resolve a given IP address |
|
this function possibly can take some as it can request information |
|
from the DNS |
|
@param resolvedIP On successful hostname resolution, this output |
|
parameter contains the IP address that was determined. |
|
@return true if successful, false if not successful. |
|
*/ |
|
static Boolean resolveIPAtDNS(Uint32 ip_addr, Uint32 * resolvedIP); |
|
|
|
/** |
|
Bundling function used to determine if a given hostname or IP address |
|
belongs to the local host |
|
this function has the potential to take some time as it will possibly |
|
use the DNS |
|
*/ |
|
static Boolean isLocalHost(const String& hostName); |
|
|
|
/** |
|
Checks binIPAddress represented by address family and returns true |
|
if binary representation matches with loopback ip address. binIPAddress |
|
must be in host-byte order. |
|
*/ |
|
static Boolean isLoopBack(int af, void *binIPAddress); |
|
|
static String getEffectiveUserName(); | static String getEffectiveUserName(); |
| |
/** | /** |
|
|
| |
/** | /** |
This function is used to encrypt the user's password. | This function is used to encrypt the user's password. |
The encryption is compatible with Apache's password file (generated using |
The encryption is compatible with Apache's password file (generated |
the htpasswd command ) |
using the htpasswd command) |
| |
@param password Password to be encrypted. | @param password Password to be encrypted. |
@param salt Two character string chosen from the set [a-zA-Z0-9./]. | @param salt Two character string chosen from the set [a-zA-Z0-9./]. |
|
|
| |
/** | /** |
This function returns the privileged user name on the system. | This function returns the privileged user name on the system. |
|
|
@return the privileged user name | @return the privileged user name |
*/ | */ |
static String getPrivilegedUserName(); | static String getPrivilegedUserName(); |
|
|
of the specified user group. | of the specified user group. |
| |
@param userName User name to be verified. | @param userName User name to be verified. |
|
|
@param groupName User group name. | @param groupName User group name. |
| |
@return true if the user is a member of the user group, |
@return true if the user is a member of the user group, false otherwise. |
false otherwise. |
@throw InternalSystemError - If there is an error accessing the |
|
specified user or group information. |
@throw InternalSystemError - If there is an error |
|
accessing the specified user or group information. |
|
*/ | */ |
static Boolean isGroupMember(const char* userName, const char* groupName); | static Boolean isGroupMember(const char* userName, const char* groupName); |
| |
/** | /** |
Changes the process user context to the specified user. |
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. |
|
*/ |
|
static Boolean lookupUserId( |
|
const char* userName, |
|
PEGASUS_UID_T& uid, |
|
PEGASUS_GID_T& gid); |
| |
|
/** |
|
Changes the process user context to the specified user and group. |
|
IMPORTANT: This method uses non-reentrant functions and 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 gid Group ID to set as the process group context. |
@return True if the user context is successfully changed, | @return True if the user context is successfully changed, |
false otherwise. | false otherwise. |
*/ | */ |
#ifndef PEGASUS_OS_OS400 |
static Boolean changeUserContext_SingleThreaded( |
static Boolean changeUserContext(const char* userName); |
const char* userName, |
#endif |
const PEGASUS_UID_T& uid, |
|
const PEGASUS_GID_T& gid); |
|
|
/** | /** |
This function is used to get the process ID of the calling process. | This function is used to get the process ID of the calling process. |
|
|
@return Process ID | @return Process ID |
*/ | */ |
static Uint32 getPID(); | static Uint32 getPID(); |
|
|
*/ | */ |
static Boolean changeFilePermissions(const char* path, mode_t mode); | static Boolean changeFilePermissions(const char* path, mode_t mode); |
| |
/** Checks whether the specified file is owned by the effective user for |
/** Checks whether the specified file is a regular file owned by the |
the current process. |
effective user for the current process. |
@param path Path of the file to check. | @param path Path of the file to check. |
@return True if the file is owned by the effective user for the | @return True if the file is owned by the effective user for the |
current process, false otherwise. | current process, false otherwise. |
|
|
*/ | */ |
static Boolean bindVerbose; | static Boolean bindVerbose; |
| |
/** This function is an abstraction for the openlog interface used in the Logger |
/** |
class. Each platform intending to use system logs should support this interface |
Writes a message to the system log. This method encapsulates the |
*/ |
semantics of opening the system log, writing the specified message, |
static void openlog(const String &); |
and closing the log. |
|
|
/** This function is an abstraction for the syslog interface used in the Logger |
@param ident An identifier to be prepended to the log messages |
class. Each platform intending to use system logs should support this interface |
(typically a program name). |
*/ |
@param severity A severity value to be associated with the message. |
static void syslog(Uint32, const char *); |
Severity values are defined in Logger.h. |
|
@param message A message to be written to the system log. |
|
*/ |
|
static void syslog( |
|
const String& ident, |
|
Uint32 severity, |
|
const char* message); |
|
|
|
static void openlog( |
|
const char *ident, |
|
int logopt, |
|
int facility); |
| |
/** This function is an abstraction for the closelog interface used in the Logger |
|
class. Each platform intending to use system logs should support this interface |
|
*/ |
|
static void closelog(); | static void closelog(); |
| |
// System ID constants for Logger::put and Logger::trace | // System ID constants for Logger::put and Logger::trace |
|
|
| |
}; | }; |
| |
|
/** |
|
The AutoFileLock class uses an advisory file lock to allow access to a |
|
resource to be controlled. |
|
*/ |
|
class PEGASUS_COMMON_LINKAGE AutoFileLock |
|
{ |
|
public: |
|
|
|
AutoFileLock(const char* fileName); |
|
~AutoFileLock(); |
|
|
|
private: |
|
|
|
AutoFileLock(); |
|
AutoFileLock(const AutoFileLock&); |
|
AutoFileLock& operator=(const AutoFileLock&); |
|
|
|
#ifdef PEGASUS_OS_TYPE_UNIX |
|
struct flock _fl; |
|
int _fd; |
|
#endif |
|
#ifdef PEGASUS_OS_TYPE_WINDOWS |
|
HANDLE _hFile; |
|
#endif |
|
}; |
|
|
PEGASUS_NAMESPACE_END | PEGASUS_NAMESPACE_END |
| |
#endif /* Pegasus_System_h */ | #endif /* Pegasus_System_h */ |