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>
This commit is contained in:
parent
a60a57d8ed
commit
5a41435e45
|
@ -176,7 +176,7 @@ static int gdb_get_char_inner(struct connection *connection, int* next_char)
|
||||||
#endif
|
#endif
|
||||||
for (;;)
|
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);
|
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)
|
if (gdb_con->closed)
|
||||||
return ERROR_SERVER_REMOTE_CLOSED;
|
return ERROR_SERVER_REMOTE_CLOSED;
|
||||||
|
|
||||||
if (connection->service->type == CONNECTION_PIPE)
|
if (write_socket(connection->fd_out, data, len) == len)
|
||||||
{
|
{
|
||||||
/* write to stdout */
|
return ERROR_OK;
|
||||||
if (write(STDOUT_FILENO, data, len) == len)
|
|
||||||
{
|
|
||||||
return ERROR_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (write_socket(connection->fd, data, len) == len)
|
|
||||||
{
|
|
||||||
return ERROR_OK;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
gdb_con->closed = 1;
|
gdb_con->closed = 1;
|
||||||
return ERROR_SERVER_REMOTE_CLOSED;
|
return ERROR_SERVER_REMOTE_CLOSED;
|
||||||
|
|
|
@ -57,6 +57,7 @@ static int add_connection(struct service *service, struct command_context *cmd_c
|
||||||
|
|
||||||
c = malloc(sizeof(struct connection));
|
c = malloc(sizeof(struct connection));
|
||||||
c->fd = -1;
|
c->fd = -1;
|
||||||
|
c->fd_out = -1;
|
||||||
memset(&c->sin, 0, sizeof(c->sin));
|
memset(&c->sin, 0, sizeof(c->sin));
|
||||||
c->cmd_ctx = copy_command_context(cmd_ctx);
|
c->cmd_ctx = copy_command_context(cmd_ctx);
|
||||||
c->service = service;
|
c->service = service;
|
||||||
|
@ -69,6 +70,7 @@ static int add_connection(struct service *service, struct command_context *cmd_c
|
||||||
address_size = sizeof(c->sin);
|
address_size = sizeof(c->sin);
|
||||||
|
|
||||||
c->fd = accept(service->fd, (struct sockaddr *)&service->sin, &address_size);
|
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
|
/* This increases performance dramatically for e.g. GDB load which
|
||||||
* does not have a sliding window protocol. */
|
* 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)
|
else if (service->type == CONNECTION_PIPE)
|
||||||
{
|
{
|
||||||
c->fd = service->fd;
|
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 */
|
/* do not check for new connections again on stdin */
|
||||||
service->fd = -1;
|
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)
|
else if (type == CONNECTION_PIPE)
|
||||||
{
|
{
|
||||||
/* use stdin */
|
c->fd = fileno(stdin);
|
||||||
c->fd = STDIN_FILENO;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
/* for win32 set stdin/stdout to binary mode */
|
/* for win32 set stdin/stdout to binary mode */
|
||||||
|
@ -384,7 +389,7 @@ int server_loop(struct command_context *command_context)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (service->type != CONNECTION_PIPE)
|
if (service->type == CONNECTION_TCP)
|
||||||
{
|
{
|
||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
socklen_t address_size = sizeof(sin);
|
socklen_t address_size = sizeof(sin);
|
||||||
|
|
|
@ -41,6 +41,7 @@ enum connection_type
|
||||||
struct connection
|
struct connection
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
int fd_out; /* When using pipes we're writing to a different fd */
|
||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
struct command_context *cmd_ctx;
|
struct command_context *cmd_ctx;
|
||||||
struct service *service;
|
struct service *service;
|
||||||
|
|
|
@ -58,6 +58,7 @@ int tcl_output(struct connection *connection, const void *data, ssize_t len)
|
||||||
return ERROR_SERVER_REMOTE_CLOSED;
|
return ERROR_SERVER_REMOTE_CLOSED;
|
||||||
|
|
||||||
wlen = write_socket(connection->fd, data, len);
|
wlen = write_socket(connection->fd, data, len);
|
||||||
|
|
||||||
if (wlen == len)
|
if (wlen == len)
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* Copyright (C) 2005 by Dominic Rath *
|
* Copyright (C) 2005 by Dominic Rath *
|
||||||
* Dominic.Rath@gmx.de *
|
* Dominic.Rath@gmx.de *
|
||||||
* *
|
* *
|
||||||
* Copyright (C) 2007,2008 Øyvind Harboe *
|
* Copyright (C) 2007-2010 Øyvind Harboe *
|
||||||
* oyvind.harboe@zylin.com *
|
* oyvind.harboe@zylin.com *
|
||||||
* *
|
* *
|
||||||
* Copyright (C) 2008 by Spencer Oliver *
|
* Copyright (C) 2008 by Spencer Oliver *
|
||||||
|
@ -51,7 +51,7 @@ static int telnet_write(struct connection *connection, const void *data,
|
||||||
if (t_con->closed)
|
if (t_con->closed)
|
||||||
return ERROR_SERVER_REMOTE_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;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue