summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2016-05-26 18:36:47 +0200
committerJose <jose@zeroc.com>2016-05-26 18:36:47 +0200
commit5a342be6df4370f047268db349c08a2521f484c8 (patch)
tree93997d7b368709a26b10a5355b101eb41e19865e /cpp/src
parentJava build fixes to better support Debian packaging: (diff)
downloadice-5a342be6df4370f047268db349c08a2521f484c8.tar.bz2
ice-5a342be6df4370f047268db349c08a2521f484c8.tar.xz
ice-5a342be6df4370f047268db349c08a2521f484c8.zip
FreeBSD patches
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/Glacier2CryptPermissionsVerifier/CryptPermissionsVerifierI.cpp38
-rw-r--r--cpp/src/Ice/Network.cpp10
-rw-r--r--cpp/src/IceUtil/Time.cpp4
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;