summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorØyvind Harboe <oyvind.harboe@zylin.com>2010-09-27 08:26:31 +0200
committerØyvind Harboe <oyvind.harboe@zylin.com>2010-10-01 10:21:33 +0200
commit5a41435e45ae18c0823780382c214fb7324dbe7d (patch)
treecc9aa3f6c884328dcb4fbc969a7ba45b09ed8282 /src/server
parenta60a57d8ed1cb28de1eca0e2d6d78d70bd873663 (diff)
downloadopenocd+libswd-5a41435e45ae18c0823780382c214fb7324dbe7d.tar.gz
openocd+libswd-5a41435e45ae18c0823780382c214fb7324dbe7d.tar.bz2
openocd+libswd-5a41435e45ae18c0823780382c214fb7324dbe7d.tar.xz
openocd+libswd-5a41435e45ae18c0823780382c214fb7324dbe7d.zip
server: split file descriptors in in/out fd's
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>
Diffstat (limited to 'src/server')
-rw-r--r--src/server/gdb_server.c17
-rw-r--r--src/server/server.c11
-rw-r--r--src/server/server.h1
-rw-r--r--src/server/tcl_server.c1
-rw-r--r--src/server/telnet_server.c4
5 files changed, 15 insertions, 19 deletions
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;
}