connection.c revision 54c6a8135c0ded324f7ae7d0cdf1ef177004ee2d
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic void connection_idle_timeout(struct connection *conn)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi conn->disconnect_reason = CONNECTION_DISCONNECT_IDLE_TIMEOUT;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic void connection_connect_timeout(struct connection *conn)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi conn->disconnect_reason = CONNECTION_DISCONNECT_CONNECT_TIMEOUT;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid connection_input_default(struct connection *conn)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const char *line;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi case 0: /* allow calling this function for buffered input */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi while (!input->closed && (line = i_stream_next_line(input)) != NULL) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi conn->disconnect_reason = CONNECTION_DISCONNECT_DEINIT;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint connection_verify_version(struct connection *conn,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const char *const *args)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* VERSION <tab> service_name <tab> major version <tab> minor version */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi i_error("%s didn't reply with a valid VERSION line: %s",
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if (strcmp(args[1], conn->list->set.service_name_in) != 0) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if (recv_major_version != conn->list->set.major_version) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi "but we support only %u (mixed old and new binaries?)",
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint connection_input_line_default(struct connection *conn, const char *line)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const char *const *args;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if (args[0] == NULL && !conn->list->set.allow_empty_args_input) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi i_error("%s: Unexpectedly received empty line", conn->name);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid connection_input_halt(struct connection *conn)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid connection_input_resume(struct connection *conn)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const struct connection_settings *set = &conn->list->set;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if (conn->from_streams || set->input_max_size != 0) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi conn->io = io_add_istream_to(conn->ioloop, conn->input,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi conn->io = io_add_to(conn->ioloop, conn->fd_in, IO_READ,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic void connection_init_streams(struct connection *conn)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const struct connection_settings *set = &conn->list->set;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi i_stream_switch_ioloop_to(conn->input, conn->ioloop);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi o_stream_set_no_error_handling(conn->output, TRUE);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi o_stream_set_finish_via_child(conn->output, FALSE);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi o_stream_switch_ioloop_to(conn->output, conn->ioloop);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if (set->major_version != 0 && !set->dont_send_version) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid connection_streams_changed(struct connection *conn)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const struct connection_settings *set = &conn->list->set;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if (set->input_max_size != 0 && conn->io != NULL) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic void connection_client_connected(struct connection *conn, bool success)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid connection_init_server(struct connection_list *list,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid connection_init_client_ip_from(struct connection_list *list,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi conn->name = i_strdup_printf("%s:%u", net_ip2addr(ip), port);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid connection_init_client_ip(struct connection_list *list,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi connection_init_client_ip_from(list, conn, ip, port, NULL);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid connection_init_client_unix(struct connection_list *list,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid connection_init_from_streams(struct connection_list *list,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi o_stream_set_no_error_handling(conn->output, TRUE);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic void connection_socket_connected(struct connection *conn)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiint connection_client_connect(struct connection *conn)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const struct connection_settings *set = &conn->list->set;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi } else if (conn->list->set.unix_client_connect_msecs == 0)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi fd = net_connect_unix_with_retries(conn->name, conn->list->set.unix_client_connect_msecs);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi conn->list->set.delayed_unix_client_connected_callback) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi conn->io = io_add_to(conn->ioloop, conn->fd_out, IO_WRITE,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomivoid connection_disconnect(struct connection *conn)
i_unreached();
unsigned int msecs =
i_unreached();
return t_strdup_printf(
struct connection_list *
return list;