summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorØyvind Harboe <oyvind.harboe@zylin.com>2010-09-27 09:24:51 +0200
committerØyvind Harboe <oyvind.harboe@zylin.com>2010-10-01 10:21:33 +0200
commitcb2dba2c1257e0aa80edc9a171a9c5cd7b2822f8 (patch)
tree437e9be13be7c6c6880a878da7acc7d1eb35b9a6
parent5a41435e45ae18c0823780382c214fb7324dbe7d (diff)
downloadopenocd+libswd-cb2dba2c1257e0aa80edc9a171a9c5cd7b2822f8.tar.gz
openocd+libswd-cb2dba2c1257e0aa80edc9a171a9c5cd7b2822f8.tar.bz2
openocd+libswd-cb2dba2c1257e0aa80edc9a171a9c5cd7b2822f8.tar.xz
openocd+libswd-cb2dba2c1257e0aa80edc9a171a9c5cd7b2822f8.zip
server: read/write now goes through connection fn's
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>
-rw-r--r--src/server/gdb_server.c2
-rw-r--r--src/server/server.c27
-rw-r--r--src/server/server.h3
-rw-r--r--src/server/tcl_server.c4
-rw-r--r--src/server/telnet_server.c4
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;