Code

Merged branch 'master' of git://git.tokkee.org/sysdb.
[sysdb.git] / src / client / sock.c
index 18ab6a586a1c9f44018629533e4752ecf2ccfa73..59c77873e08411b22a9c1e5a6a857a8e269210f5 100644 (file)
@@ -26,6 +26,7 @@
  */
 
 #include "client/sock.h"
+#include "utils/error.h"
 #include "utils/strbuf.h"
 #include "utils/proto.h"
 
@@ -63,15 +64,22 @@ connect_unixsock(sdb_client_t *client, const char *address)
        struct sockaddr_un sa;
 
        client->fd = socket(AF_UNIX, SOCK_STREAM, /* protocol = */ 0);
-       if (client->fd < 0)
+       if (client->fd < 0) {
+               char errbuf[1024];
+               sdb_log(SDB_LOG_ERR, "Failed to open socket: %s",
+                               sdb_strerror(errno, errbuf, sizeof(errbuf)));
                return -1;
+       }
 
        sa.sun_family = AF_UNIX;
        strncpy(sa.sun_path, address, sizeof(sa.sun_path));
        sa.sun_path[sizeof(sa.sun_path) - 1] = '\0';
 
        if (connect(client->fd, (struct sockaddr *)&sa, sizeof(sa))) {
+               char errbuf[1024];
                sdb_client_close(client);
+               sdb_log(SDB_LOG_ERR, "Failed to connect to '%s': %s",
+                               sa.sun_path, sdb_strerror(errno, errbuf, sizeof(errbuf)));
                return -1;
        }
        return client->fd;
@@ -90,14 +98,17 @@ sdb_client_create(const char *address)
                return NULL;
 
        client = malloc(sizeof(*client));
-       if (! client)
+       if (! client) {
+               sdb_log(SDB_LOG_ERR, "Out of memory");
                return NULL;
+       }
        memset(client, 0, sizeof(*client));
        client->fd = -1;
 
        client->address = strdup(address);
        if (! client->address) {
                sdb_client_destroy(client);
+               sdb_log(SDB_LOG_ERR, "Out of memory");
                return NULL;
        }
 
@@ -136,8 +147,10 @@ sdb_client_connect(sdb_client_t *client, const char *username)
                connect_unixsock(client, client->address + strlen("unix:"));
        else if (*client->address == '/')
                connect_unixsock(client, client->address);
-       else
+       else {
+               sdb_log(SDB_LOG_ERR, "Unknown address type: %s", client->address);
                return -1;
+       }
 
        if (client->fd < 0)
                return -1;
@@ -149,7 +162,10 @@ sdb_client_connect(sdb_client_t *client, const char *username)
        status = sdb_client_send(client, CONNECTION_STARTUP,
                        (uint32_t)strlen(username), username);
        if (status < 0) {
+               char errbuf[1024];
                sdb_client_close(client);
+               sdb_log(SDB_LOG_ERR, "Failed to send STARTUP message to server: %s",
+                               sdb_strerror(errno, errbuf, sizeof(errbuf)));
                return (int)status;
        }
 
@@ -157,19 +173,31 @@ sdb_client_connect(sdb_client_t *client, const char *username)
        rstatus = 0;
        status = sdb_client_recv(client, &rstatus, buf);
        if (status < 0) {
+               char errbuf[1024];
                sdb_client_close(client);
                sdb_strbuf_destroy(buf);
+               sdb_log(SDB_LOG_ERR, "Failed to receive server response: %s",
+                               sdb_strerror(errno, errbuf, sizeof(errbuf)));
                return (int)status;
        }
 
        if (rstatus != CONNECTION_OK) {
                sdb_client_close(client);
                sdb_strbuf_destroy(buf);
+               sdb_log(SDB_LOG_ERR, "Access denied for user '%s'", username);
                return -((int)rstatus);
        }
        return 0;
 } /* sdb_client_connect */
 
+int
+sdb_client_sockfd(sdb_client_t *client)
+{
+       if (! client)
+               return -1;
+       return client->fd;
+} /* sdb_client_sockfd */
+
 void
 sdb_client_close(sdb_client_t *client)
 {
@@ -202,18 +230,19 @@ sdb_client_recv(sdb_client_t *client,
 
        size_t data_offset = sdb_strbuf_len(buf);
 
+       if (code)
+               *code = UINT32_MAX;
+
        if ((! client) || (! client->fd) || (! buf)) {
                errno = EBADF;
                return -1;
        }
 
-       if (code)
-               *code = UINT32_MAX;
-
        while (42) {
                ssize_t status;
 
-               /* XXX: use select */
+               if (sdb_proto_select(client->fd, SDB_PROTO_SELECTIN))
+                       return -1;
 
                errno = 0;
                status = sdb_strbuf_read(buf, client->fd, req);