server-connection.c revision 956b8eea7ae479a38b25175447fc8eac2df30480
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (c) 2010-2013 Dovecot authors, see the included COPYING file */
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainenstatic struct server_connection *printing_conn = NULL;
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainenstatic void server_connection_input(struct server_connection *conn);
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen struct doveadm_server *server = printing_conn->server;
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainen unsigned int i, count;
4ce6338bf945cccfff9e4ce7cc6aa2246851b84aTimo Sirainen conns = array_get(&server->connections, &count);
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen for (i = 0; i < count; i++) {
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainenserver_connection_callback(struct server_connection *conn,
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen server_cmd_callback_t *callback = conn->callback;
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainenstatic void stream_data(string_t *str, const unsigned char *data, size_t size)
7026c16186f543e11af12b8b87f396006db93297Timo Sirainen text = str_tabunescape(str_c_modifiable(str));
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainenstatic void server_flush_field(struct server_connection *conn, string_t *str,
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainen text = str_tabunescape(str_c_modifiable(str));
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainenserver_handle_input(struct server_connection *conn,
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen /* continue printing */
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen /* someone else is printing. don't continue until it
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainen /* last character is an escape */
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen i_error("doveadm server sent broken print input");
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen server_flush_field(conn, str, data + start, i - start);
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainenstatic void server_connection_authenticated(struct server_connection *conn)
beffc30d933c5e134c45cc871852a8427eba7e70Timo Sirainen o_stream_nsend_str(conn->output, conn->delayed_cmd);
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainenserver_connection_authenticate(struct server_connection *conn)
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen "can't authenticate to remote server");
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen str_append(plain, conn->set->doveadm_password);
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen o_stream_nsend(conn->output, cmd->data, cmd->used);
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainenstatic void server_connection_input(struct server_connection *conn)
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen const unsigned char *data;
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen if ((line = i_stream_read_next_line(conn->input)) == NULL) {
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen if (conn->input->eof || conn->input->stream_errno != 0)
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen if (server_connection_authenticate(conn) < 0) {
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen i_error("doveadm server sent invalid handshake: %s",
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen /* disconnected */
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen if ((line = i_stream_next_line(conn->input)) == NULL)
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen i_error("doveadm authentication failed (%s)", line+1);
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen i_error("doveadm server sent unexpected input");
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen /* fall through */
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen /* old doveadm-server */
f89cb43088c8b46d12d66ac924724b53ab14ce66Timo Sirainen server_connection_callback(conn, exit_code, line);
9511a40d933181045343110c8101b75887062aaeTimo Sirainen /* we're finished, close the connection */
const char *error;
unsigned int port;
void *set;
const char *host, *p;
if (p != NULL)
if (doveadm_debug)
const char *error;
conn);
const char *error;
unsigned int i, count;
for (i = 0; i < count; i++) {
error);
struct doveadm_server *