static void client_input_putscript(struct client *client) { struct client_command_context *cmd = &client->cmd; i_assert(!client->destroyed); client->last_input = ioloop_time; timeout_reset(client->to_idle); switch (i_stream_read(client->input)) { case -1: /* disconnected */ cmd_putscript_finish(cmd->context); /* Reset command so that client_destroy() doesn't try to call cmd_putscript_continue_script() anymore. */ _client_reset_command(client); client_destroy(client, "Disconnected in PUTSCRIPT/CHECKSCRIPT"); return; case -2: cmd_putscript_finish(cmd->context); if (client->command_pending) { /* uploaded script data, this is handled internally by mailbox_save_continue() */ break; } /* parameter word is longer than max. input buffer size. this is most likely an error, so skip the new data until newline is found. */ client->input_skip_line = TRUE; client_send_command_error(cmd, "Too long argument."); cmd->param_error = TRUE; _client_reset_command(client); return; } if (cmd->func(cmd)) { /* command execution was finished. Note that if cmd_sync() didn't finish, we didn't get here but the input handler has already been moved. So don't do anything important here.. reset command once again to reset cmd_sync()'s changes. */ _client_reset_command(client); if (client->input_pending) client_input(client); } }
/* main processing loop */ static void process(int ux_sock) { struct pollfd *polls = NULL; while (1) { struct client *c; int i, poll_count; /* setup for a poll */ polls = x_realloc(polls, (1+num_clients) * sizeof(*polls)); polls[0].fd = ux_sock; polls[0].events = POLLIN; /* setup the clients */ for (i=1, c = clients; c; i++, c = c->next) { polls[i].fd = c->fd; polls[i].events = POLLIN; } /* most of our life is spent in this call */ poll_count = poll(polls, i, SLEEP_TIME); if (poll_count == -1) { /* something went badly wrong! */ perror("poll"); exit(1); } if (poll_count == 0) { /* timeout */ timer_processing(); continue; } /* see if a client wants to speak to us */ for (i=1, c = clients; c; i++) { struct client *next = c->next; if (polls[i].revents & POLLIN) { client_input(c); } c = next; } /* see if we got a new client */ if (polls[0].revents & POLLIN) { new_client(ux_sock); } } }
static void client_auth_failed(struct client *client) { i_free_and_null(client->master_data_prefix); if (client->auth_response != NULL) str_truncate(client->auth_response, 0); if (client->auth_initializing || client->destroyed) return; if (client->io != NULL) io_remove(&client->io); client->io = io_add(client->fd, IO_READ, client_input, client); client_input(client); }
void clients_notify_auth_connected(void) { struct client *client, *next; for (client = clients; client != NULL; client = next) { next = client->next; if (client->to_auth_waiting != NULL) timeout_remove(&client->to_auth_waiting); client_notify_auth_ready(client); if (client->input_blocked) { client->input_blocked = FALSE; client_input(client); } } }