Lines Matching refs:conn
72 static void server_connection_input(struct server_connection *conn);
73 static bool server_connection_input_one(struct server_connection *conn);
118 static int server_connection_send_cmd_input_more(struct server_connection *conn)
124 o_stream_set_max_buffer_size(conn->cmd_output, IO_BLOCK_SIZE);
125 res = o_stream_send_istream(conn->cmd_output, conn->cmd_input);
126 o_stream_set_max_buffer_size(conn->cmd_output, (size_t)-1);
137 i_stream_get_name(conn->cmd_input),
138 i_stream_get_error(conn->cmd_input));
142 o_stream_get_name(conn->cmd_output),
143 o_stream_get_error(conn->cmd_output));
147 if ((ret = o_stream_finish(conn->cmd_output)) == 0)
151 o_stream_get_name(conn->cmd_output),
152 o_stream_get_error(conn->cmd_output));
156 i_stream_destroy(&conn->cmd_input);
157 o_stream_destroy(&conn->cmd_output);
161 static void server_connection_send_cmd_input(struct server_connection *conn)
163 if (conn->cmd_input == NULL)
166 conn->cmd_output = o_stream_create_dot(conn->output, TRUE);
167 (void)server_connection_send_cmd_input_more(conn);
170 static int server_connection_output(struct server_connection *conn)
174 ret = o_stream_flush(conn->output);
175 if (ret > 0 && conn->cmd_input != NULL && conn->delayed_cmd == NULL)
176 ret = server_connection_send_cmd_input_more(conn);
178 server_connection_destroy(&conn);
183 server_connection_callback(struct server_connection *conn,
186 server_cmd_callback_t *callback = conn->callback;
188 conn->callback = NULL;
189 callback(exit_code, error, conn->context);
199 static void server_flush_field(struct server_connection *conn, string_t *str,
202 if (conn->streaming) {
203 conn->streaming = FALSE;
215 server_handle_input(struct server_connection *conn,
221 if (printing_conn == conn) {
224 printing_conn = conn;
228 server_set_print_pending(conn->server);
229 io_remove(&conn->io);
243 server_connection_destroy(&conn);
246 conn->state = SERVER_REPLY_STATE_RET;
247 i_stream_skip(conn->input, i + 1);
253 server_flush_field(conn, str, data + start, i - start);
258 conn->streaming = TRUE;
261 i_stream_skip(conn->input, size);
264 static void server_connection_authenticated(struct server_connection *conn)
266 conn->authenticated = TRUE;
267 if (conn->delayed_cmd != NULL) {
268 o_stream_nsend_str(conn->output, conn->delayed_cmd);
269 conn->delayed_cmd = NULL;
270 server_connection_send_cmd_input(conn);
275 server_connection_authenticate(struct server_connection *conn)
280 if (*conn->set->doveadm_password == '\0') {
287 str_append(plain, conn->set->doveadm_username);
289 str_append(plain, conn->set->doveadm_password);
295 o_stream_nsend(conn->output, cmd->data, cmd->used);
296 conn->authenticate_sent = TRUE;
300 static void server_log_disconnect_error(struct server_connection *conn)
304 error = conn->ssl_iostream == NULL ? NULL :
305 ssl_iostream_get_last_error(conn->ssl_iostream);
307 error = conn->input->stream_errno == 0 ? "EOF" :
308 strerror(conn->input->stream_errno);
313 static void server_connection_print_log(struct server_connection *conn)
319 while((line = i_stream_read_next_line(conn->log_input))!=NULL) {
327 i_log_type(&ctx, "remote(%s): %s", conn->server->name, line);
331 static void server_connection_start_multiplex(struct server_connection *conn)
333 struct istream *is = conn->input;
334 conn->input = i_stream_create_multiplex(is, MAX_INBUF_SIZE);
336 io_remove(&conn->io);
337 conn->io = io_add_istream(conn->input, server_connection_input, conn);
338 conn->log_input = i_stream_multiplex_add_channel(conn->input, DOVEADM_LOG_CHANNEL_ID);
339 conn->io_log = io_add_istream(conn->log_input, server_connection_print_log, conn);
340 i_stream_set_return_partial_line(conn->log_input, TRUE);
343 static void server_connection_input(struct server_connection *conn)
347 timeout_remove(&conn->to_input);
349 if (i_stream_read(conn->input) < 0) {
351 server_log_disconnect_error(conn);
352 server_connection_destroy(&conn);
356 while (!conn->authenticated) {
357 if ((line = i_stream_next_line(conn->input)) == NULL) {
358 if (conn->input->eof) {
360 server_log_disconnect_error(conn);
361 server_connection_destroy(&conn);
368 if (!conn->version_received &&
372 &conn->minor)) {
375 server_connection_destroy(&conn);
378 conn->version_received = TRUE;
380 if (conn->minor > 0)
381 server_connection_start_multiplex(conn);
382 server_connection_authenticated(conn);
384 if (conn->authenticate_sent) {
387 server_connection_destroy(&conn);
390 if (server_connection_authenticate(conn) < 0) {
391 server_connection_destroy(&conn);
397 server_connection_destroy(&conn);
402 while (server_connection_input_one(conn)) ;
405 static bool server_connection_input_one(struct server_connection *conn)
414 if (conn->log_input != NULL)
415 (void)server_connection_print_log(conn);
417 data = i_stream_get_data(conn->input, &size);
421 switch (conn->state) {
424 server_connection_destroy(&conn);
427 server_handle_input(conn, data, size);
428 if (conn->state != SERVER_REPLY_STATE_RET)
432 line = i_stream_next_line(conn->input);
436 server_connection_callback(conn, 0, "");
445 server_connection_callback(conn, exit_code, line);
449 server_connection_destroy(&conn);
452 if (conn->callback == NULL) {
454 server_connection_destroy(&conn);
462 static int server_connection_read_settings(struct server_connection *conn)
478 (void)net_getsockname(conn->fd, &input.local_ip, &port);
479 (void)net_getpeername(conn->fd, &input.remote_ip, &port);
487 conn->set = settings_dup(&doveadm_setting_parser_info, set, conn->pool);
493 struct server_connection *conn = context;
495 if (ssl_iostream_check_cert_validity(conn->ssl_iostream,
496 conn->server->hostname,
500 i_debug("%s: SSL handshake successful", conn->server->name);
504 static int server_connection_init_ssl(struct server_connection *conn)
509 if (conn->server->ssl_ctx == NULL)
515 if (io_stream_create_ssl_client(conn->server->ssl_ctx,
516 conn->server->hostname, &ssl_set,
517 &conn->input, &conn->output,
518 &conn->ssl_iostream, &error) < 0) {
522 ssl_iostream_set_handshake_callback(conn->ssl_iostream,
524 conn);
525 if (ssl_iostream_handshake(conn->ssl_iostream) < 0) {
527 ssl_iostream_get_last_error(conn->ssl_iostream));
536 struct server_connection *conn;
540 conn = p_new(pool, struct server_connection, 1);
541 conn->pool = pool;
542 conn->server = server;
543 conn->fd = doveadm_connect_with_default_port(server->name,
545 net_set_nonblock(conn->fd, TRUE);
546 conn->input = i_stream_create_fd(conn->fd, MAX_INBUF_SIZE);
547 conn->output = o_stream_create_fd(conn->fd, (size_t)-1);
548 o_stream_set_flush_callback(conn->output, server_connection_output, conn);
549 o_stream_set_no_error_handling(conn->output, TRUE);
551 i_stream_set_name(conn->input, server->name);
552 o_stream_set_name(conn->output, server->name);
554 array_append(&conn->server->connections, &conn, 1);
556 if (server_connection_read_settings(conn) < 0 ||
557 server_connection_init_ssl(conn) < 0) {
558 server_connection_destroy(&conn);
561 conn->io = io_add_istream(conn->input, server_connection_input, conn);
563 conn->state = SERVER_REPLY_STATE_DONE;
564 o_stream_nsend_str(conn->output, DOVEADM_SERVER_PROTOCOL_VERSION_LINE"\n");
566 *conn_r = conn;
572 struct server_connection *conn = *_conn;
579 conns = array_get(&conn->server->connections, &count);
581 if (conns[i] == conn) {
582 array_delete(&conn->server->connections, i, 1);
587 if (conn->callback != NULL) {
588 error = conn->ssl_iostream == NULL ? NULL :
589 ssl_iostream_get_last_error(conn->ssl_iostream);
591 error = conn->input->stream_errno == 0 ? "EOF" :
592 strerror(conn->input->stream_errno);
594 server_connection_callback(conn, SERVER_EXIT_CODE_DISCONNECTED,
597 if (printing_conn == conn)
600 timeout_remove(&conn->to_input);
601 i_stream_destroy(&conn->input);
602 o_stream_destroy(&conn->output);
603 i_stream_destroy(&conn->cmd_input);
605 o_stream_destroy(&conn->cmd_output);
606 if (conn->ssl_iostream != NULL)
607 ssl_iostream_unref(&conn->ssl_iostream);
608 io_remove(&conn->io_log);
610 if (conn->log_input != NULL)
611 server_connection_print_log(conn);
612 i_stream_unref(&conn->log_input);
613 io_remove(&conn->io);
614 i_close_fd(&conn->fd);
615 pool_unref(&conn->pool);
619 server_connection_get_server(struct server_connection *conn)
621 return conn->server;
624 void server_connection_cmd(struct server_connection *conn, const char *line,
628 i_assert(conn->delayed_cmd == NULL);
630 conn->state = SERVER_REPLY_STATE_PRINT;
632 i_assert(conn->cmd_input == NULL);
634 conn->cmd_input = cmd_input;
636 if (!conn->authenticated)
637 conn->delayed_cmd = p_strdup(conn->pool, line);
639 o_stream_nsend_str(conn->output, line);
640 server_connection_send_cmd_input(conn);
642 conn->callback = callback;
643 conn->context = context;
646 bool server_connection_is_idle(struct server_connection *conn)
648 return conn->callback == NULL;
651 void server_connection_extract(struct server_connection *conn,
656 *istream_r = conn->input;
657 *ostream_r = conn->output;
658 *ssl_iostream_r = conn->ssl_iostream;
660 conn->input = NULL;
661 conn->output = NULL;
662 conn->ssl_iostream = NULL;
663 io_remove(&conn->io);
664 conn->fd = -1;