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