From 5a41435e45ae18c0823780382c214fb7324dbe7d Mon Sep 17 00:00:00 2001
From: Øyvind Harboe <oyvind.harboe@zylin.com>
Date: Mon, 27 Sep 2010 08:26:31 +0200
Subject: server: split file descriptors in in/out fd's
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
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 <oyvind.harboe@zylin.com>
---
 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(-)

(limited to 'src')

diff --git a/src/server/gdb_server.c b/src/server/gdb_server.c
index 76c3e363..7343b87c 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 3c85cd13..e67be13e 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 a25920ed..b13baaaa 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 06f67ab7..9aaee5c6 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 10caee31..92052ae8 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;
 	}
-- 
cgit v1.2.3