Lines Matching refs:client

33 struct client *managesieve_clients = NULL;
52 static void client_idle_timeout(struct client *client) in client_idle_timeout() argument
54 if (client->cmd.func != NULL) { in client_idle_timeout()
55 client_destroy(client, in client_idle_timeout()
58 client_send_bye(client, "Disconnected for inactivity"); in client_idle_timeout()
59 client_destroy(client, "Disconnected for inactivity"); in client_idle_timeout()
104 struct client *
110 struct client *client; in client_create() local
138 client = p_new(pool, struct client, 1); in client_create()
139 client->pool = pool; in client_create()
140 client->event = event; in client_create()
141 event_ref(client->event); in client_create()
142 client->set = set; in client_create()
143 client->service_user = service_user; in client_create()
144 client->session_id = p_strdup(pool, session_id); in client_create()
145 client->fd_in = fd_in; in client_create()
146 client->fd_out = fd_out; in client_create()
147 client->input = i_stream_create_fd( in client_create()
149 client->output = o_stream_create_fd(fd_out, (size_t)-1); in client_create()
151 o_stream_set_no_error_handling(client->output, TRUE); in client_create()
152 i_stream_set_name(client->input, "<managesieve client>"); in client_create()
153 o_stream_set_name(client->output, "<managesieve client>"); in client_create()
155 o_stream_set_flush_callback(client->output, client_output, client); in client_create()
157 client->last_input = ioloop_time; in client_create()
158 client->to_idle = timeout_add(CLIENT_IDLE_TIMEOUT_MSECS, in client_create()
159 client_idle_timeout, client); in client_create()
161 client->cmd.pool = pool_alloconly_create( in client_create()
163 client->cmd.client = client; in client_create()
164 client->cmd.event = event_create(client->event); in client_create()
165 client->user = user; in client_create()
167 client->svinst = svinst; in client_create()
168 client->storage = storage; in client_create()
170 ident = mail_user_get_anvil_userip_ident(client->user); in client_create()
176 client->anvil_sent = TRUE; in client_create()
180 DLLIST_PREPEND(&managesieve_clients, client); in client_create()
182 hook_client_created(&client); in client_create()
185 return client; in client_create()
188 void client_create_finish(struct client *client) in client_create_finish() argument
190 if (client->set->rawlog_dir[0] != '\0') { in client_create_finish()
191 (void)iostream_rawlog_create(client->set->rawlog_dir, in client_create_finish()
192 &client->input, &client->output); in client_create_finish()
194 client->parser = managesieve_parser_create( in client_create_finish()
195 client->input, client->set->managesieve_max_line_length); in client_create_finish()
196 client->io = io_add_istream(client->input, client_input, client); in client_create_finish()
199 static const char *client_stats(struct client *client) in client_stats() argument
202 { 'i', dec2str(i_stream_get_absolute_offset(client->input)), in client_stats()
204 { 'o', dec2str(client->output->offset), "output" }, in client_stats()
205 { '\0', dec2str(client->put_bytes), "put_bytes" }, in client_stats()
206 { '\0', dec2str(client->put_count), "put_count" }, in client_stats()
207 { '\0', dec2str(client->get_bytes), "get_bytes" }, in client_stats()
208 { '\0', dec2str(client->get_count), "get_count" }, in client_stats()
209 { '\0', dec2str(client->check_bytes), "check_bytes" }, in client_stats()
210 { '\0', dec2str(client->check_count), "check_count" }, in client_stats()
211 { '\0', dec2str(client->deleted_count), "deleted_count" }, in client_stats()
212 { '\0', dec2str(client->renamed_count), "renamed_count" }, in client_stats()
213 { '\0', client->session_id, "session" }, in client_stats()
217 mail_user_var_expand_table(client->user); in client_stats()
224 if (var_expand_with_funcs(str, client->set->managesieve_logout_format, in client_stats()
226 client->user, &error) < 0) { in client_stats()
228 client->set->managesieve_logout_format, error); in client_stats()
233 void client_destroy(struct client *client, const char *reason) in client_destroy() argument
237 i_assert(!client->handling_input); in client_destroy()
238 i_assert(!client->destroyed); in client_destroy()
239 client->destroyed = TRUE; in client_destroy()
241 client_disconnect(client, reason); in client_destroy()
243 if (client->command_pending) { in client_destroy()
245 i_assert(client->cmd.func != NULL); in client_destroy()
247 i_stream_close(client->input); in client_destroy()
248 o_stream_close(client->output); in client_destroy()
250 client->input_pending = FALSE; in client_destroy()
252 ret = client->cmd.func(&client->cmd); in client_destroy()
256 if (client->anvil_sent) { in client_destroy()
260 mail_user_get_anvil_userip_ident(client->user), in client_destroy()
264 managesieve_parser_destroy(&client->parser); in client_destroy()
265 io_remove(&client->io); in client_destroy()
266 timeout_remove(&client->to_idle_output); in client_destroy()
267 timeout_remove(&client->to_idle); in client_destroy()
270 net_disconnect(client->fd_in); in client_destroy()
271 if (client->fd_in != client->fd_out) in client_destroy()
272 net_disconnect(client->fd_out); in client_destroy()
276 mail_user_unref(&client->user); in client_destroy()
280 i_stream_destroy(&client->input); in client_destroy()
281 o_stream_destroy(&client->output); in client_destroy()
283 sieve_storage_unref(&client->storage); in client_destroy()
284 sieve_deinit(&client->svinst); in client_destroy()
286 event_unref(&client->cmd.event); in client_destroy()
287 pool_unref(&client->cmd.pool); in client_destroy()
288 mail_storage_service_user_unref(&client->service_user); in client_destroy()
291 DLLIST_REMOVE(&managesieve_clients, client); in client_destroy()
292 event_unref(&client->event); in client_destroy()
293 pool_unref(&client->pool); in client_destroy()
299 static void client_destroy_timeout(struct client *client) in client_destroy_timeout() argument
301 client_destroy(client, NULL); in client_destroy_timeout()
304 void client_disconnect(struct client *client, const char *reason) in client_disconnect() argument
306 if (client->disconnected) in client_disconnect()
310 reason = io_stream_get_disconnect_reason(client->input, in client_disconnect()
311 client->output); in client_disconnect()
312 i_info("%s %s", reason, client_stats(client)); in client_disconnect()
314 i_info("Disconnected: %s %s", reason, client_stats(client)); in client_disconnect()
316 client->disconnected = TRUE; in client_disconnect()
317 o_stream_flush(client->output); in client_disconnect()
318 o_stream_uncork(client->output); in client_disconnect()
320 i_stream_close(client->input); in client_disconnect()
321 o_stream_close(client->output); in client_disconnect()
323 timeout_remove(&client->to_idle); in client_disconnect()
324 if (!client->destroyed) in client_disconnect()
325 client->to_idle = timeout_add(0, client_destroy_timeout, client); in client_disconnect()
328 void client_disconnect_with_error(struct client *client, const char *msg) in client_disconnect_with_error() argument
330 client_send_bye(client, msg); in client_disconnect_with_error()
331 client_disconnect(client, msg); in client_disconnect_with_error()
334 int client_send_line(struct client *client, const char *data) in client_send_line() argument
338 if (client->output->closed) in client_send_line()
346 if (o_stream_sendv(client->output, iov, 2) < 0) in client_send_line()
348 client->last_output = ioloop_time; in client_send_line()
350 if (o_stream_get_buffer_used_size(client->output) >= in client_send_line()
353 return o_stream_flush(client->output); in client_send_line()
358 void client_send_response(struct client *client, const char *oknobye, in client_send_response() argument
377 client_send_line(client, str_c(str)); in client_send_response()
392 struct client *client = cmd->client; in client_send_command_error() local
397 msg = managesieve_parser_get_error(client->parser, &fatal); in client_send_command_error()
399 client_disconnect_with_error(client, msg); in client_send_command_error()
413 client_send_no(client, error); in client_send_command_error()
415 if (++client->bad_counter >= CLIENT_MAX_BAD_COMMANDS) { in client_send_command_error()
417 client, "Too many invalid MANAGESIEVE commands."); in client_send_command_error()
437 struct client *client = cmd->client; in client_command_storage_error() local
438 struct sieve_storage *storage = client->storage; in client_command_storage_error()
447 client_send_noresp(client, "TRYLATER", error); in client_command_storage_error()
450 client_send_noresp(client, "QUOTA", error); in client_command_storage_error()
453 client_send_noresp(client, "NONEXISTENT", error); in client_command_storage_error()
456 client_send_noresp(client, "ACTIVE", error); in client_command_storage_error()
459 client_send_noresp(client, "ALREADYEXISTS", error); in client_command_storage_error()
463 client_send_no(client, error); in client_command_storage_error()
490 ret = managesieve_parser_read_args(cmd->client->parser, in client_read_args()
516 if (cmd->client->input->closed) { in client_read_args()
564 void _client_reset_command(struct client *client) in _client_reset_command() argument
571 client->last_input = ioloop_time; in _client_reset_command()
572 timeout_reset(client->to_idle); in _client_reset_command()
574 client->command_pending = FALSE; in _client_reset_command()
575 if (client->io == NULL && !client->disconnected) { in _client_reset_command()
576 i_assert(i_stream_get_fd(client->input) >= 0); in _client_reset_command()
577 client->io = io_add(i_stream_get_fd(client->input), in _client_reset_command()
578 IO_READ, client_input, client); in _client_reset_command()
580 o_stream_set_flush_callback(client->output, client_output, client); in _client_reset_command()
582 event_unref(&client->cmd.event); in _client_reset_command()
584 pool = client->cmd.pool; in _client_reset_command()
585 i_zero(&client->cmd); in _client_reset_command()
588 client->cmd.pool = pool; in _client_reset_command()
589 client->cmd.client = client; in _client_reset_command()
591 client->cmd.event = event_create(client->event); in _client_reset_command()
593 managesieve_parser_reset(client->parser); in _client_reset_command()
598 (void)i_stream_get_data(client->input, &size); in _client_reset_command()
599 if (size > 0 && !client->destroyed) in _client_reset_command()
600 client->input_pending = TRUE; in _client_reset_command()
605 static bool client_skip_line(struct client *client) in client_skip_line() argument
610 data = i_stream_get_data(client->input, &data_size); in client_skip_line()
614 client->input_skip_line = FALSE; in client_skip_line()
620 i_stream_skip(client->input, i); in client_skip_line()
621 return !client->input_skip_line; in client_skip_line()
626 struct client *client = cmd->client; in client_handle_input() local
639 client->bad_counter = 0; in client_handle_input()
640 _client_reset_command(client); in client_handle_input()
645 if (client->command_pending) in client_handle_input()
646 o_stream_set_flush_pending(client->output, TRUE); in client_handle_input()
650 if (client->input_skip_line) { in client_handle_input()
652 if (!client_skip_line(client)) in client_handle_input()
656 _client_reset_command(client); in client_handle_input()
662 cmd->name = managesieve_parser_read_word(client->parser); in client_handle_input()
679 client->input_skip_line = TRUE; in client_handle_input()
683 _client_reset_command(client); in client_handle_input()
685 i_assert(!client->disconnected); in client_handle_input()
694 void client_input(struct client *client) in client_input() argument
696 struct client_command_context *cmd = &client->cmd; in client_input()
699 if (client->command_pending) { in client_input()
701 io_remove(&client->io); in client_input()
705 client->input_pending = FALSE; in client_input()
706 client->last_input = ioloop_time; in client_input()
707 timeout_reset(client->to_idle); in client_input()
709 switch (i_stream_read(client->input)) { in client_input()
712 client_destroy(client, NULL); in client_input()
718 client->input_skip_line = TRUE; in client_input()
721 _client_reset_command(client); in client_input()
725 client->handling_input = TRUE; in client_input()
726 o_stream_cork(client->output); in client_input()
731 } while (ret && !client->disconnected); in client_input()
732 o_stream_uncork(client->output); in client_input()
733 client->handling_input = FALSE; in client_input()
735 if (client->command_pending) in client_input()
736 client->input_pending = TRUE; in client_input()
738 if (client->output->closed) in client_input()
739 client_destroy(client, NULL); in client_input()
742 int client_output(struct client *client) in client_output() argument
744 struct client_command_context *cmd = &client->cmd; in client_output()
748 client->last_output = ioloop_time; in client_output()
749 timeout_reset(client->to_idle); in client_output()
750 if (client->to_idle_output != NULL) in client_output()
751 timeout_reset(client->to_idle_output); in client_output()
753 if ((ret = o_stream_flush(client->output)) < 0) { in client_output()
754 client_destroy(client, NULL); in client_output()
758 if (!client->command_pending) in client_output()
762 o_stream_cork(client->output); in client_output()
763 client->output_pending = TRUE; in client_output()
769 if (!finished && client->output_pending) in client_output()
770 o_stream_set_flush_pending(client->output, TRUE); in client_output()
772 o_stream_uncork(client->output); in client_output()
776 client->bad_counter = 0; in client_output()
777 _client_reset_command(client); in client_output()
779 if (client->input_pending) in client_output()
780 client_input(client); in client_output()