diff options
Diffstat (limited to 'server-client.c')
-rw-r--r-- | server-client.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/server-client.c b/server-client.c index 4cfc08a2..dfa4fa3a 100644 --- a/server-client.c +++ b/server-client.c @@ -1,4 +1,4 @@ -/* $Id: server-client.c,v 1.12 2009-11-04 22:46:25 tcunha Exp $ */ +/* $Id: server-client.c,v 1.13 2009-11-08 22:40:36 tcunha Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> @@ -18,6 +18,7 @@ #include <sys/types.h> +#include <event.h> #include <fcntl.h> #include <string.h> #include <time.h> @@ -133,7 +134,9 @@ server_client_lost(struct client *c) close(c->ibuf.fd); imsg_clear(&c->ibuf); - + event_del(&c->event); + event_del(&c->tty.event); + for (i = 0; i < ARRAY_LENGTH(&dead_clients); i++) { if (ARRAY_ITEM(&dead_clients, i) == NULL) { ARRAY_SET(&dead_clients, i, c); @@ -161,25 +164,31 @@ server_client_prepare(void) events = 0; if (!(c->flags & CLIENT_BAD)) - events |= POLLIN; + events |= EV_READ; if (c->ibuf.w.queued > 0) - events |= POLLOUT; - server_poll_add(c->ibuf.fd, events, server_client_callback, c); + events |= EV_WRITE; + event_del(&c->event); + event_set(&c->event, + c->ibuf.fd, events, server_client_callback, c); + event_add(&c->event, NULL); if (c->tty.fd == -1) continue; if (c->flags & CLIENT_SUSPENDED || c->session == NULL) continue; - events = POLLIN; + events = EV_READ; if (BUFFER_USED(c->tty.out) > 0) - events |= POLLOUT; - server_poll_add(c->tty.fd, events, server_client_callback, c); + events |= EV_WRITE; + event_del(&c->tty.event); + event_set(&c->tty.event, + c->tty.fd, events, server_client_callback, c); + event_add(&c->tty.event, NULL); } } /* Process a single client event. */ void -server_client_callback(int fd, int events, void *data) +server_client_callback(int fd, short events, void *data) { struct client *c = data; @@ -187,10 +196,7 @@ server_client_callback(int fd, int events, void *data) return; if (fd == c->ibuf.fd) { - if (events & (POLLERR|POLLNVAL|POLLHUP)) - goto client_lost; - - if (events & POLLOUT && msgbuf_write(&c->ibuf.w) < 0) + if (events & EV_WRITE && msgbuf_write(&c->ibuf.w) < 0) goto client_lost; if (c->flags & CLIENT_BAD) { @@ -199,7 +205,7 @@ server_client_callback(int fd, int events, void *data) return; } - if (events & POLLIN && server_client_msg_dispatch(c) != 0) + if (events & EV_READ && server_client_msg_dispatch(c) != 0) goto client_lost; } @@ -210,7 +216,7 @@ server_client_callback(int fd, int events, void *data) if (buffer_poll(fd, events, c->tty.in, c->tty.out) != 0) goto client_lost; } - + return; client_lost: @@ -423,7 +429,7 @@ server_client_check_redraw(struct client *c) if (c->flags & (CLIENT_REDRAW|CLIENT_STATUS)) { if (options_get_number(&s->options, "set-titles")) server_client_set_title(c); - + if (c->message_string != NULL) redraw = status_message_redraw(c); else if (c->prompt_string != NULL) |