Browse Source

server/server: Remove all exit() calls

With this patch OpenOCD shuts down properly when errors occur in the
server instead of just calling exit().

Change-Id: I2ae1a6153dafc88667951cab9152941cb487be85
Signed-off-by: Marc Schink <openocd-dev@marcschink.de>
rtt
Marc Schink 8 years ago
parent
commit
ba52458dfc
3 changed files with 69 additions and 29 deletions
  1. +7
    -2
      src/openocd.c
  2. +50
    -19
      src/server/server.c
  3. +12
    -8
      src/server/telnet_server.c

+ 7
- 2
src/openocd.c View File

@@ -170,7 +170,10 @@ COMMAND_HANDLER(handle_init_command)
command_context_mode(CMD_CTX, COMMAND_EXEC);

/* initialize telnet subsystem */
gdb_target_add_all(all_targets);
retval = gdb_target_add_all(all_targets);

if (retval != ERROR_OK)
return retval;

target_register_event_callback(log_target_callback_event_handler, CMD_CTX);

@@ -297,8 +300,10 @@ static int openocd_thread(int argc, char *argv[], struct command_context *cmd_ct

if (init_at_startup) {
ret = command_run_line(cmd_ctx, "init");
if (ERROR_OK != ret)
if (ERROR_OK != ret) {
server_quit();
return ERROR_FAIL;
}
}

ret = server_loop(cmd_ctx);


+ 50
- 19
src/server/server.c View File

@@ -145,7 +145,9 @@ static int add_connection(struct service *service, struct command_context *cmd_c
free(out_file);
if (c->fd_out == -1) {
LOG_ERROR("could not open %s", service->port);
exit(1);
command_done(c->cmd_ctx);
free(c);
return ERROR_FAIL;
}

LOG_INFO("accepting '%s' connection from pipe %s", service->name, service->port);
@@ -204,7 +206,13 @@ static int remove_connection(struct service *service, struct connection *connect
return ERROR_OK;
}

/* FIX! make service return error instead of invoking exit() */
static void free_service(struct service *c)
{
free(c->name);
free(c->port);
free(c);
}

int add_service(char *name,
const char *port,
int max_connections,
@@ -248,7 +256,8 @@ int add_service(char *name,
c->fd = socket(AF_INET, SOCK_STREAM, 0);
if (c->fd == -1) {
LOG_ERROR("error creating socket: %s", strerror(errno));
exit(-1);
free_service(c);
return ERROR_FAIL;
}

setsockopt(c->fd,
@@ -268,7 +277,9 @@ int add_service(char *name,
hp = gethostbyname(bindto_name);
if (hp == NULL) {
LOG_ERROR("couldn't resolve bindto address: %s", bindto_name);
exit(-1);
close_socket(c->fd);
free_service(c);
return ERROR_FAIL;
}
memcpy(&c->sin.sin_addr, hp->h_addr_list[0], hp->h_length);
}
@@ -276,7 +287,9 @@ int add_service(char *name,

if (bind(c->fd, (struct sockaddr *)&c->sin, sizeof(c->sin)) == -1) {
LOG_ERROR("couldn't bind %s to socket: %s", name, strerror(errno));
exit(-1);
close_socket(c->fd);
free_service(c);
return ERROR_FAIL;
}

#ifndef _WIN32
@@ -294,7 +307,9 @@ int add_service(char *name,

if (listen(c->fd, 1) == -1) {
LOG_ERROR("couldn't listen on socket: %s", strerror(errno));
exit(-1);
close_socket(c->fd);
free_service(c);
return ERROR_FAIL;
}
} else if (c->type == CONNECTION_STDINOUT) {
c->fd = fileno(stdin);
@@ -315,13 +330,15 @@ int add_service(char *name,
/* we currenty do not support named pipes under win32
* so exit openocd for now */
LOG_ERROR("Named pipes currently not supported under this os");
exit(1);
free_service(c);
return ERROR_FAIL;
#else
/* Pipe we're reading from */
c->fd = open(c->port, O_RDONLY | O_NONBLOCK);
if (c->fd == -1) {
LOG_ERROR("could not open %s", c->port);
exit(1);
free_service(c);
return ERROR_FAIL;
}
#endif
}
@@ -438,7 +455,7 @@ int server_loop(struct command_context *command_context)
FD_ZERO(&read_fds);
else {
LOG_ERROR("error during select: %s", strerror(errno));
exit(-1);
return ERROR_FAIL;
}
#else

@@ -446,7 +463,7 @@ int server_loop(struct command_context *command_context)
FD_ZERO(&read_fds);
else {
LOG_ERROR("error during select: %s", strerror(errno));
exit(-1);
return ERROR_FAIL;
}
#endif
}
@@ -476,11 +493,15 @@ int server_loop(struct command_context *command_context)

for (service = services; service; service = service->next) {
/* handle new connections on listeners */
if ((service->fd != -1)
&& (FD_ISSET(service->fd, &read_fds))) {
if (service->max_connections != 0)
add_connection(service, command_context);
else {
if ((service->fd != -1) && (FD_ISSET(service->fd, &read_fds))) {
if (service->max_connections != 0) {
retval = add_connection(service, command_context);

if (retval != ERROR_OK) {
LOG_ERROR("%i", retval);
return ERROR_FAIL;
}
} else {
if (service->type == CONNECTION_TCP) {
struct sockaddr_in sin;
socklen_t address_size = sizeof(sin);
@@ -565,7 +586,7 @@ int server_preinit(void)

if (WSAStartup(wVersionRequested, &wsaData) != 0) {
LOG_ERROR("Failed to Open Winsock");
exit(-1);
return ERROR_FAIL;
}

/* register ctrl-c handler */
@@ -582,11 +603,21 @@ int server_preinit(void)

int server_init(struct command_context *cmd_ctx)
{
int ret = tcl_init();
if (ERROR_OK != ret)
int ret;

ret = tcl_init();

if (ret != ERROR_OK)
return ret;

ret = telnet_init("Open On-Chip Debugger");

if (ret != ERROR_OK) {
remove_services();
return ret;
}

return telnet_init("Open On-Chip Debugger");
return ERROR_OK;
}

int server_quit(void)


+ 12
- 8
src/server/telnet_server.c View File

@@ -619,13 +619,14 @@ static int telnet_connection_closed(struct connection *connection)

int telnet_init(char *banner)
{
int ret;
struct telnet_service *telnet_service;

if (strcmp(telnet_port, "disabled") == 0) {
LOG_INFO("telnet server disabled");
return ERROR_OK;
}

struct telnet_service *telnet_service;

telnet_service = malloc(sizeof(struct telnet_service));

if (!telnet_service) {
@@ -635,13 +636,16 @@ int telnet_init(char *banner)

telnet_service->banner = banner;

return add_service("telnet",
telnet_port,
CONNECTION_LIMIT_UNLIMITED,
telnet_new_connection,
telnet_input,
telnet_connection_closed,
ret = add_service("telnet", telnet_port, CONNECTION_LIMIT_UNLIMITED,
telnet_new_connection, telnet_input, telnet_connection_closed,
telnet_service);

if (ret != ERROR_OK) {
free(telnet_service);
return ret;
}

return ERROR_OK;
}

/* daemon configuration command telnet_port */


Loading…
Cancel
Save