From: Stephan Bosch Date: Tue, 14 Feb 2023 18:18:04 +0000 (+0100) Subject: imap-urlauth: imap-urlauth-client - Use the connection.h API. X-Git-Tag: 2.4.0~2866 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=50e8ac8c109cd9aa007712ff707d3e0ee603bd51;p=thirdparty%2Fdovecot%2Fcore.git imap-urlauth: imap-urlauth-client - Use the connection.h API. --- diff --git a/src/imap-urlauth/imap-urlauth-client.c b/src/imap-urlauth/imap-urlauth-client.c index d8b556a439..6d33122aea 100644 --- a/src/imap-urlauth/imap-urlauth-client.c +++ b/src/imap-urlauth/imap-urlauth-client.c @@ -9,7 +9,6 @@ #include "str.h" #include "strescape.h" #include "eacces-error.h" -#include "llist.h" #include "hostpid.h" #include "execv-const.h" #include "env-util.h" @@ -33,8 +32,7 @@ static struct event_category event_category_urlauth = { .name = "imap-urlauth", }; -struct client *imap_urlauth_clients; -unsigned int imap_urlauth_client_count; +struct connection_list *imap_urlauth_clist; int client_create(const char *service, const char *username, int fd_in, int fd_out, @@ -49,8 +47,6 @@ int client_create(const char *service, const char *username, net_set_nonblock(fd_out, TRUE); client = i_new(struct client, 1); - client->fd_in = fd_in; - client->fd_out = fd_out; client->set = set; client->event = event_create(NULL); @@ -81,10 +77,10 @@ int client_create(const char *service, const char *username, client->username = i_strdup(username); client->service = i_strdup(service); - client->output = o_stream_create_fd(fd_out, SIZE_MAX); - - imap_urlauth_client_count++; - DLLIST_PREPEND(&imap_urlauth_clients, client); + client->conn.event_parent = client->event; + connection_init_server(imap_urlauth_clist, &client->conn, NULL, + fd_in, fd_out); + connection_input_halt(&client->conn); /* No input handler */ client->worker_client = imap_urlauth_worker_client_init(client); if (imap_urlauth_worker_client_connect(client->worker_client) < 0) { @@ -102,7 +98,7 @@ void client_send_line(struct client *client, const char *fmt, ...) va_list va; ssize_t ret; - if (client->output->closed) + if (client->conn.output->closed) return; va_start(va, fmt); @@ -114,7 +110,7 @@ void client_send_line(struct client *client, const char *fmt, ...) str_vprintfa(str, fmt, va); str_append(str, "\n"); - ret = o_stream_send(client->output, + ret = o_stream_send(client->conn.output, str_data(str), str_len(str)); i_assert(ret < 0 || (size_t)ret == str_len(str)); } T_END; @@ -129,17 +125,11 @@ void client_destroy(struct client *client, const char *reason) if (!client->disconnected) e_info(client->event, "Disconnected: %s", reason); - imap_urlauth_client_count--; - DLLIST_REMOVE(&imap_urlauth_clients, client); - timeout_remove(&client->to_destroy); imap_urlauth_worker_client_deinit(&client->worker_client); - o_stream_destroy(&client->output); - - fd_close_maybe_stdio(&client->fd_in, &client->fd_out); - + connection_deinit(&client->conn); event_unref(&client->event); i_free(client->username); @@ -167,10 +157,45 @@ void client_disconnect(struct client *client, const char *reason) client->to_destroy = timeout_add(0, client_destroy_timeout, client); } -void clients_destroy_all(void) +static void client_connection_destroy(struct connection *conn) { - while (imap_urlauth_clients != NULL) { - client_destroy(imap_urlauth_clients, - MASTER_SERVICE_SHUTTING_DOWN_MSG); + struct client *client = container_of(conn, struct client, conn); + + switch (conn->disconnect_reason) { + case CONNECTION_DISCONNECT_HANDSHAKE_FAILED: + case CONNECTION_DISCONNECT_BUFFER_FULL: + i_unreached(); + default: + /* Disconnected */ + client_disconnect(client, "Client disconnected"); + } +} + +static const struct connection_vfuncs client_connection_vfuncs = { + .destroy = client_connection_destroy, +}; + +static const struct connection_settings client_connection_set = { + .unix_client_connect_msecs = 1000, + .input_max_size = SIZE_MAX, + .output_max_size = SIZE_MAX, +}; + +void clients_init(void) +{ + imap_urlauth_clist = connection_list_init(&client_connection_set, + &client_connection_vfuncs); +} + +void clients_deinit(void) +{ + struct connection *conn; + + for (conn = imap_urlauth_clist->connections; + conn != NULL; conn = conn->next) { + struct client *client = container_of(conn, struct client, conn); + + client_destroy(client, MASTER_SERVICE_SHUTTING_DOWN_MSG); } + connection_list_deinit(&imap_urlauth_clist); } diff --git a/src/imap-urlauth/imap-urlauth-client.h b/src/imap-urlauth/imap-urlauth-client.h index 6a49b74684..017d929ba2 100644 --- a/src/imap-urlauth/imap-urlauth-client.h +++ b/src/imap-urlauth/imap-urlauth-client.h @@ -1,14 +1,16 @@ #ifndef IMAP_URLAUTH_CLIENT_H #define IMAP_URLAUTH_CLIENT_H +#include "connection.h" + struct client; struct mail_storage; struct client { + struct connection conn; + struct client *prev, *next; - int fd_in, fd_out; - struct ostream *output; struct timeout *to_destroy; struct event *event; @@ -23,8 +25,7 @@ struct client { bool disconnected:1; }; -extern struct client *imap_urlauth_clients; -extern unsigned int imap_urlauth_client_count; +extern struct connection_list *imap_urlauth_clist; int client_create(const char *service, const char *username, int fd_in, int fd_out, @@ -37,6 +38,7 @@ void client_send_line(struct client *client, const char *fmt, ...) void client_disconnect(struct client *client, const char *reason); -void clients_destroy_all(void); +void clients_init(void); +void clients_deinit(void); #endif diff --git a/src/imap-urlauth/imap-urlauth-common.h b/src/imap-urlauth/imap-urlauth-common.h index 05a7fe9c87..bc8be9791c 100644 --- a/src/imap-urlauth/imap-urlauth-common.h +++ b/src/imap-urlauth/imap-urlauth-common.h @@ -5,6 +5,8 @@ #include "imap-urlauth-client.h" #include "imap-urlauth-settings.h" +#define IMAP_URLAUTH_SOCKET "imap-urlauth" + #define IMAP_URLAUTH_PROTOCOL_MAJOR_VERSION 1 #define IMAP_URLAUTH_PROTOCOL_MINOR_VERSION 0 diff --git a/src/imap-urlauth/imap-urlauth-worker-client.c b/src/imap-urlauth/imap-urlauth-worker-client.c index 10387c40a3..c68ccedb3e 100644 --- a/src/imap-urlauth/imap-urlauth-worker-client.c +++ b/src/imap-urlauth/imap-urlauth-worker-client.c @@ -122,15 +122,15 @@ imap_urlauth_worker_client_connected(struct connection *_conn, bool success) /* transfer one or two fds */ ret = (o_stream_unix_write_fd(wclient->conn.output, - client->fd_in) ? 1 : 0); + client->conn.fd_in) ? 1 : 0); if (ret > 0) { - data = (client->fd_in == client->fd_out ? '0' : '1'); + data = (client->conn.fd_in == client->conn.fd_out ? '0' : '1'); ret = o_stream_send(wclient->conn.output, &data, sizeof(data)); } - if (client->fd_in != client->fd_out) { + if (client->conn.fd_in != client->conn.fd_out) { if (ret > 0) { ret = (o_stream_unix_write_fd(wclient->conn.output, - client->fd_out) ? + client->conn.fd_out) ? 1 : 0); } if (ret > 0) { diff --git a/src/imap-urlauth/imap-urlauth.c b/src/imap-urlauth/imap-urlauth.c index f10f4d1cef..d0bd57226b 100644 --- a/src/imap-urlauth/imap-urlauth.c +++ b/src/imap-urlauth/imap-urlauth.c @@ -81,16 +81,18 @@ void imap_urlauth_refresh_proctitle(void) return; str_append_c(title, '['); - switch (imap_urlauth_client_count) { + switch (imap_urlauth_clist->connections_count) { case 0: str_append(title, "idling"); break; case 1: - client = imap_urlauth_clients; + client = container_of(imap_urlauth_clist->connections, + struct client, conn); str_append(title, client->username); break; default: - str_printfa(title, "%u connections", imap_urlauth_client_count); + str_printfa(title, "%u connections", + imap_urlauth_clist->connections_count); break; } str_append_c(title, ']'); @@ -270,6 +272,7 @@ int main(int argc, char *argv[]) login_set.callback = login_request_finished; login_set.failure_callback = login_request_failed; + clients_init(); master_service_init_finish(master_service); master_service_set_die_callback(master_service, imap_urlauth_die); @@ -288,7 +291,7 @@ int main(int argc, char *argv[]) if (io_loop_is_running(current_ioloop)) master_service_run(master_service, client_connected); - clients_destroy_all(); + clients_deinit(); if (login_server != NULL) login_server_deinit(&login_server);