This is an automated email from Gerrit.

Marc Schink ([email protected]) just uploaded a new patch set to 
Gerrit, which you can find at http://openocd.zylin.com/3223

-- gerrit

commit fe6bedb278d27cb577c0b041a64f3c92930bb8d4
Author: Marc Schink <[email protected]>
Date:   Sun Jan 24 20:58:24 2016 +0100

    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 <[email protected]>

diff --git a/src/openocd.c b/src/openocd.c
index d17af20..eb457e5 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -167,7 +167,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);
 
@@ -294,8 +297,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);
diff --git a/src/server/server.c b/src/server/server.c
index 24747f9..165d806 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -127,7 +127,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);
@@ -186,7 +188,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,
@@ -229,7 +237,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,
@@ -247,7 +256,9 @@ int add_service(char *name,
 
                if (bind(c->fd, (struct sockaddr *)&c->sin, sizeof(c->sin)) == 
-1) {
                        LOG_ERROR("couldn't bind to socket: %s", 
strerror(errno));
-                       exit(-1);
+                       close_socket(c->fd);
+                       free_service(c);
+                       return ERROR_FAIL;
                }
 
 #ifndef _WIN32
@@ -265,7 +276,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);
@@ -286,13 +299,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
        }
@@ -409,7 +424,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
 
@@ -417,7 +432,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
                }
@@ -447,11 +462,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);
@@ -536,7 +555,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 */
@@ -553,11 +572,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;
 
-       return telnet_init("Open On-Chip Debugger");
+       ret = telnet_init("Open On-Chip Debugger");
+
+       if (ret != ERROR_OK) {
+               remove_services();
+               return ret;
+       }
+
+       return ERROR_OK;
 }
 
 int server_quit(void)
diff --git a/src/server/telnet_server.c b/src/server/telnet_server.c
index 2187dbe..7836ca6 100644
--- a/src/server/telnet_server.c
+++ b/src/server/telnet_server.c
@@ -614,22 +614,27 @@ 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 = malloc(sizeof(struct 
telnet_service));
-
+       telnet_service = malloc(sizeof(struct telnet_service));
        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 */

-- 

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to