diff --git a/daemon/src/history/history.cpp b/daemon/src/history/history.cpp
index d1590345ba86eaaa6c9fbd33cdde8ff6e819d032..1f9f8c1e86de8ec7ecfacb6b2d629badd57649e2 100644
--- a/daemon/src/history/history.cpp
+++ b/daemon/src/history/history.cpp
@@ -105,7 +105,8 @@ void History::ensurePath()
         if (mkdir(userdata.data(), 0755) != 0) {
             // If directory	creation failed
             if (errno != EEXIST) {
-                DEBUG("Cannot create directory: %s!: %s", userdata.c_str(), strerror(errno));
+                DEBUG("Cannot create directory: %s", userdata.c_str());
+                Logger::strErr();
                 return;
             }
         }
diff --git a/daemon/src/logger.cpp b/daemon/src/logger.cpp
index 7ba7e5453ff8d34046e2c8237ae1353281be6e2b..9a421c9a9916d3df955f947d62a24970082cbd5a 100644
--- a/daemon/src/logger.cpp
+++ b/daemon/src/logger.cpp
@@ -85,4 +85,27 @@ bool getDebugMode()
 {
     return debugMode;
 }
+
+void strErr()
+{
+#ifdef __GLIBC__
+    ERROR("%m");
+#else
+    char buf[1000];
+    const char *msg;
+
+    switch (strerror_r(error, buf, sizeof(buf))) {
+        case 0:
+            msg = buf;
+            break;
+        case ERANGE: /* should never happen */
+            msg = "unknown (too big to display)";
+            break;
+        default:
+            msg = "unknown (invalid error number)";
+            break;
+    }
+    ERROR("%s", msg);
+#endif
+}
 }
diff --git a/daemon/src/logger.h b/daemon/src/logger.h
index 5321666241df6cd664b73d246bde351cf37dc68c..54ffab9f6e11807644924ee979b7bf37bf83dbc3 100644
--- a/daemon/src/logger.h
+++ b/daemon/src/logger.h
@@ -45,6 +45,7 @@ void log(const int, const char*, ...);
 void setConsoleLog(bool);
 void setDebugMode(bool);
 bool getDebugMode();
+void strErr();
 };
 
 #define LOG_FORMAT(M, ...) "%s:%d:0x%x: " M, FILE_NAME, __LINE__, (unsigned long) pthread_self() & 0xffff, ##__VA_ARGS__
diff --git a/daemon/src/video/shm_sink.cpp b/daemon/src/video/shm_sink.cpp
index 2fbb7f28c52c83eec7e1e71742c9a5d7de61108b..7d6fa72afc8a621a67ef741e85750096b658d26c 100644
--- a/daemon/src/video/shm_sink.cpp
+++ b/daemon/src/video/shm_sink.cpp
@@ -79,8 +79,8 @@ bool SHMSink::start()
     if (not shm_name_.empty()) {
         fd_ = shm_open(shm_name_.c_str(), flags, perms);
         if (fd_ < 0) {
-            ERROR("could not open shm area \"%s\", shm_open failed:%s", shm_name_.c_str(), strerror(errno));
-            perror(strerror(errno));
+            ERROR("could not open shm area \"%s\"", shm_name_.c_str());
+            Logger::strErr();
             return false;
         }
     } else {
@@ -90,7 +90,7 @@ bool SHMSink::start()
             shm_name_ = name.str();
             fd_ = shm_open(shm_name_.c_str(), flags, perms);
             if (fd_ < 0 and errno != EEXIST) {
-                ERROR("%s", strerror(errno));
+                Logger::strErr();
                 return false;
             }
         }
@@ -103,7 +103,7 @@ bool SHMSink::start()
 
     if (ftruncate(fd_, shm_area_len_)) {
         ERROR("Could not make shm area large enough for header");
-        perror(strerror(errno));
+        Logger::strErr();
         return false;
     }
 
@@ -128,8 +128,9 @@ bool SHMSink::start()
 
 bool SHMSink::stop()
 {
-    if (fd_ >= 0)
-        close(fd_);
+    if (fd_ >= 0 and close(fd_) == -1)
+        Logger::strErr();
+
     fd_ = -1;
 
     if (not opened_name_.empty()) {
@@ -154,13 +155,13 @@ bool SHMSink::resize_area(size_t desired_length)
 
     if (munmap(shm_area_, shm_area_len_)) {
         ERROR("Could not unmap shared area");
-        perror(strerror(errno));
+        Logger::strErr();
         return false;
     }
 
     if (ftruncate(fd_, desired_length)) {
         ERROR("Could not resize shared area");
-        perror(strerror(errno));
+        Logger::strErr();
         return false;
     }
 
diff --git a/daemon/src/video/socket_pair.cpp b/daemon/src/video/socket_pair.cpp
index 37bdf2748d0c8532ff8a367b62680b0532699f49..d91cac80aae3fc51c101da65c60981dfd0eebde1 100644
--- a/daemon/src/video/socket_pair.cpp
+++ b/daemon/src/video/socket_pair.cpp
@@ -116,7 +116,8 @@ int udp_socket_create(sockaddr_storage *addr, socklen_t *addr_len,
     // bind socket so that we send from and receive
     // on local port
     if (bind(udp_fd, reinterpret_cast<sockaddr*>(addr), *addr_len) < 0) {
-        ERROR("Bind failed: %s", strerror(errno));
+        ERROR("Bind failed");
+        Logger::strErr();
         close(udp_fd);
         udp_fd = -1;
     }
@@ -160,9 +161,9 @@ void SocketPair::interrupt()
 void SocketPair::closeSockets()
 {
     if (rtcpHandle_ > 0 and close(rtcpHandle_))
-        ERROR("%s", strerror(errno));
+        Logger::strErr();
     if (rtpHandle_ > 0 and close(rtpHandle_))
-        ERROR("%s", strerror(errno));
+        Logger::strErr();
 }
 
 void SocketPair::openSockets(const char *uri, int local_rtp_port)