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>
This commit is contained in:
parent
5a41435e45
commit
cb2dba2c12
|
@ -328,7 +328,7 @@ 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 (write_socket(connection->fd_out, data, len) == len)
|
if (connection_write(connection, data, len) == len)
|
||||||
{
|
{
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -513,6 +513,33 @@ int server_quit(void)
|
||||||
return ERROR_OK;
|
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 */
|
/* tell the server we want to shut down */
|
||||||
COMMAND_HANDLER(handle_shutdown_command)
|
COMMAND_HANDLER(handle_shutdown_command)
|
||||||
{
|
{
|
||||||
|
|
|
@ -83,6 +83,9 @@ int server_loop(struct command_context *command_context);
|
||||||
|
|
||||||
int server_register_commands(struct command_context *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
|
* Used by server_loop(), defined in server_stubs.c, httpd.c, or ecosboard.c
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -57,7 +57,7 @@ int tcl_output(struct connection *connection, const void *data, ssize_t len)
|
||||||
if (tclc->tc_outerror)
|
if (tclc->tc_outerror)
|
||||||
return ERROR_SERVER_REMOTE_CLOSED;
|
return ERROR_SERVER_REMOTE_CLOSED;
|
||||||
|
|
||||||
wlen = write_socket(connection->fd, data, len);
|
wlen = connection_write(connection, data, len);
|
||||||
|
|
||||||
if (wlen == len)
|
if (wlen == len)
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
|
@ -92,7 +92,7 @@ static int tcl_input(struct connection *connection)
|
||||||
struct tcl_connection *tclc;
|
struct tcl_connection *tclc;
|
||||||
unsigned char in[256];
|
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) {
|
||||||
if (rlen < 0)
|
if (rlen < 0)
|
||||||
LOG_ERROR("error during read: %s", strerror(errno));
|
LOG_ERROR("error during read: %s", strerror(errno));
|
||||||
|
|
|
@ -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_out, data, len) == len)
|
if (connection_write(connection, data, len) == len)
|
||||||
{
|
{
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
@ -204,7 +204,7 @@ static int telnet_input(struct connection *connection)
|
||||||
struct telnet_connection *t_con = connection->priv;
|
struct telnet_connection *t_con = connection->priv;
|
||||||
struct command_context *command_context = connection->cmd_ctx;
|
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)
|
if (bytes_read == 0)
|
||||||
return ERROR_SERVER_REMOTE_CLOSED;
|
return ERROR_SERVER_REMOTE_CLOSED;
|
||||||
|
|
Loading…
Reference in New Issue