anvil-connection.c revision 5dd73391f9dfb2396cf2060402017f6080c93dc7
7cb128dc4cae2a03a742f63ba7afee23c78e3af0Phil Carmody/* Copyright (C) 2009 Dovecot authors, see the included COPYING file */
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen unsigned char *fifo_inbuf;
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenstruct anvil_connection *anvil_connections = NULL;
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenstatic const char *
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenanvil_connection_fifo_read_line(struct anvil_connection *conn)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen ret = read(conn->fd, conn->fifo_inbuf, conn->fifo_inbuf_size);
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen i_error("BUG: Client packet didn't end with LF");
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen /* disconnected */
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainenstatic const char *const *
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainenanvil_connection_next_line(struct anvil_connection *conn)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen return line == NULL ? NULL : t_strsplit(line, "\t");
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainenanvil_connection_request(struct anvil_connection *conn,
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen const char *const *args, const char **error_r)
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen unsigned int count;
d4c3d55021bcbf2b062f4782b1cde9115d35aefcTimo Sirainen connect_limit_connect(connect_limit, pid, args[1]);
d4c3d55021bcbf2b062f4782b1cde9115d35aefcTimo Sirainen *error_r = "DISCONNECT: Not enough parameters";
d4c3d55021bcbf2b062f4782b1cde9115d35aefcTimo Sirainen connect_limit_disconnect(connect_limit, pid, args[1]);
b6c48e71a9413ac90a0414dfeb7d1248c144eeb2Timo Sirainen *error_r = "KILL sent by a non-master connection";
d4c3d55021bcbf2b062f4782b1cde9115d35aefcTimo Sirainen connect_limit_disconnect_pid(connect_limit, pid);
8a2401de6de54250ba271bfc53524a847805e8f4Timo Sirainen *error_r = "LOOKUP on a FIFO, can't send reply";
d4c3d55021bcbf2b062f4782b1cde9115d35aefcTimo Sirainen count = connect_limit_lookup(connect_limit, args[0]);
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen *error_r = t_strconcat("Unknown command: ", cmd, NULL);
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenstatic void anvil_connection_input(void *context)
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen i_error("BUG: Anvil client connection sent too "
1183340bf4fda4040268aa4ba7a816b567659c08Timo Sirainen "much data");
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen if ((args = anvil_connection_next_line(conn)) == NULL)
46b0fad7bc31f63f6f969b487bef2178beb125faTimo Sirainen atoi(args[1]) != ANVIL_CLIENT_PROTOCOL_MAJOR_VERSION) {
8a2401de6de54250ba271bfc53524a847805e8f4Timo Sirainen i_error("Anvil client not compatible with this server "
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen "(mixed old and new binaries?)");
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen while ((args = anvil_connection_next_line(conn)) != NULL) {
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen if (anvil_connection_request(conn, args, &error) < 0)
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen i_error("Anvil client input error: %s", error);
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainenanvil_connection_create(int fd, bool master, bool fifo)
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen conn->input = i_stream_create_fd(fd, MAX_INBUF_SIZE, FALSE);
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen conn->output = o_stream_create_fd(fd, (size_t)-1, FALSE);
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen conn->fifo_inbuf = i_malloc(conn->fifo_inbuf_size);
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainen conn->io = io_add(fd, IO_READ, anvil_connection_input, conn);
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainenvoid anvil_connection_destroy(struct anvil_connection *conn)