+inline bool RemoveLock(const char *strDeviceName)
+{
+ #if !defined(__APPLE__) && !defined(__FreeBSD__) && defined(HAVE_LOCKDEV)
+ return dev_unlock(strDeviceName, 0) == 0;
+ #else
+ (void)strDeviceName; // silence unused warning
+ return true;
+ #endif
+}
+
+void CSerialSocket::Close(void)
+{
+ if (IsOpen())
+ {
+ SocketClose(m_socket);
+ RemoveLock(m_strName.c_str());
+ }
+}
+
+void CSerialSocket::Shutdown(void)
+{
+ if (IsOpen())
+ {
+ SocketClose(m_socket);
+ RemoveLock(m_strName.c_str());
+ }
+}
+
+ssize_t CSerialSocket::Write(void* data, size_t len)
+{
+ return IsOpen() ? SocketWrite(m_socket, &m_iError, data, len) : -1;
+}
+
+ssize_t CSerialSocket::Read(void* data, size_t len, uint64_t iTimeoutMs /* = 0 */)