diff --git a/src/client/sock.c b/src/client/sock.c
index ffabdc1b74add0a1a7d09c0575ccf36a1ef59115..18ab6a586a1c9f44018629533e4752ecf2ccfa73 100644 (file)
--- a/src/client/sock.c
+++ b/src/client/sock.c
} /* 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;
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 */
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 */
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));
+
if (code)
*code = rstatus;