remove flash.h from tree
[fw/openocd] / src / server / server.c
index 03f0ee6ec94a2d30d69cadc15bf871fc50fcbe8b..2f4bfb0043dc393da9247644d5d80b9bdbc3b563 100644 (file)
 #endif
 
 #include "server.h"
-#include "target.h"
+#include <target/target.h>
+#include "openocd.h"
+#include "tcl_server.h"
+#include "telnet_server.h"
 
 #include <signal.h>
 
 #endif
 
 
-service_t *services = NULL;
+struct service *services = NULL;
 
 /* shutdown_openocd == 1: exit the main event loop, and quit the debugger */
 static int shutdown_openocd = 0;
-int handle_shutdown_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
 /* set when using pipes rather than tcp */
 int server_use_pipes = 0;
 
-int add_connection(service_t *service, command_context_t *cmd_ctx)
+int add_connection(struct service *service, struct command_context *cmd_ctx)
 {
        socklen_t address_size;
-       connection_t *c, **p;
+       struct connection *c, **p;
        int retval;
        int flag = 1;
 
-       c = malloc(sizeof(connection_t));
+       c = malloc(sizeof(struct connection));
        c->fd = -1;
        memset(&c->sin, 0, sizeof(c->sin));
        c->cmd_ctx = copy_command_context(cmd_ctx);
@@ -110,10 +112,10 @@ int add_connection(service_t *service, command_context_t *cmd_ctx)
        return ERROR_OK;
 }
 
-int remove_connection(service_t *service, connection_t *connection)
+int remove_connection(struct service *service, struct connection *connection)
 {
-       connection_t **p = &service->connections;
-       connection_t *c;
+       struct connection **p = &service->connections;
+       struct connection *c;
 
        /* find connection */
        while ((c = *p))
@@ -142,10 +144,10 @@ int remove_connection(service_t *service, connection_t *connection)
 
 int add_service(char *name, enum connection_type type, unsigned short port, int max_connections, new_connection_handler_t new_connection_handler, input_handler_t input_handler, connection_closed_handler_t connection_closed_handler, void *priv)
 {
-       service_t *c, **p;
+       struct service *c, **p;
        int so_reuseaddr_option = 1;
 
-       c = malloc(sizeof(service_t));
+       c = malloc(sizeof(struct service));
 
        c->name = strdup(name);
        c->type = type;
@@ -233,8 +235,8 @@ int add_service(char *name, enum connection_type type, unsigned short port, int
 
 int remove_service(unsigned short port)
 {
-       service_t **p = &services;
-       service_t *c;
+       struct service **p = &services;
+       struct service *c;
 
        /* find service */
        while ((c = *p))
@@ -261,12 +263,12 @@ int remove_service(unsigned short port)
 
 int remove_services(void)
 {
-       service_t *c = services;
+       struct service *c = services;
 
        /* loop service */
        while (c)
        {
-               service_t *next = c->next;
+               struct service *next = c->next;
 
                if (c->name)
                        free(c->name);
@@ -286,12 +288,9 @@ int remove_services(void)
        return ERROR_OK;
 }
 
-extern void openocd_sleep_prelude(void);
-extern void openocd_sleep_postlude(void);
-
-int server_loop(command_context_t *command_context)
+int server_loop(struct command_context *command_context)
 {
-       service_t *service;
+       struct service *service;
 
        /* used in select() */
        fd_set read_fds;
@@ -312,7 +311,7 @@ int server_loop(command_context_t *command_context)
 
        while (!shutdown_openocd)
        {
-               /* monitor sockets for acitvity */
+               /* monitor sockets for activity */
                fd_max = 0;
                FD_ZERO(&read_fds);
 
@@ -330,7 +329,7 @@ int server_loop(command_context_t *command_context)
 
                        if (service->connections)
                        {
-                               connection_t *c;
+                               struct connection *c;
 
                                for (c = service->connections; c; c = c->next)
                                {
@@ -387,7 +386,7 @@ int server_loop(command_context_t *command_context)
                }
 
                target_call_timer_callbacks();
-               process_jim_events ();
+               process_jim_events(command_context);
 
                if (retval == 0)
                {
@@ -424,7 +423,7 @@ int server_loop(command_context_t *command_context)
                        /* handle activity on connections */
                        if (service->connections)
                        {
-                               connection_t *c;
+                               struct connection *c;
 
                                for (c = service->connections; c;)
                                {
@@ -432,7 +431,7 @@ int server_loop(command_context_t *command_context)
                                        {
                                                if ((retval = service->input(c)) != ERROR_OK)
                                                {
-                                                       connection_t *next = c->next;
+                                                       struct connection *next = c->next;
                                                        if (service->type == CONNECTION_PIPE)
                                                        {
                                                                /* if connection uses a pipe then shutdown openocd on error */
@@ -488,7 +487,7 @@ void sig_handler(int sig) {
 }
 #endif
 
-int server_init(void)
+int server_init(struct command_context *cmd_ctx)
 {
 #ifdef _WIN32
        WORD wVersionRequested;
@@ -519,7 +518,11 @@ int server_init(void)
        signal(SIGABRT, sig_handler);
 #endif
 
-       return ERROR_OK;
+       int ret = tcl_init(cmd_ctx);
+       if (ERROR_OK != ret)
+               return ret;
+
+       return telnet_init("Open On-Chip Debugger");
 }
 
 int server_quit(void)
@@ -534,33 +537,47 @@ int server_quit(void)
        return ERROR_OK;
 }
 
-int server_register_commands(command_context_t *context)
+/* tell the server we want to shut down */
+COMMAND_HANDLER(handle_shutdown_command)
 {
-       register_command(context, NULL, "shutdown", handle_shutdown_command,
-                                        COMMAND_ANY, "shut the server down");
+       shutdown_openocd = 1;
 
-       return ERROR_OK;
+       return ERROR_COMMAND_CLOSE_CONNECTION;
 }
 
-/* tell the server we want to shut down */
-int handle_shutdown_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+static const struct command_registration server_command_handlers[] = {
+       {
+               .name = "shutdown",
+               .handler = &handle_shutdown_command,
+               .mode = COMMAND_ANY,
+               .help = "shut the server down",
+       },
+       COMMAND_REGISTRATION_DONE
+};
+
+int server_register_commands(struct command_context *cmd_ctx)
 {
-       shutdown_openocd = 1;
+       int retval = telnet_register_commands(cmd_ctx);
+       if (ERROR_OK != retval)
+               return retval;
 
-       return ERROR_COMMAND_CLOSE_CONNECTION;
+       retval = tcl_register_commands(cmd_ctx);
+       if (ERROR_OK != retval)
+               return retval;
+
+       return register_commands(cmd_ctx, NULL, server_command_handlers);
 }
 
-int server_port_command(struct command_context_s *cmd_ctx,
-               char *cmd, char **args, int argc, unsigned short *out)
+SERVER_PORT_COMMAND()
 {
-       switch (argc) {
+       switch (CMD_ARGC) {
        case 0:
-               command_print(cmd_ctx, "%d", *out);
+               command_print(CMD_CTX, "%d", *out);
                break;
        case 1:
        {
                uint16_t port;
-               COMMAND_PARSE_NUMBER(u16, args[0], port);
+               COMMAND_PARSE_NUMBER(u16, CMD_ARGV[0], port);
                *out = port;
                break;
        }