From: Stephan Bosch Date: Sat, 5 Jan 2019 10:22:44 +0000 (+0100) Subject: lib-auth-client: auth-master - Move request-related code to new auth-master-request.c X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4f210efacea57019b88ba2b867f73d2ca514cb73;p=thirdparty%2Fdovecot%2Fcore.git lib-auth-client: auth-master - Move request-related code to new auth-master-request.c --- diff --git a/src/lib-auth-client/Makefile.am b/src/lib-auth-client/Makefile.am index 035f8b6fcb..acd2e54dc3 100644 --- a/src/lib-auth-client/Makefile.am +++ b/src/lib-auth-client/Makefile.am @@ -12,6 +12,7 @@ libauth_client_la_SOURCES = \ auth-client-request.c \ auth-client-connection.c \ auth-master.c \ + auth-master-request.c \ auth-proxy.c headers = \ diff --git a/src/lib-auth-client/auth-master-private.h b/src/lib-auth-client/auth-master-private.h index cf5ab58ff8..2328059d62 100644 --- a/src/lib-auth-client/auth-master-private.h +++ b/src/lib-auth-client/auth-master-private.h @@ -36,4 +36,24 @@ struct auth_master_connection { bool aborted:1; }; +/* + * Request + */ + +void auth_request_lookup_abort(struct auth_master_connection *conn); + +int auth_master_run_cmd_pre(struct auth_master_connection *conn, + const char *cmd); +int auth_master_run_cmd_post(struct auth_master_connection *conn); +int auth_master_run_cmd(struct auth_master_connection *conn, const char *cmd); + +unsigned int auth_master_next_request_id(struct auth_master_connection *conn); + +/* + * Connection + */ + +void auth_master_set_io(struct auth_master_connection *conn); +void auth_master_unset_io(struct auth_master_connection *conn); + #endif diff --git a/src/lib-auth-client/auth-master-request.c b/src/lib-auth-client/auth-master-request.c new file mode 100644 index 0000000000..6e13dad5a6 --- /dev/null +++ b/src/lib-auth-client/auth-master-request.c @@ -0,0 +1,91 @@ +/* Copyright (c) 2005-2018 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "ioloop.h" +#include "ostream.h" +#include "master-service.h" + +#include "auth-master-private.h" + +void auth_request_lookup_abort(struct auth_master_connection *conn) +{ + io_loop_stop(conn->ioloop); + conn->aborted = TRUE; +} + +int auth_master_run_cmd_pre(struct auth_master_connection *conn, + const char *cmd) +{ + auth_master_set_io(conn); + + if (!conn->connected) { + if (auth_master_connect(conn) < 0) { + auth_master_unset_io(conn); + return -1; + } + i_assert(conn->connected); + connection_input_resume(&conn->conn); + } + + o_stream_cork(conn->conn.output); + if (!conn->sent_handshake) { + const struct connection_settings *set = &conn->conn.list->set; + + o_stream_nsend_str(conn->conn.output, + t_strdup_printf("VERSION\t%u\t%u\n", + set->major_version, + set->minor_version)); + conn->sent_handshake = TRUE; + } + + o_stream_nsend_str(conn->conn.output, cmd); + o_stream_uncork(conn->conn.output); + + if (o_stream_flush(conn->conn.output) < 0) { + e_error(conn->event, "write(auth socket) failed: %s", + o_stream_get_error(conn->conn.output)); + auth_master_unset_io(conn); + auth_master_disconnect(conn); + return -1; + } + return 0; +} + +int auth_master_run_cmd_post(struct auth_master_connection *conn) +{ + auth_master_unset_io(conn); + if (conn->aborted) { + conn->aborted = FALSE; + auth_master_disconnect(conn); + return -1; + } + return 0; +} + +static void auth_master_stop(struct auth_master_connection *conn) +{ + if (master_service_is_killed(master_service)) { + auth_request_lookup_abort(conn); + io_loop_stop(conn->ioloop); + } +} + +int auth_master_run_cmd(struct auth_master_connection *conn, const char *cmd) +{ + if (auth_master_run_cmd_pre(conn, cmd) < 0) + return -1; + /* add stop handler */ + struct timeout *to = timeout_add_short(100, auth_master_stop, conn); + io_loop_run(conn->ioloop); + timeout_remove(&to); + return auth_master_run_cmd_post(conn); +} + +unsigned int auth_master_next_request_id(struct auth_master_connection *conn) +{ + if (++conn->request_counter == 0) { + /* avoid zero */ + conn->request_counter++; + } + return conn->request_counter; +} diff --git a/src/lib-auth-client/auth-master.c b/src/lib-auth-client/auth-master.c index 899ff806d4..effc6259cc 100644 --- a/src/lib-auth-client/auth-master.c +++ b/src/lib-auth-client/auth-master.c @@ -10,7 +10,6 @@ #include "ostream.h" #include "str.h" #include "strescape.h" -#include "master-service.h" #include "auth-master-private.h" @@ -21,7 +20,6 @@ static int auth_master_handshake_line(struct connection *_conn, const char *line); static int auth_master_input_line(struct connection *_conn, const char *line); static void auth_master_destroy(struct connection *_conn); -static void auth_request_lookup_abort(struct auth_master_connection *conn); static const struct connection_vfuncs auth_master_vfuncs = { .destroy = auth_master_destroy, @@ -270,7 +268,7 @@ int auth_master_connect(struct auth_master_connection *conn) return 0; } -static void auth_master_set_io(struct auth_master_connection *conn) +void auth_master_set_io(struct auth_master_connection *conn) { if (conn->ioloop != NULL) return; @@ -287,7 +285,7 @@ static void auth_master_set_io(struct auth_master_connection *conn) auth_request_timeout, conn); } -static void auth_master_unset_io(struct auth_master_connection *conn) +void auth_master_unset_io(struct auth_master_connection *conn) { if (conn->prev_ioloop != NULL) { io_loop_set_current(conn->prev_ioloop); @@ -311,91 +309,6 @@ static void auth_master_unset_io(struct auth_master_connection *conn) } } -static void auth_request_lookup_abort(struct auth_master_connection *conn) -{ - io_loop_stop(conn->ioloop); - conn->aborted = TRUE; -} - -static int auth_master_run_cmd_pre(struct auth_master_connection *conn, - const char *cmd) -{ - auth_master_set_io(conn); - - if (!conn->connected) { - if (auth_master_connect(conn) < 0) { - auth_master_unset_io(conn); - return -1; - } - i_assert(conn->connected); - connection_input_resume(&conn->conn); - } - - o_stream_cork(conn->conn.output); - if (!conn->sent_handshake) { - const struct connection_settings *set = &conn->conn.list->set; - - o_stream_nsend_str(conn->conn.output, - t_strdup_printf("VERSION\t%u\t%u\n", - set->major_version, - set->minor_version)); - conn->sent_handshake = TRUE; - } - - o_stream_nsend_str(conn->conn.output, cmd); - o_stream_uncork(conn->conn.output); - - if (o_stream_flush(conn->conn.output) < 0) { - e_error(conn->event, "write(auth socket) failed: %s", - o_stream_get_error(conn->conn.output)); - auth_master_unset_io(conn); - auth_master_disconnect(conn); - return -1; - } - return 0; -} - -static int auth_master_run_cmd_post(struct auth_master_connection *conn) -{ - auth_master_unset_io(conn); - if (conn->aborted) { - conn->aborted = FALSE; - auth_master_disconnect(conn); - return -1; - } - return 0; -} - -static void auth_master_stop(struct auth_master_connection *conn) -{ - if (master_service_is_killed(master_service)) { - auth_request_lookup_abort(conn); - io_loop_stop(conn->ioloop); - } -} - -static int auth_master_run_cmd(struct auth_master_connection *conn, - const char *cmd) -{ - if (auth_master_run_cmd_pre(conn, cmd) < 0) - return -1; - /* add stop handler */ - struct timeout *to = timeout_add_short(100, auth_master_stop, conn); - io_loop_run(conn->ioloop); - timeout_remove(&to); - return auth_master_run_cmd_post(conn); -} - -static unsigned int -auth_master_next_request_id(struct auth_master_connection *conn) -{ - if (++conn->request_counter == 0) { - /* avoid zero */ - conn->request_counter++; - } - return conn->request_counter; -} - struct auth_master_lookup_ctx { struct auth_master_connection *conn; const char *user;