server: split file descriptors in in/out fd's
authorØyvind Harboe <oyvind.harboe@zylin.com>
Mon, 27 Sep 2010 06:26:31 +0000 (08:26 +0200)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Fri, 1 Oct 2010 08:21:33 +0000 (10:21 +0200)
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
src/server/server.c
src/server/server.h
src/server/tcl_server.c
src/server/telnet_server.c

index 76c3e363e9971396c3012df0ed533694ced21ad1..7343b87c8b0649bb320544c4847ba8e98c2da334 100644 (file)
@@ -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;
index 3c85cd13b6d468bfa29a67c6d98d35ef5d8eadd8..e67be13e4e03f43a10ab8097af18630708adbdf4 100644 (file)
@@ -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);
index a25920ed0d6495f6a759b0ed7820aa52c618a5c8..b13baaaa69c8478e0eeda69e453d79b19b452049 100644 (file)
@@ -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;
index 06f67ab76b82c0e128456ab8d844e44a2f75e766..9aaee5c6cc4f0f94ff3bcab08199b316ba12dec8 100644 (file)
@@ -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;
 
index 10caee31681948425cd152db037833cd92f43cb1..92052ae88bfec9fd732bdee9078b74e50e95d513 100644 (file)
@@ -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;
        }