connection.c revision a238c6fede2022e5a4af707107ffb8f047b7753f
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync/* Copyright (c) 2013-2016 Dovecot authors, see the included COPYING file */
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncstatic void connection_idle_timeout(struct connection *conn)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync conn->disconnect_reason = CONNECTION_DISCONNECT_IDLE_TIMEOUT;
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncstatic void connection_connect_timeout(struct connection *conn)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync conn->disconnect_reason = CONNECTION_DISCONNECT_CONNECT_TIMEOUT;
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncvoid connection_input_default(struct connection *conn)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync const char *line;
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync case 0: /* allow calling this function for buffered input */
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync while (!input->closed && (line = i_stream_next_line(input)) != NULL) {
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync conn->disconnect_reason = CONNECTION_DISCONNECT_DEINIT;
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncint connection_verify_version(struct connection *conn,
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync const char *const *args)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync /* VERSION <tab> service_name <tab> major version <tab> minor version */
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync i_error("%s didn't reply with a valid VERSION line",
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync if (strcmp(args[1], conn->list->set.service_name_in) != 0) {
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync if (recv_major_version != conn->list->set.major_version) {
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync "but we support only %u (mixed old and new binaries?)",
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncint connection_input_line_default(struct connection *conn, const char *line)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync const char *const *args;
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncstatic void connection_init_streams(struct connection *conn)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync const struct connection_settings *set = &conn->list->set;
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync conn->io = io_add_istream(conn->input, *conn->list->v.input, conn);
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync conn->io = io_add(conn->fd_in, IO_READ, *conn->list->v.input, conn);
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync o_stream_set_no_error_handling(conn->output, TRUE);
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync conn->to = timeout_add(set->input_idle_timeout_secs*1000,
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync if (set->major_version != 0 && !set->dont_send_version) {
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncstatic void connection_client_connected(struct connection *conn, bool success)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncvoid connection_init_server(struct connection_list *list,
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncvoid connection_init_client_ip(struct connection_list *list,
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync conn->name = i_strdup_printf("%s:%u", net_ip2addr(ip), port);
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncvoid connection_init_client_unix(struct connection_list *list,
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncvoid connection_init_from_streams(struct connection_list *list,
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync o_stream_set_no_error_handling(conn->output, TRUE);
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync conn->io = io_add_istream(conn->input, *list->v.input, conn);
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncstatic void connection_socket_connected(struct connection *conn)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncint connection_client_connect(struct connection *conn)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync const struct connection_settings *set = &conn->list->set;
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync else if (conn->list->set.unix_client_connect_msecs == 0)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync fd = net_connect_unix_with_retries(conn->name, conn->list->set.unix_client_connect_msecs);
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync conn->list->set.delayed_unix_client_connected_callback) {
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync conn->to = timeout_add(set->client_connect_timeout_msecs,
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync memset(&conn->last_input_tv, 0, sizeof(conn->last_input_tv));
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync if (conn->fd_in != conn->fd_out && close(conn->fd_out) < 0)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync /* buffer full */
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync /* disconnected */
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync /* nothing new read */
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync /* something was read */
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncconst char *connection_disconnect_reason(struct connection *conn)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync return "Deinitializing";
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync unsigned int msecs =
7c90a188b164765cebe27fa754d68a4321ded83evboxsync return t_strdup_printf("connect() timed out in %u.%03u secs",
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync return "Idle timeout";
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync /* fall through */
7c90a188b164765cebe27fa754d68a4321ded83evboxsync return io_stream_get_disconnect_reason(conn->input, conn->output);
7c90a188b164765cebe27fa754d68a4321ded83evboxsyncvoid connection_switch_ioloop(struct connection *conn)
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncconnection_list_init(const struct connection_settings *set,
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync set->input_full_behavior != CONNECTION_BEHAVIOR_ALLOW);
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsync list->v.input_line = connection_input_line_default;
2e848e79ccf2e4285250a0af98ddb9eb28864878vboxsyncvoid connection_list_deinit(struct connection_list **_list)