Make socket connection function available
authorKrzysztof Jackiewicz <k.jackiewicz@samsung.com>
Mon, 25 Aug 2014 08:06:47 +0000 (10:06 +0200)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Fri, 12 Sep 2014 12:59:28 +0000 (14:59 +0200)
Socket connection logic is necessary for asynchronous interface but wrapping
sockets in SockRAII class is unwanted, therefore the connection function has
been extracted from SockRAII and made available for other components.

Change-Id: I9a65df3bb99687156f6d1d3d11bc8a701eb962b2

src/manager/client/client-common.cpp
src/manager/client/client-common.h

index 1679923..a05f7e3 100644 (file)
@@ -67,93 +67,104 @@ int waitForSocket(int sock, int event, int timeout) {
     return retval;
 }
 
-class SockRAII {
-public:
-    SockRAII()
-      : m_sock(-1)
-    {}
+} // namespace anonymous
 
-    virtual ~SockRAII() {
-        if (m_sock > -1)
-            close(m_sock);
+namespace CKM {
+
+
+int connectSocket(int& sock, char const * const interface) {
+    sockaddr_un clientAddr;
+    int flags;
+
+    if (sock != -1) // guard
+        close(sock);
+
+    sock = socket(AF_UNIX, SOCK_STREAM, 0);
+    if (sock < 0) {
+        int err = errno;
+        LogError("Error creating socket: " << strerror(err));
+        return CKM_API_ERROR_SOCKET;
     }
 
-    int Connect(char const * const interface) {
-        sockaddr_un clientAddr;
-        int flags;
+    if ((flags = fcntl(sock, F_GETFL, 0)) < 0 ||
+        fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0)
+    {
+        int err = errno;
+        LogError("Error in fcntl: " << strerror(err));
+        return CKM_API_ERROR_SOCKET;
+    }
 
-        if (m_sock != -1) // guard
-            close(m_sock);
+    memset(&clientAddr, 0, sizeof(clientAddr));
 
-        m_sock = socket(AF_UNIX, SOCK_STREAM, 0);
-        if (m_sock < 0) {
-            int err = errno;
-            LogError("Error creating socket: " << strerror(err));
-            return CKM_API_ERROR_SOCKET;
-        }
+    clientAddr.sun_family = AF_UNIX;
 
-        if ((flags = fcntl(m_sock, F_GETFL, 0)) < 0 ||
-            fcntl(m_sock, F_SETFL, flags | O_NONBLOCK) < 0)
-        {
-            int err = errno;
-            LogError("Error in fcntl: " << strerror(err));
-            return CKM_API_ERROR_SOCKET;
-        }
+    if (strlen(interface) >= sizeof(clientAddr.sun_path)) {
+        LogError("Error: interface name " << interface << "is too long. Max len is:" <<
+                 sizeof(clientAddr.sun_path));
+        return CKM_API_ERROR_SOCKET;
+    }
 
-        memset(&clientAddr, 0, sizeof(clientAddr));
+    strcpy(clientAddr.sun_path, interface);
 
-        clientAddr.sun_family = AF_UNIX;
+    LogDebug("ClientAddr.sun_path = " << interface);
 
-        if (strlen(interface) >= sizeof(clientAddr.sun_path)) {
-            LogError("Error: interface name " << interface << "is too long. Max len is:" << sizeof(clientAddr.sun_path));
+    int retval = TEMP_FAILURE_RETRY(
+        connect(sock, (struct sockaddr*)&clientAddr, SUN_LEN(&clientAddr)));
+    if ((retval == -1) && (errno == EINPROGRESS)) {
+        if (0 >= waitForSocket(sock, POLLOUT, POLL_TIMEOUT)) {
+            LogError("Error in waitForSocket.");
             return CKM_API_ERROR_SOCKET;
         }
-
-        strcpy(clientAddr.sun_path, interface);
-
-        LogDebug("ClientAddr.sun_path = " << interface);
-
-        int retval = TEMP_FAILURE_RETRY(connect(m_sock, (struct sockaddr*)&clientAddr, SUN_LEN(&clientAddr)));
-        if ((retval == -1) && (errno == EINPROGRESS)) {
-            if (0 >= waitForSocket(m_sock, POLLOUT, POLL_TIMEOUT)) {
-                LogError("Error in waitForSocket.");
-                return CKM_API_ERROR_SOCKET;
-            }
-            int error = 0;
-            size_t len = sizeof(error);
-            retval = getsockopt(m_sock, SOL_SOCKET, SO_ERROR, &error, &len);
-
-            if (-1 == retval) {
-                int err = errno;
-                LogError("Error in getsockopt: " << strerror(err));
-                return CKM_API_ERROR_SOCKET;
-            }
-
-            if (error == EACCES) {
-                LogError("Access denied");
-                return CKM_API_ERROR_ACCESS_DENIED;
-            }
-
-            if (error != 0) {
-                LogError("Error in connect: " << strerror(error));
-                return CKM_API_ERROR_SOCKET;
-            }
-
-            return CKM_API_SUCCESS;
-        }
+        int error = 0;
+        size_t len = sizeof(error);
+        retval = getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &len);
 
         if (-1 == retval) {
             int err = errno;
-            LogError("Error connecting socket: " << strerror(err));
-            if (err == EACCES)
-                return CKM_API_ERROR_ACCESS_DENIED;
+            LogError("Error in getsockopt: " << strerror(err));
+            return CKM_API_ERROR_SOCKET;
+        }
+
+        if (error == EACCES) {
+            LogError("Access denied");
+            return CKM_API_ERROR_ACCESS_DENIED;
+        }
+
+        if (error != 0) {
+            LogError("Error in connect: " << strerror(error));
             return CKM_API_ERROR_SOCKET;
         }
 
         return CKM_API_SUCCESS;
     }
 
-    int Get() {
+    if (-1 == retval) {
+        int err = errno;
+        LogError("Error connecting socket: " << strerror(err));
+        if (err == EACCES)
+            return CKM_API_ERROR_ACCESS_DENIED;
+        return CKM_API_ERROR_SOCKET;
+    }
+
+    return CKM_API_SUCCESS;
+}
+
+class SockRAII {
+public:
+    SockRAII()
+      : m_sock(-1)
+    {}
+
+    virtual ~SockRAII() {
+        if (m_sock > -1)
+            close(m_sock);
+    }
+
+    int Connect(char const * const interface) {
+        return CKM::connectSocket(m_sock, interface);
+    }
+
+    int Get() const {
         return m_sock;
     }
 
@@ -161,10 +172,6 @@ private:
     int m_sock;
 };
 
-} // namespace anonymous
-
-namespace CKM {
-
 
 int sendToServer(char const * const interface, const RawBuffer &send, MessageBuffer &recv) {
     int ret;
index b8eddd4..8616528 100644 (file)
@@ -39,6 +39,8 @@ extern "C" {
 
 namespace CKM {
 
+int connectSocket(int& sock, char const * const interface);
+
 int sendToServer(char const * const interface, const RawBuffer &send, MessageBuffer &recv);
 
 /*