.hgignore                      |    1 +
 Makefile.am                    |   15 ++-
 README                         |    3 +-
 src/base/Makefile.am           |    1 -
 src/base/hash.cc               |  179 +++++++++++++++++++++++++++++++++++++++++
 src/base/hash.h                |   37 ++------
 src/base/tests/hash_test.cc    |    2 +
 src/log/Makefile.am            |    8 +-
 src/log/logd/lgs_main.cc       |    3 +
 src/log/tests/lgs_dest_test.cc |   27 ++++-
 10 files changed, 232 insertions(+), 44 deletions(-)


Ticket [#2266] introduced a dependency towards the openssl library. This causes
two problems: the first one is that this library is not part of LSB. The second
(and related) one is that OpenSAF binaries built on one Linux distribution may
fail to load on another Linux distribution, due to different names (versions) of
this library.

The solution uses dlopen() to open the library. If the library cannot be opened,
a simple fallback behaviour is used (the hash function returns all zeroes).

diff --git a/.hgignore b/.hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -67,6 +67,7 @@ syntax: regexp
 ^src/osaf/config\.h$
 ^src/osaf/config\.h\.in$
 ^src/osaf/configmake\.h$
+^src/osaf/ssl_libs\.cc$
 ^src/osaf/stamp-h1$
 ^src/plm/plmcd/plmcboot$
 ^src/plm/plmcd/plmcboot\.service$
diff --git a/Makefile.am b/Makefile.am
--- a/Makefile.am
+++ b/Makefile.am
@@ -42,7 +42,8 @@ CLEANFILES = \
        lib/$(PACKAGE_NAME)-$(host_cpu).conf \
        osafdir.conf \
        osafdir.conf-t \
-       src/osaf/configmake.h
+       src/osaf/configmake.h \
+       src/osaf/ssl_libs.cc
 
 CORE_INCLUDES = \
        -I$(top_builddir)/src -I$(top_srcdir)/src
@@ -126,7 +127,7 @@ nodist_pkgsysconf_DATA += \
 
 pkgconfig_DATA += pkgconfig/opensaf.pc
 
-BUILT_SOURCES += src/osaf/configmake.h osafdir.conf
+BUILT_SOURCES += src/osaf/configmake.h osafdir.conf src/osaf/ssl_libs.cc
 
 EXTRA_DIST += samples scripts/create_empty_library
 
@@ -247,6 +248,16 @@ osafdir.conf: src/osaf/configmake.h
        @sed -i 1i"#!/bin/sh" $@-t
        sed -e 's/\(.*\)/\L\1/' $@-t > $@
 
+src/osaf/ssl_libs.cc: Makefile
+       @rm -f $@-t $@
+       @{ echo "  \"$$(ldd $$(which openssl) | cut -d= -f1 | grep libcrypto.so 
| tr -d '\t ')\","; \
+       echo "  \"libcrypto.so\","; \
+       echo "  \"libcrypto.so.1.1.0\","; \
+       echo "  \"libcrypto.so.1.0.0\","; \
+       echo "  \"libcrypto.so.0.9.8\","; \
+       } | sort -r | uniq > $@-t
+       mv $@-t $@
+
 if ENABLE_RPM_TARGET
 
 RPMTOPDIR = `pwd`/rpms
diff --git a/README b/README
--- a/README
+++ b/README
@@ -425,7 +425,6 @@ The following software is required to bu
 
     * libc6-dev (2.11 or later)
     * libxml2-dev (2.7 or later)
-    * libssl-dev (0.9.8 or later)
     * automake (1.11.1 or later)
     * m4
     * autoconf (2.64 or later)
@@ -952,7 +951,7 @@ minimum version requirements of the foll
 - GNU C Library (Glibc), version 2.11 or later
 - GNU Compiler Collection (GCC), version 4.8.1 or later
 - Libxml2, version 2.7 or later
-- Libopenssl, version 0.9.8 or later
+- Libopenssl, version 0.9.8 or later (optional)
 - Libsqlite3, version 3.6 or later (only needed when configuring with
   --enable-imm-pbe)
 - OpenHPI, version 2.17.0 or later (only needed when configuring with
diff --git a/src/base/Makefile.am b/src/base/Makefile.am
--- a/src/base/Makefile.am
+++ b/src/base/Makefile.am
@@ -182,7 +182,6 @@ bin_libbase_test_CPPFLAGS = \
 
 bin_libbase_test_LDFLAGS = \
        $(AM_LDFLAGS) \
-       -lcrypto \
        src/base/lib_libopensaf_core_la-file_descriptor.lo \
        src/base/lib_libopensaf_core_la-file_notify.lo \
        src/base/lib_libopensaf_core_la-getenv.lo \
diff --git a/src/base/hash.cc b/src/base/hash.cc
--- a/src/base/hash.cc
+++ b/src/base/hash.cc
@@ -14,6 +14,154 @@
  */
 
 #include "base/hash.h"
+#include <dlfcn.h>
+#include <pthread.h>
+#include <cassert>
+#include <cstddef>
+#include <cstdint>
+#include <cstdio>
+#include <cstring>
+#include "base/logtrace.h"
+#include "base/osaf_utility.h"
+
+namespace {
+
+class HashLibrary {
+ public:
+  struct Context {
+    uint64_t data[26];
+    unsigned data2[2];
+  };
+
+  static void Initialize();
+
+  static HashLibrary* instance() {
+    return instance_;
+  }
+  int Init(Context* context) const {
+    return init_function_(context);
+  }
+  int Update(Context* context, const void* data, size_t size) const {
+    return update_function_(context, data, size);
+  }
+  int Final(unsigned char* result, Context* context) const {
+    return final_function_(result, context);
+  }
+
+ private:
+  using InitFunction = int (Context*);
+  using UpdateFunction = int (Context*, const void*, size_t);
+  using FinalFunction = int (unsigned char*, Context*);
+
+  HashLibrary();
+  ~HashLibrary();
+  static void* OpenLibrary();
+  static void* GetSymbol(void* handle, int bits, const char* function,
+                         void* fallback);
+  static int FallbackInitFunction(Context* context);
+  static int FallbackUpdateFunction(Context* context, const void* data,
+                                    size_t size);
+  static int FallbackFinalFunction(unsigned char* result, Context* context);
+  static void PthreadOnceInitRoutine();
+  void* handle_;
+  InitFunction* init_function_;
+  UpdateFunction* update_function_;
+  FinalFunction* final_function_;
+  static pthread_once_t once_control_;
+  static HashLibrary* instance_;
+};
+
+pthread_once_t HashLibrary::once_control_ = PTHREAD_ONCE_INIT;
+HashLibrary* HashLibrary::instance_ = nullptr;
+
+const char *const kSslLibs[] = {
+#include "osaf/ssl_libs.cc"
+};
+
+HashLibrary::HashLibrary() :
+    handle_{OpenLibrary()},
+    init_function_{
+      reinterpret_cast<InitFunction*>(
+          GetSymbol(handle_, 512, "Init",
+                    reinterpret_cast<void*>(FallbackInitFunction)))},
+    update_function_{
+      reinterpret_cast<UpdateFunction*>(
+          GetSymbol(handle_, 512, "Update",
+                    reinterpret_cast<void*>(FallbackUpdateFunction)))},
+    final_function_{
+      reinterpret_cast<FinalFunction*>(
+          GetSymbol(handle_, 512, "Final",
+                    reinterpret_cast<void*>(FallbackFinalFunction)))} {
+}
+
+HashLibrary::~HashLibrary() {
+  if (handle_ != nullptr) {
+    dlclose(handle_);
+    handle_ = nullptr;
+  }
+  init_function_ = nullptr;
+  update_function_ = nullptr;
+  final_function_ = nullptr;
+  instance_ = nullptr;
+}
+
+
+void* HashLibrary::OpenLibrary() {
+  void* handle = nullptr;
+  for (int i = 0;
+       handle == nullptr && i != sizeof(kSslLibs) / sizeof(kSslLibs[0]);
+       ++i) {
+    handle = dlopen(kSslLibs[i], RTLD_LAZY);
+  }
+  if (handle == nullptr) LOG_ER("Could not open ssl library");
+  return handle;
+}
+
+void* HashLibrary::GetSymbol(void* handle, int bits, const char* function,
+                             void* fallback) {
+  void* symbol = nullptr;
+  if (handle != nullptr) {
+    char buf[32];
+    int result = snprintf(buf, sizeof(buf), "SHA%d_%s", bits, function);
+    if (result >= 0 && static_cast<size_t>(result) < sizeof(buf)) {
+      symbol = dlsym(handle, buf);
+      if (symbol == nullptr) {
+        const char* error = dlerror();
+        if (error == nullptr) error = "";
+        LOG_ER("Could not find symbol %s: %s", buf, error);
+      }
+    } else {
+      LOG_ER("Symbol name too large");
+    }
+  }
+  return symbol != nullptr ? symbol : fallback;
+}
+
+int HashLibrary::FallbackInitFunction(Context*) {
+  return 1;
+}
+
+int HashLibrary::FallbackUpdateFunction(Context*, const void*, size_t) {
+  return 1;
+}
+
+int HashLibrary::FallbackFinalFunction(unsigned char* result, Context*) {
+  memset(result, 0, 64);
+  return 1;
+}
+
+void HashLibrary::Initialize() {
+  int result = pthread_once(&once_control_, PthreadOnceInitRoutine);
+  if (result != 0) osaf_abort(result);
+}
+
+void HashLibrary::PthreadOnceInitRoutine() {
+  assert(instance_ == nullptr);
+  instance_ = new HashLibrary();
+  if (instance_ == nullptr) osaf_abort(0);
+}
+
+}
 
 namespace base {
 
@@ -25,4 +173,35 @@ const char kHashFunctionAlphabet[64] = {
   '8', '9', '-', '_'
 };
 
+void InitializeHashFunction() {
+  HashLibrary::Initialize();
+}
+
+std::string Hash(const std::string& message) {
+  HashLibrary::Context context;
+  HashLibrary* lib = HashLibrary::instance();
+  lib->Init(&context);
+  context.data[0] += UINT64_C(0x96f78fac128be92b);
+  context.data[1] += UINT64_C(0x202b002c69f03634);
+  context.data[2] += UINT64_C(0x473aef07a340f237);
+  context.data[3] += UINT64_C(0x4746024456ec7df0);
+  context.data[4] += UINT64_C(0x209b3f0619762c29);
+  context.data[5] += UINT64_C(0x6569267c8fb4c21d);
+  context.data[6] += UINT64_C(0x4aa747ffd7996d81);
+  context.data[7] += UINT64_C(0xc8b19fc2c59a8106);
+  lib->Update(&context, message.data(), message.size());
+  unsigned char result[64];
+  lib->Final(result, &context);
+  std::string encoded;
+  encoded.reserve(32);
+  for (int i = 0; i != 24; i += 3) {
+    uint64_t a = (result[i] << 16) | (result[i + 1] << 8) | result[i + 2];
+    encoded.push_back(kHashFunctionAlphabet[a >> 18]);
+    encoded.push_back(kHashFunctionAlphabet[(a >> 12) & 63]);
+    encoded.push_back(kHashFunctionAlphabet[(a >> 6) & 63]);
+    encoded.push_back(kHashFunctionAlphabet[a & 63]);
+  }
+  return encoded;
+}
+
 }  // namespace base
diff --git a/src/base/hash.h b/src/base/hash.h
--- a/src/base/hash.h
+++ b/src/base/hash.h
@@ -16,14 +16,18 @@
 #ifndef BASE_HASH_H_
 #define BASE_HASH_H_
 
-#include <openssl/sha.h>
-#include <cstdint>
 #include <string>
 
 namespace base {
 
 extern const char kHashFunctionAlphabet[64];
 
+// Initialize the hash function. This must be done at least once before calling
+// the function Hash() below. It is safe to call this function multiple times,
+// since this function does nothing if the hash function has already been
+// initialized.
+void InitializeHashFunction();
+
 // This function takes an arbitrary string as input parameter and returns
 // another string which is a hash of the input string generated using a
 // collision-resistant hash function. The probability that two different inputs
@@ -35,32 +39,9 @@ extern const char kHashFunctionAlphabet[
 // the returned string is guaranteed to not contain any character that would be
 // illegal for use in a file name.
 //
-// Note: if you use this function you need to link your program with -lcrypto
-inline std::string Hash(const std::string& message) {
-  SHA512_CTX context;
-  SHA512_Init(&context);
-  context.h[0] = UINT64_C(0x010176140648b233);
-  context.h[1] = UINT64_C(0xdb92aeb1eebadd6f);
-  context.h[2] = UINT64_C(0x83a9e27aa1d5ea62);
-  context.h[3] = UINT64_C(0xec95f77eb609b4e1);
-  context.h[4] = UINT64_C(0x71a99185c75caefa);
-  context.h[5] = UINT64_C(0x006e8f08baf32e3c);
-  context.h[6] = UINT64_C(0x6a2b21abd2db2aec);
-  context.h[7] = UINT64_C(0x24926cdbd918a27f);
-  SHA512_Update(&context, message.data(), message.size());
-  unsigned char result[SHA512_DIGEST_LENGTH];
-  SHA512_Final(result, &context);
-  std::string encoded;
-  encoded.reserve(32);
-  for (int i = 0; i != 24; i += 3) {
-    uint64_t a = (result[i] << 16) | (result[i + 1] << 8) | result[i + 2];
-    encoded.push_back(kHashFunctionAlphabet[a >> 18]);
-    encoded.push_back(kHashFunctionAlphabet[(a >> 12) & 63]);
-    encoded.push_back(kHashFunctionAlphabet[(a >> 6) & 63]);
-    encoded.push_back(kHashFunctionAlphabet[a & 63]);
-  }
-  return encoded;
-}
+// NOTE: You must have called InitializeHashFunction() at least once before
+//       calling this function.
+std::string Hash(const std::string& message);
 
 }  // namespace base
 
diff --git a/src/base/tests/hash_test.cc b/src/base/tests/hash_test.cc
--- a/src/base/tests/hash_test.cc
+++ b/src/base/tests/hash_test.cc
@@ -82,6 +82,7 @@ static const TestVector test_vectors[] =
 };
 
 TEST(BaseHash, TestVectors) {
+  base::InitializeHashFunction();
   for (size_t i = 0; i < sizeof(test_vectors) / sizeof(test_vectors[0]); ++i) {
     std::string key = std::string(test_vectors[i].key_data,
                                   test_vectors[i].key_size);
@@ -92,6 +93,7 @@ TEST(BaseHash, TestVectors) {
 }
 
 TEST(BaseHash, LongRandomString) {
+  base::InitializeHashFunction();
   std::string key;
   key.reserve(8000);
   std::mt19937_64 generator(4711);
diff --git a/src/log/Makefile.am b/src/log/Makefile.am
--- a/src/log/Makefile.am
+++ b/src/log/Makefile.am
@@ -141,7 +141,6 @@ bin_osaflogd_SOURCES = \
        src/log/logd/lgs_unixsock_dest.cc
 
 bin_osaflogd_LDADD = \
-       -lcrypto \
        lib/libosaf_common.la \
        lib/libSaAmf.la \
        lib/libSaImmOm.la \
@@ -232,6 +231,8 @@ bin_logtestfr_LDADD = \
        lib/libSaImmOm.la \
        lib/libopensaf_core.la
 
+endif
+
 bin_testlogd_CXXFLAGS =$(AM_CXXFLAGS)
 
 bin_testlogd_CPPFLAGS = \
@@ -240,8 +241,7 @@ bin_testlogd_CPPFLAGS = \
        -I$(GTEST_DIR)/include
 
 bin_testlogd_LDFLAGS = \
-       $(AM_LDFLAGS) \
-       -lcrypto
+       $(AM_LDFLAGS)
 
 
 bin_testlogd_SOURCES = \
@@ -255,5 +255,3 @@ bin_testlogd_LDADD = \
        src/log/logd/bin_osaflogd-lgs_unixsock_dest.o \
        src/log/logd/bin_osaflogd-lgs_dest.o \
        src/log/logd/bin_osaflogd-lgs_nildest.o
-
-endif
diff --git a/src/log/logd/lgs_main.cc b/src/log/logd/lgs_main.cc
--- a/src/log/logd/lgs_main.cc
+++ b/src/log/logd/lgs_main.cc
@@ -37,6 +37,7 @@
 #include "log/logd/lgs.h"
 #include "log/logd/lgs_file.h"
 #include "base/osaf_utility.h"
+#include "base/hash.h"
 #include "lgs_recov.h"
 #include "osaf/immutil/immutil.h"
 #include "lgs_clm.h"
@@ -275,6 +276,8 @@ static uint32_t log_initialize(void) {
 
   TRACE_ENTER();
 
+  base::InitializeHashFunction();
+
   /**
    * Setup immutils profile once and for all.
    * This profile says immutil_ API will be blocked
diff --git a/src/log/tests/lgs_dest_test.cc b/src/log/tests/lgs_dest_test.cc
--- a/src/log/tests/lgs_dest_test.cc
+++ b/src/log/tests/lgs_dest_test.cc
@@ -15,15 +15,13 @@
  *
  */
 
-#define protected public
-#define private public
-
 #include "log/logd/lgs_dest.h"
 #include "log/logd/lgs_unixsock_dest.h"
 #include "log/logd/lgs_config.h"
 #include <string>
 #include <vector>
 #include "base/unix_server_socket.h"
+#include "base/hash.h"
 #include "gtest/gtest.h"
 
 
//==============================================================================
@@ -76,12 +74,14 @@ bool isValidName(const std::string& name
 
//==============================================================================
 // Verify it is OK to add one valid destination configuration
 TEST(CfgDestination, AddOneDestination) {
+  base::InitializeHashFunction();
   const std::vector<std::string> vdest {"test;UNIX_SOCKET;/tmp/sock.sock"};
   ASSERT_EQ(CfgDestination(vdest, ModifyType::kAdd), true);
 }
 
 // Verify it is Ok to add multiple destination configurations
 TEST(CfgDestination, AddMultipleDestination) {
+  base::InitializeHashFunction();
   const std::vector<std::string> vdest {
     "test;UNIX_SOCKET;/tmp/sock.sock",
     "test1;UNIX_SOCKET;/tmp/sock1.sock",
@@ -92,6 +92,7 @@ TEST(CfgDestination, AddMultipleDestinat
 
 // Verify it is Ok to add NIL destination
 TEST(CfgDestination, AddEmptyDestination) {
+  base::InitializeHashFunction();
   const std::vector<std::string> vdest {
     "test;UNIX_SOCKET;/tmp/sock.sock",
     "test1;UNIX_SOCKET;/tmp/sock1.sock",
@@ -102,6 +103,7 @@ TEST(CfgDestination, AddEmptyDestination
 
 // Verify it is OK to delete one destination configuration
 TEST(CfgDestination, DelOneDestination) {
+  base::InitializeHashFunction();
   const std::vector<std::string> vdest {
     "test;UNIX_SOCKET;/tmp/sock.sock",
     "test1;UNIX_SOCKET;/tmp/sock1.sock",
@@ -115,6 +117,7 @@ TEST(CfgDestination, DelOneDestination) 
 
 // Verify it is OK to delete all destinations
 TEST(CfgDestination, DelAllDestinations) {
+  base::InitializeHashFunction();
   const std::vector<std::string> vdest {
     "test;UNIX_SOCKET;/tmp/sock.sock",
     "test1;UNIX_SOCKET;/tmp/sock1.sock",
@@ -129,6 +132,7 @@ TEST(CfgDestination, DelAllDestinations)
 // Verify the request is drop if the delete request
 // come before adding a destination configuation.
 TEST(CfgDestination, DelDestButNoCfgSentYet) {
+  base::InitializeHashFunction();
   // Delete all destination configurations
   const std::vector<std::string> vdest {};
   CfgDestination(vdest, ModifyType::kDelete);
@@ -140,6 +144,7 @@ TEST(CfgDestination, DelDestButNoCfgSent
 
 // Verify the request is drop if deleting non-exist destination configuration.
 TEST(CfgDestination, DelNonExistDestination) {
+  base::InitializeHashFunction();
   const std::vector<std::string> vdest {
     "test;UNIX_SOCKET;/tmp/sock.sock",
     "test1;UNIX_SOCKET;/tmp/sock1.sock",
@@ -176,6 +181,7 @@ void initData(RecordData* data) {
 // No destination name & no destination configuration exist
 // Verify the sending log record request is drop.
 TEST(WriteToDestination, NoDestNameAndNonExistDest) {
+  base::InitializeHashFunction();
   RecordData data;
   // No destination configured at all.
   const std::vector<std::string> vdeldest5 {};
@@ -190,6 +196,7 @@ TEST(WriteToDestination, NoDestNameAndNo
 // Have destination name set, but no destination configuration exist.
 // Verify the sending record request is drop.
 TEST(WriteToDestination, HaveDestNameButNonExistDest) {
+  base::InitializeHashFunction();
   RecordData data;
   // No destination configured at all
   const std::vector<std::string> vdeldest6 {};
@@ -204,6 +211,7 @@ TEST(WriteToDestination, HaveDestNameBut
 // Verify the sending record to destination is drop
 // if having NIL destination with such destination name.
 TEST(WriteToDestination, HaveDestNameButNilDest) {
+  base::InitializeHashFunction();
   RecordData data;
   // Have nil destination
   const std::vector<std::string> nildest {"test;UNIX_SOCKET;"};
@@ -230,6 +238,7 @@ void FormRfc5424Test(const DestinationHa
 // Send a record @rec, then verify if receiving data
 // and sent data is matched.
 TEST(WriteToDestination, HaveDestNameAndDestCfg) {
+  base::InitializeHashFunction();
   char buf[1024] = {0};
   RecordData data;
   DestinationHandler::RecordInfo info{};
@@ -239,7 +248,7 @@ TEST(WriteToDestination, HaveDestNameAnd
 
   // Create the server listen to the local socket
   static base::UnixServerSocket server{"/tmp/test.sock"};
-  server.Open();
+  server.fd();
 
   const std::vector<std::string> dest {"test;UNIX_SOCKET;/tmp/test.sock"};
   CfgDestination(dest, ModifyType::kReplace);
@@ -281,6 +290,7 @@ TEST(WriteToDestination, HaveDestNameAnd
 
 // Verify the destination connection status is reflected correctly.
 TEST(GetDestinationStatus, AddOneDestination) {
+  base::InitializeHashFunction();
   const VectorString vstatus {"test,FAILED"};
   const std::vector<std::string> vdest {"test;UNIX_SOCKET;/tmp/sock.sock"};
   CfgDestination(vdest, ModifyType::kReplace);
@@ -290,6 +300,7 @@ TEST(GetDestinationStatus, AddOneDestina
 // Verify the destination connection status is reflected correctly
 // in case of adding multiple destinations
 TEST(GetDestinationStatus, AddMultipleDestination) {
+  base::InitializeHashFunction();
   const VectorString vstatus {
     "test,FAILED",
     "test1,FAILED",
@@ -308,6 +319,7 @@ TEST(GetDestinationStatus, AddMultipleDe
 // Verify the destination connection status is reflected correctly
 // in case of adding multiple destinations including NILDEST type.
 TEST(GetDestinationStatus, AddMultipleDestinationWithNilDest) {
+  base::InitializeHashFunction();
   // Expected destination status
   const VectorString vstatus {
     "test,FAILED",
@@ -323,6 +335,7 @@ TEST(GetDestinationStatus, AddMultipleDe
 }
 
 TEST(GetDestinationStatus, AddMultipleDestinationWithNilDest02) {
+  base::InitializeHashFunction();
   // Expected destination status
   const VectorString vstatus {
     "test,FAILED",
@@ -343,6 +356,7 @@ TEST(GetDestinationStatus, AddMultipleDe
 // in case of adding multiple destinations including NILDEST type.
 // and have destination receiver.
 TEST(GetDestinationStatus, AddMultipleDestinationWithDestReceiver) {
+  base::InitializeHashFunction();
   // Expected destination status
   const VectorString vstatus {
     "test,CONNECTED",
@@ -357,7 +371,7 @@ TEST(GetDestinationStatus, AddMultipleDe
 
   // Create the server listen to the local socket
   static base::UnixServerSocket server{"/tmp/test.sock"};
-  server.Open();
+  server.fd();
   CfgDestination(vdest, ModifyType::kReplace);
 
   ASSERT_EQ(GetDestinationStatus(), vstatus);
@@ -368,6 +382,7 @@ TEST(GetDestinationStatus, AddMultipleDe
 // multiple destinations including NILDEST type.
 // and have destination receiver.
 TEST(GetDestinationStatus, RemoveDestFromMultipleDestinationWithDestReceiver) {
+  base::InitializeHashFunction();
   // Expected destination status
   const VectorString vstatus {
     "test,CONNECTED",
@@ -381,7 +396,7 @@ TEST(GetDestinationStatus, RemoveDestFro
 
   // Create the server listen to the local socket
   static base::UnixServerSocket server{"/tmp/test.sock"};
-  server.Open();
+  server.fd();
 
   // Add destination configurations, then delete one.
   CfgDestination(vdest, ModifyType::kReplace);

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to