--- a/src/irc_conn.c Thu Mar 12 23:54:03 2009 +0200
+++ b/src/irc_conn.c Fri Mar 13 00:01:12 2009 +0200
@@ -138,6 +138,11 @@
// EOF after quit?
if (ERROR_CODE(err) == ERR_READ_EOF && conn->quitting) {
+ // udpate states
+ conn->registered = false;
+ conn->quitting = false;
+ conn->quit = true;
+
// callback
if (conn->callbacks.on_quit)
conn->callbacks.on_quit(conn, conn->cb_arg);
@@ -306,7 +311,7 @@
};
// state check
- if (conn->quitting)
+ if (conn->quitting || conn->quit)
return ERR_IRC_CONN_QUIT_STATE;
// try and send
--- a/src/irc_conn.h Thu Mar 12 23:54:03 2009 +0200
+++ b/src/irc_conn.h Fri Mar 13 00:01:12 2009 +0200
@@ -79,6 +79,9 @@
/** Quit message sent, waiting for server to close connection */
bool quitting;
+
+ /** Quit message sent, connection closed, we're done */
+ bool quit;
// @}
--- a/src/test.c Thu Mar 12 23:54:03 2009 +0200
+++ b/src/test.c Fri Mar 13 00:01:12 2009 +0200
@@ -241,7 +241,7 @@
}
struct _test_irc_conn_ctx {
- bool on_registered, on_TEST;
+ bool on_registered, on_TEST, on_error, on_quit;
};
static void _conn_on_registered (struct irc_conn *conn, void *arg)
@@ -255,6 +255,29 @@
log_debug("registered");
}
+static void _conn_on_error (struct irc_conn *conn, struct error_info *err, void *arg)
+{
+ struct _test_irc_conn_ctx *ctx = arg;
+
+ (void) conn;
+ (void) err;
+
+ if (ctx) ctx->on_error = true;
+
+ log_debug("on_error");
+}
+
+static void _conn_on_quit (struct irc_conn *conn, void *arg)
+{
+ struct _test_irc_conn_ctx *ctx = arg;
+
+ (void) conn;
+
+ if (ctx) ctx->on_quit = true;
+
+ log_debug("on_quit");
+}
+
static void _conn_on_TEST (const struct irc_line *line, void *arg)
{
struct _test_irc_conn_ctx *ctx = arg;
@@ -271,6 +294,8 @@
static struct irc_conn_callbacks _conn_callbacks = {
.on_registered = &_conn_on_registered,
+ .on_error = &_conn_on_error,
+ .on_quit = &_conn_on_quit,
};
static struct irc_cmd_handler _conn_handlers[] = {
@@ -308,7 +333,7 @@
{
struct sock_test *sock;
struct irc_conn *conn;
- struct _test_irc_conn_ctx ctx = { false, false };
+ struct _test_irc_conn_ctx ctx = { false, false, false, false };
// create the test socket
assert((sock = sock_test_create()));
@@ -329,6 +354,18 @@
sock_test_add_recv_str(sock, "PING foo\r\n");
assert_sock_data(sock, "PONG foo\r\n");
+ // quit nicely
+ log_info("test QUIT");
+ assert_success(irc_conn_QUIT(conn, "bye now"));
+ assert_sock_data(sock, "QUIT :bye now\r\n");
+ assert(conn->quitting);
+
+ sock_test_add_recv_str(sock, "ERROR :Closing Link: Quit\r\n");
+ sock_test_set_recv_eof(sock);
+ assert(conn->quit && !conn->quitting && !conn->registered);
+ assert(ctx.on_quit);
+ assert(!ctx.on_error);
+
// destroy it
irc_conn_destroy(conn);
}