Code

Merged branch 'master' of git://git.tokkee.org/sysdb.
[sysdb.git] / src / client / sock.c
index f4f4c556e82012c99927c721fe98697933c939d0..18ab6a586a1c9f44018629533e4752ecf2ccfa73 100644 (file)
@@ -120,8 +120,12 @@ sdb_client_destroy(sdb_client_t *client)
 } /* sdb_client_destroy */
 
 int
-sdb_client_connect(sdb_client_t *client)
+sdb_client_connect(sdb_client_t *client, const char *username)
 {
+       sdb_strbuf_t *buf;
+       ssize_t status;
+       uint32_t rstatus;
+
        if ((! client) || (! client->address))
                return -1;
 
@@ -137,6 +141,32 @@ sdb_client_connect(sdb_client_t *client)
 
        if (client->fd < 0)
                return -1;
+
+       /* XXX */
+       if (! username)
+               username = "";
+
+       status = sdb_client_send(client, CONNECTION_STARTUP,
+                       (uint32_t)strlen(username), username);
+       if (status < 0) {
+               sdb_client_close(client);
+               return (int)status;
+       }
+
+       buf = sdb_strbuf_create(64);
+       rstatus = 0;
+       status = sdb_client_recv(client, &rstatus, buf);
+       if (status < 0) {
+               sdb_client_close(client);
+               sdb_strbuf_destroy(buf);
+               return (int)status;
+       }
+
+       if (rstatus != CONNECTION_OK) {
+               sdb_client_close(client);
+               sdb_strbuf_destroy(buf);
+               return -((int)rstatus);
+       }
        return 0;
 } /* sdb_client_connect */
 
@@ -183,11 +213,13 @@ sdb_client_recv(sdb_client_t *client,
        while (42) {
                ssize_t status;
 
+               /* XXX: use select */
+
                errno = 0;
                status = sdb_strbuf_read(buf, client->fd, req);
                if (status < 0) {
                        if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
-                               break;
+                               continue;
                        return status;
                }
                else if (! status) /* EOF */
@@ -213,6 +245,12 @@ sdb_client_recv(sdb_client_t *client,
                        break;
        }
 
+       if (total != req) {
+               /* unexpected EOF; clear partially read data */
+               sdb_strbuf_skip(buf, data_offset, sdb_strbuf_len(buf));
+               return 0;
+       }
+
        if (rstatus != UINT32_MAX)
                /* remove status,len */
                sdb_strbuf_skip(buf, data_offset, 2 * sizeof(rstatus));