server: read/write now goes through connection fn's
authorØyvind Harboe <oyvind.harboe@zylin.com>
Mon, 27 Sep 2010 07:24:51 +0000 (09:24 +0200)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Fri, 1 Oct 2010 08:21:33 +0000 (10:21 +0200)
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 <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 7343b87..170dadc 100644 (file)
@@ -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;
        }
index e67be13..1c55663 100644 (file)
@@ -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)
 {
index b13baaa..46188bb 100644 (file)
@@ -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
  */
index 9aaee5c..7d84de7 100644 (file)
@@ -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));
index 92052ae..ee8d3b1 100644 (file)
@@ -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;