* 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 *
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;
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. */
(char *)&flag, /* the cast is historical cruft */
sizeof(int)); /* length of option value */
- LOG_INFO("accepting '%s' connection from %i", service->name, c->sin.sin_port);
+ LOG_INFO("accepting '%s' connection from %i", service->name, service->port);
if ((retval = service->new_connection(c)) != ERROR_OK)
{
close_socket(c->fd);
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;
}
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 */
return ERROR_OK;
}
-int remove_service(unsigned short port)
-{
- struct service **p = &services;
- struct service *c;
-
- /* find service */
- while ((c = *p))
- {
- if (c->port == port)
- {
- if (c->name)
- free(c->name);
-
- if (c->priv)
- free(c->priv);
-
- /* delete service */
- *p = c->next;
- free(c);
- }
-
- /* redirect p to next list pointer */
- p = &(*p)->next;
- }
-
- return ERROR_OK;
-}
-
static int remove_services(void)
{
struct service *c = services;
{
struct service *service;
- bool poll = true;
+ bool poll_ok = true;
/* used in select() */
fd_set read_fds;
}
}
-#ifndef _WIN32
-#if BUILD_ECOSBOARD == 0
- if (server_use_pipes == 0)
- {
- /* add STDIN to read_fds */
- FD_SET(fileno(stdin), &read_fds);
- }
-#endif
-#endif
-
struct timeval tv;
tv.tv_sec = 0;
- if (poll)
+ if (poll_ok)
{
/* we're just polling this iteration, this is faster on embedded
* hosts */
FD_ZERO(&read_fds); /* eCos leaves read_fds unchanged in this case! */
/* We timed out/there was nothing to do, timeout rather than poll next time */
- poll = false;
+ poll_ok = false;
} else
{
/* There was something to do, next time we'll just poll */
- poll = true;
+ poll_ok = true;
}
for (service = services; service; service = service->next)
}
else
{
- if (service->type != CONNECTION_PIPE)
+ if (service->type == CONNECTION_TCP)
{
struct sockaddr_in sin;
socklen_t address_size = sizeof(sin);
}
}
-#ifndef _WIN32
-#if BUILD_ECOSBOARD == 0
- /* check for data on stdin if not using pipes */
- if (server_use_pipes == 0)
- {
- if (FD_ISSET(fileno(stdin), &read_fds))
- {
- if (getc(stdin) == 'x')
- {
- shutdown_openocd = 1;
- }
- }
- }
-#endif
-#else
+#ifdef _WIN32
MSG msg;
while (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
int server_init(struct command_context *cmd_ctx)
{
- int ret = tcl_init(cmd_ctx);
+ int ret = tcl_init();
if (ERROR_OK != ret)
return ret;
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)
{