From cb2dba2c1257e0aa80edc9a171a9c5cd7b2822f8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Harboe?= Date: Mon, 27 Sep 2010 09:24:51 +0200 Subject: [PATCH] server: read/write now goes through connection fn's MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit depending on whether the connection is over a socket or pipe, the read is done differently. pipes can return -1 when writing 0 bytes, make 0 byte writes a successful no-op. 0 byte writes falls out naturally of tcl server code. Signed-off-by: Øyvind Harboe --- src/server/gdb_server.c | 2 +- src/server/server.c | 27 +++++++++++++++++++++++++++ src/server/server.h | 3 +++ src/server/tcl_server.c | 4 ++-- src/server/telnet_server.c | 4 ++-- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 7343b87c..170dadc5 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -328,7 +328,7 @@ static int gdb_write(struct connection *connection, void *data, int len) if (gdb_con->closed) return ERROR_SERVER_REMOTE_CLOSED; - if (write_socket(connection->fd_out, data, len) == len) + if (connection_write(connection, data, len) == len) { return ERROR_OK; } diff --git a/src/server/server.c b/src/server/server.c index e67be13e..1c556638 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -513,6 +513,33 @@ int server_quit(void) return ERROR_OK; } +int connection_write(struct connection *connection, const void *data, int len) +{ + if (len == 0) + { + /* successful no-op. Sockets and pipes behave differently here... */ + return 0; + } + if (connection->service->type == CONNECTION_TCP) + { + return write_socket(connection->fd_out, data, len); + } else + { + return write(connection->fd_out, data, len); + } +} + +int connection_read(struct connection *connection, void *data, int len) +{ + if (connection->service->type == CONNECTION_TCP) + { + return read_socket(connection->fd, data, len); + } else + { + return read(connection->fd, data, len); + } +} + /* tell the server we want to shut down */ COMMAND_HANDLER(handle_shutdown_command) { diff --git a/src/server/server.h b/src/server/server.h index b13baaaa..46188bb4 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -83,6 +83,9 @@ int server_loop(struct command_context *command_context); int server_register_commands(struct command_context *context); +int connection_write(struct connection *connection, const void *data, int len); +int connection_read(struct connection *connection, void *data, int len); + /** * Used by server_loop(), defined in server_stubs.c, httpd.c, or ecosboard.c */ diff --git a/src/server/tcl_server.c b/src/server/tcl_server.c index 9aaee5c6..7d84de73 100644 --- a/src/server/tcl_server.c +++ b/src/server/tcl_server.c @@ -57,7 +57,7 @@ int tcl_output(struct connection *connection, const void *data, ssize_t len) if (tclc->tc_outerror) return ERROR_SERVER_REMOTE_CLOSED; - wlen = write_socket(connection->fd, data, len); + wlen = connection_write(connection, data, len); if (wlen == len) return ERROR_OK; @@ -92,7 +92,7 @@ static int tcl_input(struct connection *connection) struct tcl_connection *tclc; unsigned char in[256]; - rlen = read_socket(connection->fd, &in, sizeof(in)); + rlen = connection_read(connection, &in, sizeof(in)); if (rlen <= 0) { if (rlen < 0) LOG_ERROR("error during read: %s", strerror(errno)); diff --git a/src/server/telnet_server.c b/src/server/telnet_server.c index 92052ae8..ee8d3b16 100644 --- a/src/server/telnet_server.c +++ b/src/server/telnet_server.c @@ -51,7 +51,7 @@ static int telnet_write(struct connection *connection, const void *data, if (t_con->closed) return ERROR_SERVER_REMOTE_CLOSED; - if (write_socket(connection->fd_out, data, len) == len) + if (connection_write(connection, data, len) == len) { return ERROR_OK; } @@ -204,7 +204,7 @@ static int telnet_input(struct connection *connection) struct telnet_connection *t_con = connection->priv; struct command_context *command_context = connection->cmd_ctx; - bytes_read = read_socket(connection->fd, buffer, TELNET_BUFFER_SIZE); + bytes_read = connection_read(connection, buffer, TELNET_BUFFER_SIZE); if (bytes_read == 0) return ERROR_SERVER_REMOTE_CLOSED; -- 2.39.5