X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fserver%2Fserver.c;h=a02d4a5c3e4b8b4979d46ff6cf909657c82cdb9d;hp=03f0ee6ec94a2d30d69cadc15bf871fc50fcbe8b;hb=7b2906de246bc37af99d432b3edf12e9f5f63521;hpb=ae5732b9e4f085b89da3f9ce07eb526e159e1937 diff --git a/src/server/server.c b/src/server/server.c index 03f0ee6ec9..a02d4a5c3e 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -29,6 +29,9 @@ #include "server.h" #include "target.h" +#include "openocd.h" +#include "tcl_server.h" +#include "telnet_server.h" #include @@ -37,23 +40,22 @@ #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) { @@ -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; }