From be01d7b09986be39d84e0bb544b26d1b46a50b2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Thu, 3 Sep 1998 00:10:36 +0200 Subject: [PATCH] Fixed bug in UNLINK_FD. Rev: src/io.c:1.5 --- src/io.c | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/src/io.c b/src/io.c index 7436ec158..d8e3f1064 100644 --- a/src/io.c +++ b/src/io.c @@ -10,6 +10,7 @@ #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> +#include <arpa/inet.h> #include "io.h" #include "werror.h" @@ -52,11 +53,12 @@ static int do_read(struct fd_read *closure, UINT8 *buffer, UINT32 length) { \ type **(_fd); \ type *(fd); \ - for(_fd = &(list); ((fd) = *_fd); _fd = &(*_fd)->next, (extra)) + for(_fd = &(list); ((fd) = *_fd); (extra)) { -#define END_FOR_FDS } - +#define END_FOR_FDS _fd = &(*_fd)->next; } } + +/* UNLINK_FD must be followed by a continue, to avoid updating _fd */ #define UNLINK_FD (*_fd = (*_fd)->next) void io_run(struct io_backend *b) @@ -170,13 +172,15 @@ void io_run(struct io_backend *b) case EAGAIN: break; default: + werror("io.c: write failed, %s\n", strerror(errno)); CALLBACK(fd->close_callback); - /* FIXME: Must do this later. Perhaps add a - * closed flag to th io_fd struct? */ + fd->please_close = 1; break; } + else if (!res) + fatal("What now?"); else fd->buffer->start += res; } @@ -211,6 +215,7 @@ void io_run(struct io_backend *b) UNLINK_FD; free(fd->buffer); free(fd); + continue; } } END_FOR_FDS; @@ -221,8 +226,10 @@ void io_run(struct io_backend *b) { /* FIXME: Do something with the peer address? */ struct sockaddr_in peer; + size_t addr_len = sizeof(peer); - int conn = accept(fd->fd, &peer, sizeof(peer)); + int conn = accept(fd->fd, + (struct sockaddr *) &peer, &addr_len); if (conn < 0) { werror("io.c: accept() failed, %s", strerror(errno)); @@ -233,6 +240,7 @@ void io_run(struct io_backend *b) /* FIXME: Should fd be closed here? */ UNLINK_FD; free(fd); + continue; } } } @@ -240,12 +248,14 @@ void io_run(struct io_backend *b) FOR_FDS(struct connect_fd, fd, b->connect, i++) { - if (fds[i]->revents & POLLOUT) + if (fds[i].revents & POLLOUT) { if (!FD_CALLBACK(fd->callback, fd->fd)) fatal("What now?"); + b->nconnect--; UNLINK_FD; free(fd); + continue; } } END_FOR_FDS; @@ -363,7 +373,7 @@ struct connect_fd *io_connect(struct io_backend *b, fd = xalloc(sizeof(struct connect_fd)); fd->fd = s; - fd->callback = callback; + fd->callback = f; fd->next = b->connect; b->connect = fd; @@ -416,22 +426,22 @@ struct listen_fd *io_listen(struct io_backend *b, struct abstract_write *io_read_write(struct io_backend *b, int fd, - struct read_callback *read_callback, + struct read_handler *read_callback, UINT32 block_size, struct callback *close_callback) { - struct io_fd = xalloc(sizeof(struct io_fd)); + struct io_fd *f= xalloc(sizeof(struct io_fd)); struct write_buffer *buffer = write_buffer_alloc(block_size); - fd->fd = fd; - fd->please_close = 0; + f->fd = fd; + f->please_close = 0; - fd->read_callback = read_callback; - fd->close_callback = close_callback; - fd->buffer = buffer; + f->handler = read_callback; + f->close_callback = close_callback; + f->buffer = buffer; - fd->next = b->io; - b->io = fd; + f->next = b->io; + b->io = f; b->nio++; return (struct abstract_write *) buffer; -- GitLab