From 5a41435e45ae18c0823780382c214fb7324dbe7d Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Harboe?= Date: Mon, 27 Sep 2010 08:26:31 +0200 Subject: [PATCH] server: split file descriptors in in/out fd's MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit pipes have different fd's for in/out. This makes the code more orthogonal and prepares for adding pipes. Signed-off-by: Øyvind Harboe --- src/server/gdb_server.c | 17 +++-------------- src/server/server.c | 11 ++++++++--- src/server/server.h | 1 + src/server/tcl_server.c | 1 + src/server/telnet_server.c | 4 ++-- 5 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c index 76c3e363e9..7343b87c8b 100644 --- a/src/server/gdb_server.c +++ b/src/server/gdb_server.c @@ -176,7 +176,7 @@ static int gdb_get_char_inner(struct connection *connection, int* next_char) #endif for (;;) { - if (connection->service->type == CONNECTION_PIPE) + if (connection->service->type != CONNECTION_TCP) { gdb_con->buf_cnt = read(connection->fd, gdb_con->buffer, GDB_BUFFER_SIZE); } @@ -328,20 +328,9 @@ static int gdb_write(struct connection *connection, void *data, int len) if (gdb_con->closed) return ERROR_SERVER_REMOTE_CLOSED; - if (connection->service->type == CONNECTION_PIPE) + if (write_socket(connection->fd_out, data, len) == len) { - /* write to stdout */ - if (write(STDOUT_FILENO, data, len) == len) - { - return ERROR_OK; - } - } - else - { - if (write_socket(connection->fd, data, len) == len) - { - return ERROR_OK; - } + return ERROR_OK; } gdb_con->closed = 1; return ERROR_SERVER_REMOTE_CLOSED; diff --git a/src/server/server.c b/src/server/server.c index 3c85cd13b6..e67be13e4e 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -57,6 +57,7 @@ static int add_connection(struct service *service, struct command_context *cmd_c c = malloc(sizeof(struct connection)); c->fd = -1; + c->fd_out = -1; memset(&c->sin, 0, sizeof(c->sin)); c->cmd_ctx = copy_command_context(cmd_ctx); c->service = service; @@ -69,6 +70,7 @@ static int add_connection(struct service *service, struct command_context *cmd_c address_size = sizeof(c->sin); c->fd = accept(service->fd, (struct sockaddr *)&service->sin, &address_size); + c->fd_out = c->fd; /* This increases performance dramatically for e.g. GDB load which * does not have a sliding window protocol. */ @@ -90,6 +92,10 @@ static int add_connection(struct service *service, struct command_context *cmd_c else if (service->type == CONNECTION_PIPE) { c->fd = service->fd; + c->fd_out = fileno(stdout); + + /* do not check for new connections again on stdin */ + service->fd = -1; /* do not check for new connections again on stdin */ service->fd = -1; @@ -205,8 +211,7 @@ int add_service(char *name, enum connection_type type, unsigned short port, int } else if (type == CONNECTION_PIPE) { - /* use stdin */ - c->fd = STDIN_FILENO; + c->fd = fileno(stdin); #ifdef _WIN32 /* for win32 set stdin/stdout to binary mode */ @@ -384,7 +389,7 @@ int server_loop(struct command_context *command_context) } else { - if (service->type != CONNECTION_PIPE) + if (service->type == CONNECTION_TCP) { struct sockaddr_in sin; socklen_t address_size = sizeof(sin); diff --git a/src/server/server.h b/src/server/server.h index a25920ed0d..b13baaaa69 100644 --- a/src/server/server.h +++ b/src/server/server.h @@ -41,6 +41,7 @@ enum connection_type struct connection { int fd; + int fd_out; /* When using pipes we're writing to a different fd */ struct sockaddr_in sin; struct command_context *cmd_ctx; struct service *service; diff --git a/src/server/tcl_server.c b/src/server/tcl_server.c index 06f67ab76b..9aaee5c6cc 100644 --- a/src/server/tcl_server.c +++ b/src/server/tcl_server.c @@ -58,6 +58,7 @@ int tcl_output(struct connection *connection, const void *data, ssize_t len) return ERROR_SERVER_REMOTE_CLOSED; wlen = write_socket(connection->fd, data, len); + if (wlen == len) return ERROR_OK; diff --git a/src/server/telnet_server.c b/src/server/telnet_server.c index 10caee3168..92052ae88b 100644 --- a/src/server/telnet_server.c +++ b/src/server/telnet_server.c @@ -2,7 +2,7 @@ * Copyright (C) 2005 by Dominic Rath * * Dominic.Rath@gmx.de * * * - * Copyright (C) 2007,2008 Øyvind Harboe * + * Copyright (C) 2007-2010 Øyvind Harboe * * oyvind.harboe@zylin.com * * * * Copyright (C) 2008 by Spencer Oliver * @@ -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, data, len) == len) + if (write_socket(connection->fd_out, data, len) == len) { return ERROR_OK; } -- 2.30.2