[dovecot-cvs] dovecot/src/lib-auth auth-server-connection.c,1.2,1.3
auth-server-connection.h,1.1,1.2 auth-server-request.c,1.3,1.4
cras at procontrol.fi
cras at procontrol.fi
Fri Aug 22 10:37:59 EEST 2003
Update of /home/cvs/dovecot/src/lib-auth
In directory danu:/tmp/cvs-serv11641/lib-auth
Modified Files:
auth-server-connection.c auth-server-connection.h
auth-server-request.c
Log Message:
fixes
Index: auth-server-connection.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-auth/auth-server-connection.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- auth-server-connection.c 22 Aug 2003 03:34:04 -0000 1.2
+++ auth-server-connection.c 22 Aug 2003 06:37:57 -0000 1.3
@@ -19,6 +19,8 @@
(sizeof(struct auth_client_request_continue) + \
AUTH_CLIENT_MAX_REQUEST_DATA_SIZE)
+static void auth_server_connection_unref(struct auth_server_connection *conn);
+
static void update_available_auth_mechs(struct auth_client *client)
{
struct auth_server_connection *conn;
@@ -104,9 +106,13 @@
return;
/* we've got a full reply */
+ conn->refcount++;
conn->reply_received = FALSE;
+
auth_server_request_handle_reply(conn, &conn->reply, data);
i_stream_skip(conn->input, conn->reply.data_size);
+
+ auth_server_connection_unref(conn);
}
struct auth_server_connection *
@@ -128,6 +134,7 @@
pool = pool_alloconly_create("Auth connection", 1024);
conn = p_new(pool, struct auth_server_connection, 1);
+ conn->refcount = 1;
conn->pool = pool;
conn->client = client;
@@ -163,6 +170,9 @@
struct auth_client *client = conn->client;
struct auth_server_connection **pos;
+ if (conn->fd == -1)
+ return;
+
pos = &conn->client->connections;
for (; *pos != NULL; pos = &(*pos)->next) {
if (*pos == conn) {
@@ -175,16 +185,17 @@
client->conn_waiting_handshake_count--;
io_remove(conn->io);
+ conn->io = NULL;
+
+ i_stream_close(conn->input);
+ o_stream_close(conn->output);
+
if (close(conn->fd) < 0)
i_error("close(auth) failed: %m");
conn->fd = -1;
auth_server_requests_remove_all(conn);
- hash_destroy(conn->requests);
-
- i_stream_unref(conn->input);
- o_stream_unref(conn->output);
- pool_unref(conn->pool);
+ auth_server_connection_unref(conn);
if (reconnect)
auth_client_connect_missing_servers(client);
@@ -193,6 +204,18 @@
auth_client_is_connected(client),
client->connect_notify_context);
}
+}
+
+static void auth_server_connection_unref(struct auth_server_connection *conn)
+{
+ if (--conn->refcount > 0)
+ return;
+
+ hash_destroy(conn->requests);
+
+ i_stream_unref(conn->input);
+ o_stream_unref(conn->output);
+ pool_unref(conn->pool);
}
struct auth_server_connection *
Index: auth-server-connection.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-auth/auth-server-connection.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- auth-server-connection.h 22 Aug 2003 02:42:13 -0000 1.1
+++ auth-server-connection.h 22 Aug 2003 06:37:57 -0000 1.2
@@ -20,6 +20,8 @@
struct auth_server_connection *next;
pool_t pool;
+ int refcount;
+
struct auth_client *client;
const char *path;
int fd;
Index: auth-server-request.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-auth/auth-server-request.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- auth-server-request.c 22 Aug 2003 04:42:13 -0000 1.3
+++ auth-server-request.c 22 Aug 2003 06:37:57 -0000 1.4
@@ -47,6 +47,26 @@
return TRUE;
}
+static void auth_server_send_continue(struct auth_server_connection *conn,
+ struct auth_request *request,
+ const unsigned char *data, size_t size)
+{
+ struct auth_client_request_continue auth_request;
+
+ /* send continued request to auth */
+ auth_request.type = AUTH_CLIENT_REQUEST_CONTINUE;
+ auth_request.id = request->id;
+ auth_request.data_size = size;
+
+ if (o_stream_send(conn->output, &auth_request,
+ sizeof(auth_request)) < 0 ||
+ o_stream_send(conn->output, data, size) < 0) {
+ errno = conn->output->stream_errno;
+ i_warning("Error sending continue request to auth server: %m");
+ auth_server_connection_destroy(conn, TRUE);
+ }
+}
+
static struct auth_server_connection *
get_next_plain_server(struct auth_server_connection *conn)
{
@@ -68,37 +88,43 @@
request = hash_lookup(conn->requests, POINTER_CAST(reply->id));
if (request == NULL) {
- i_error("BUG: Auth server sent us reply with unknown ID %u",
- reply->id);
+ /* We've already destroyed the request */
return;
}
switch (reply->result) {
case AUTH_CLIENT_RESULT_SUCCESS:
- if (conn == request->conn)
- request->next_conn = NULL;
- else {
- i_assert(request->next_conn == conn);
- request->conn = request->next_conn;
- request->next_conn = NULL;
+ hash_remove(request->conn->requests, POINTER_CAST(request->id));
+ if (request->next_conn != NULL) {
+ hash_remove(request->next_conn->requests,
+ POINTER_CAST(request->id));
}
+ request->conn = conn;
+ request->next_conn = NULL;
break;
case AUTH_CLIENT_RESULT_FAILURE:
- if (request->plaintext_data == NULL)
- break;
-
- next = get_next_plain_server(conn);
- if (next == NULL)
+ hash_remove(conn->requests, POINTER_CAST(request->id));
+ if (!request->retrying)
break;
- hash_remove(conn->requests, POINTER_CAST(request->id));
- hash_insert(next->requests, POINTER_CAST(request->id), request);
+ next = request->next_conn == NULL ? NULL :
+ get_next_plain_server(request->next_conn);
if (conn == request->conn)
request->conn = request->next_conn;
+ request->next_conn = NULL;
+
+ if (next == NULL) {
+ if (request->conn != NULL) {
+ /* the other one hasn't replied yet */
+ return;
+ }
+ request->conn = conn;
+ break;
+ }
+ hash_insert(next->requests, POINTER_CAST(request->id), request);
request->next_conn = next;
- request->retrying = TRUE;
auth_server_send_new_request(next, request);
return;
@@ -106,15 +132,15 @@
if (!request->retrying)
break;
- auth_client_request_continue(request, request->plaintext_data,
- request->plaintext_data_size);
+ auth_server_send_continue(conn, request,
+ request->plaintext_data,
+ request->plaintext_data_size);
return;
}
request->callback(request, reply, data, request->context);
if (reply->result != AUTH_CLIENT_RESULT_CONTINUE) {
- hash_remove(conn->requests, POINTER_CAST(request->id));
i_free(request->plaintext_data);
i_free(request);
}
@@ -169,7 +195,7 @@
void auth_client_request_continue(struct auth_request *request,
const unsigned char *data, size_t data_size)
{
- struct auth_client_request_continue auth_request;
+ auth_server_send_continue(request->conn, request, data, data_size);
if (request->mech == AUTH_MECH_PLAIN &&
request->plaintext_data == NULL) {
@@ -185,20 +211,8 @@
POINTER_CAST(request->id), request);
auth_server_send_new_request(request->next_conn,
request);
+ request->retrying = TRUE;
}
- }
-
- /* send continued request to auth */
- auth_request.type = AUTH_CLIENT_REQUEST_CONTINUE;
- auth_request.id = request->id;
- auth_request.data_size = data_size;
-
- if (o_stream_send(request->conn->output, &auth_request,
- sizeof(auth_request)) < 0 ||
- o_stream_send(request->conn->output, data, data_size) < 0) {
- errno = request->conn->output->stream_errno;
- i_warning("Error sending continue request to auth server: %m");
- auth_server_connection_destroy(request->conn, TRUE);
}
}
More information about the dovecot-cvs
mailing list