dovecot-2.2: director: Reverted previous e178413a905d commit aft...
dovecot at dovecot.org
dovecot at dovecot.org
Wed May 13 12:35:28 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/67fdd6f962f5
changeset: 18669:67fdd6f962f5
user: Timo Sirainen <tss at iki.fi>
date: Wed May 13 13:15:57 2015 +0300
description:
director: Reverted previous e178413a905d commit after all - do it a bit differently.
diffstat:
src/director/auth-connection.c | 8 +++-
src/director/auth-connection.h | 5 +-
src/director/login-connection.c | 68 ++++++----------------------------------
3 files changed, 18 insertions(+), 63 deletions(-)
diffs (161 lines):
diff -r f5749f22276b -r 67fdd6f962f5 src/director/auth-connection.c
--- a/src/director/auth-connection.c Wed May 13 12:24:02 2015 +0300
+++ b/src/director/auth-connection.c Wed May 13 13:15:57 2015 +0300
@@ -121,10 +121,12 @@
conn->callback(NULL, conn->context);
}
-struct ostream *auth_connection_send(struct auth_connection *conn)
+void auth_connection_send(struct auth_connection *conn,
+ const void *data, size_t size)
{
- i_assert(conn->output != NULL);
- return conn->output;
+ i_assert(conn->fd != -1);
+
+ o_stream_nsend(conn->output, data, size);
}
void auth_connections_deinit(void)
diff -r f5749f22276b -r 67fdd6f962f5 src/director/auth-connection.h
--- a/src/director/auth-connection.h Wed May 13 12:24:02 2015 +0300
+++ b/src/director/auth-connection.h Wed May 13 13:15:57 2015 +0300
@@ -13,8 +13,9 @@
/* Start connecting. Returns 0 if ok, -1 if connect failed. */
int auth_connection_connect(struct auth_connection *conn);
-/* Get auth connection's output stream. */
-struct ostream *auth_connection_send(struct auth_connection *conn);
+/* Send data to auth connection. */
+void auth_connection_send(struct auth_connection *conn,
+ const void *data, size_t size);
void auth_connections_deinit(void);
diff -r f5749f22276b -r 67fdd6f962f5 src/director/login-connection.c
--- a/src/director/login-connection.c Wed May 13 12:24:02 2015 +0300
+++ b/src/director/login-connection.c Wed May 13 13:15:57 2015 +0300
@@ -3,10 +3,8 @@
#include "lib.h"
#include "ioloop.h"
#include "net.h"
-#include "istream.h"
#include "ostream.h"
#include "llist.h"
-#include "str.h"
#include "master-service.h"
#include "director.h"
#include "director-request.h"
@@ -22,14 +20,12 @@
int fd;
struct io *io;
- struct istream *input;
struct ostream *output;
struct auth_connection *auth;
struct director *dir;
unsigned int destroyed:1;
unsigned int userdb:1;
- unsigned int input_newline:1;
};
struct login_host_request {
@@ -44,66 +40,25 @@
static struct login_connection *login_connections;
-static void auth_input_line(const char *line, void *context);
static void login_connection_unref(struct login_connection **_conn);
-static void
-login_connection_director_lookup(struct login_connection *conn,
- const unsigned char *data, size_t size)
-{
- T_BEGIN {
- string_t *line = t_str_new(128);
- str_append(line, "OK\t");
- str_append_n(line, data, size);
- auth_input_line(str_c(line), conn);
- } T_END;
-}
-
static void login_connection_input(struct login_connection *conn)
{
- const unsigned char *data, *p;
- size_t size;
- struct ostream *auth_output;
+ unsigned char buf[4096];
+ ssize_t ret;
- auth_output = auth_connection_send(conn->auth);
- switch (i_stream_read(conn->input)) {
- case -2:
- data = i_stream_get_data(conn->input, &size);
- o_stream_nsend(auth_output, data, size);
- i_stream_skip(conn->input, size);
- conn->input_newline = FALSE;
- return;
- case -1:
- if (conn->input->stream_errno != 0 &&
- conn->input->stream_errno != ECONNRESET) {
- i_error("read(login connection) failed: %s",
- i_stream_get_error(conn->input));
+ ret = read(conn->fd, buf, sizeof(buf));
+ if (ret <= 0) {
+ if (ret < 0) {
+ if (errno == EAGAIN)
+ return;
+ if (errno != ECONNRESET)
+ i_error("read(login connection) failed: %m");
}
login_connection_deinit(&conn);
return;
- case 0:
- return;
- default:
- break;
}
-
- o_stream_cork(auth_output);
- data = i_stream_get_data(conn->input, &size);
- while ((p = memchr(data, '\n', size)) != NULL) {
- size_t linelen = p-data;
-
- if (!conn->input_newline || linelen <= 16 ||
- memcmp(data, "DIRECTOR-LOOKUP\t", 16) != 0) {
- /* forward data to auth process */
- o_stream_nsend(auth_output, data, linelen+1);
- conn->input_newline = TRUE;
- } else {
- login_connection_director_lookup(conn, data+16, linelen-16);
- }
- i_stream_skip(conn->input, linelen+1);
- data = i_stream_get_data(conn->input, &size);
- }
- o_stream_uncork(auth_output);
+ auth_connection_send(conn->auth, buf, ret);
}
static void
@@ -260,12 +215,10 @@
conn->fd = fd;
conn->auth = auth;
conn->dir = dir;
- conn->input = i_stream_create_fd(conn->fd, IO_BLOCK_SIZE, FALSE);
conn->output = o_stream_create_fd(conn->fd, (size_t)-1, FALSE);
o_stream_set_no_error_handling(conn->output, TRUE);
conn->io = io_add(conn->fd, IO_READ, login_connection_input, conn);
conn->userdb = userdb;
- conn->input_newline = TRUE;
auth_connection_set_callback(conn->auth, auth_input_line, conn);
DLLIST_PREPEND(&login_connections, conn);
@@ -284,7 +237,6 @@
DLLIST_REMOVE(&login_connections, conn);
io_remove(&conn->io);
- i_stream_destroy(&conn->input);
o_stream_destroy(&conn->output);
if (close(conn->fd) < 0)
i_error("close(login connection) failed: %m");
More information about the dovecot-cvs
mailing list