diff options
author | Jose <jose@zeroc.com> | 2016-05-26 18:36:47 +0200 |
---|---|---|
committer | Jose <jose@zeroc.com> | 2016-05-26 18:36:47 +0200 |
commit | 5a342be6df4370f047268db349c08a2521f484c8 (patch) | |
tree | 93997d7b368709a26b10a5355b101eb41e19865e /cpp/src | |
parent | Java build fixes to better support Debian packaging: (diff) | |
download | ice-5a342be6df4370f047268db349c08a2521f484c8.tar.bz2 ice-5a342be6df4370f047268db349c08a2521f484c8.tar.xz ice-5a342be6df4370f047268db349c08a2521f484c8.zip |
FreeBSD patches
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp | 38 | ||||
-rw-r--r-- | cpp/src/Ice/Network.cpp | 10 | ||||
-rw-r--r-- | cpp/src/IceUtil/Time.cpp | 4 |
3 files changed, 49 insertions, 3 deletions
diff --git a/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp b/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp index af9630db528..feb3d7a83ef 100644 --- a/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp +++ b/cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp @@ -17,6 +17,8 @@ #if defined(__GLIBC__) # include <crypt.h> +#elif defined(__FreeBSD__) +# include <unistd.h> #elif defined(__APPLE__) # include <CoreFoundation/CoreFoundation.h> # include <Security/Security.h> @@ -32,6 +34,34 @@ using namespace Glacier2; namespace { + +#if defined(__FreeBSD__) && !define(__GLIBC__) + +// +// FreeBSD crypt is no reentrat we use this global mutex +// to serialize access. +// +IceUtil::Mutex* _staticMutex = 0; + +class Init +{ +public: + + Init() + { + _staticMutex = new IceUtil::Mutex; + } + + ~Init() + { + delete _staticMutex; + _staticMutex = 0; + } +}; + +Init init; +#endif + class CryptPermissionsVerifierI : public PermissionsVerifier { @@ -140,7 +170,7 @@ CryptPermissionsVerifierI::checkPermissions(const string& userId, const string& { return false; } -#if defined(__GLIBC__) +#if defined(__GLIBC__) || defined(__FreeBSD__) size_t i = p->second.rfind('$'); string salt; if(i == string::npos) @@ -162,9 +192,15 @@ CryptPermissionsVerifierI::checkPermissions(const string& userId, const string& return false; } } +# if defined(__GLIBC__) + struct crypt_data data; data.initialized = 0; return p->second == crypt_r(password.c_str(), salt.c_str(), &data); +# else + IceUtilInternal::MutexPtrLock<IceUtil::Mutex> lock(_staticMutex); + return p->second == crypt(password.c_str(), salt.c_str()) +# endif #elif defined(__APPLE__) || defined(_WIN32) // // Pbkdf2 string format: diff --git a/cpp/src/Ice/Network.cpp b/cpp/src/Ice/Network.cpp index 56d3f0314f0..74188d50f42 100644 --- a/cpp/src/Ice/Network.cpp +++ b/cpp/src/Ice/Network.cpp @@ -1238,7 +1238,17 @@ IceInternal::closeSocket(SOCKET fd) WSASetLastError(error); #else int error = errno; + +# if defined(__FreeBSD__) + // + // FreeBSD returns ECONNRESET if the underlying object was + // a stream socket that was shut down by the peer before all + // pending data was delivered. + // + if(close(fd) == SOCKET_ERROR && getSocketErrno() != ECONNRESET) +# else if(close(fd) == SOCKET_ERROR) +# endif { SocketException ex(__FILE__, __LINE__); ex.error = getSocketErrno(); diff --git a/cpp/src/IceUtil/Time.cpp b/cpp/src/IceUtil/Time.cpp index 133ba62147d..88073886137 100644 --- a/cpp/src/IceUtil/Time.cpp +++ b/cpp/src/IceUtil/Time.cpp @@ -63,7 +63,7 @@ InitializeFrequency frequencyInitializer; } #endif -#if defined(__APPLE__) || defined(__FreeBSD__) +#if defined(__APPLE__) namespace { @@ -148,7 +148,7 @@ IceUtil::Time::now(Clock clock) throw SyscallException(__FILE__, __LINE__, errno); } return Time(tv.tv_sec * ICE_INT64(1000000) + tv.tv_usec); -#elif defined(__APPLE__) || defined(__FreeBSD__) +#elif defined(__APPLE__) return Time(mach_absolute_time() * machMultiplier); #else struct timespec ts; |