index b98987dd2e53b68ddf828e64c0bb67e61f01bba4..a146e29711c3aa1cc4de78f59672d43ee52091e6 100644 (file)
close(conn->fd);
conn->fd = -1;
+ if (conn->username)
+ free(conn->username);
+ conn->username = NULL;
+
sdb_strbuf_destroy(conn->buf);
conn->buf = NULL;
sdb_strbuf_destroy(conn->errbuf);
if ((! conn->username) && (conn->cmd != CONNECTION_STARTUP)) {
const char *errmsg = "Authentication required";
+ sdb_strbuf_sprintf(conn->errbuf, errmsg);
sdb_connection_send(conn, CONNECTION_ERROR,
(uint32_t)strlen(errmsg), errmsg);
return -1;
}
- /* reset */
- sdb_strbuf_sprintf(conn->errbuf, "");
-
switch (conn->cmd) {
case CONNECTION_PING:
status = sdb_connection_ping(conn);
sdb_connection_send(conn, CONNECTION_ERROR,
(uint32_t)sdb_strbuf_len(conn->errbuf),
sdb_strbuf_string(conn->errbuf));
-
- /* remove the command from the buffer */
- if (conn->cmd_len)
- sdb_strbuf_skip(conn->buf, 0, conn->cmd_len);
- conn->cmd = CONNECTION_IDLE;
- conn->cmd_len = 0;
return status;
} /* command_handle */
assert(conn && (conn->cmd == CONNECTION_IDLE) && (! conn->cmd_len));
+ /* reset */
+ sdb_strbuf_sprintf(conn->errbuf, "");
+
conn->cmd = connection_get_int32(conn, 0);
conn->cmd_len = connection_get_int32(conn, sizeof(uint32_t));
len = 2 * sizeof(uint32_t);
- if (conn->cmd == CONNECTION_IDLE)
+ if (conn->cmd == CONNECTION_IDLE) {
len += conn->cmd_len;
+ conn->cmd_len = 0;
+ }
sdb_strbuf_skip(conn->buf, 0, len);
return 0;
} /* command_init */
void
sdb_connection_close(sdb_conn_t *conn)
{
+ if (! conn)
+ return;
+
+ /* close the connection even if someone else still references it */
+ if (conn->fd >= 0)
+ close(conn->fd);
+ conn->fd = -1;
+
sdb_object_deref(SDB_OBJ(conn));
} /* sdb_connection_close */
&& (sdb_strbuf_len(conn->buf) >= 2 * sizeof(int32_t)))
command_init(conn);
if ((conn->cmd != CONNECTION_IDLE)
- && (sdb_strbuf_len(conn->buf) >= conn->cmd_len))
+ && (sdb_strbuf_len(conn->buf) >= conn->cmd_len)) {
command_handle(conn);
+ /* remove the command from the buffer */
+ if (conn->cmd_len)
+ sdb_strbuf_skip(conn->buf, 0, conn->cmd_len);
+ conn->cmd = CONNECTION_IDLE;
+ conn->cmd_len = 0;
+ }
+
if (status <= 0)
break;