]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
imap-urlauth: imap-urlauth-client - Use the connection.h API.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 14 Feb 2023 18:18:04 +0000 (19:18 +0100)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 24 Mar 2023 07:14:54 +0000 (07:14 +0000)
src/imap-urlauth/imap-urlauth-client.c
src/imap-urlauth/imap-urlauth-client.h
src/imap-urlauth/imap-urlauth-common.h
src/imap-urlauth/imap-urlauth-worker-client.c
src/imap-urlauth/imap-urlauth.c

index d8b556a43974caf7bbe8d7ca160a7afee70ed436..6d33122aea69e78449797df5a9920145f12e03ba 100644 (file)
@@ -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);
 }
index 6a49b746840ed632ac1c9062e72874da32e8a431..017d929ba220b9aaa7569c29a715182a4245c5c0 100644 (file)
@@ -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
index 05a7fe9c8783ebb57cc0b6cb82adbb21a897fa24..bc8be9791c6945494909863d0eb8c91520f87a55 100644 (file)
@@ -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
 
index 10387c40a3a3f7763bd7d825c17c2035009a81e1..c68ccedb3ed77896eae8e8a61e7943c3aa342ccd 100644 (file)
@@ -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) {
index f10f4d1cefe4202484715b3ecb950718ad3f2e29..d0bd57226b4ff3f131ef6d8aaf513bc57927ce78 100644 (file)
@@ -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);