ChibiOS thread states: Update thread state to label mapping
[fw/openocd] / src / server / server.c
index 8009d408feacac451e0a1b960c1ae0516ef8f7f2..4e806563ca9d1986777c1f77a323794cb811570a 100644 (file)
@@ -259,7 +259,7 @@ int add_service(char *name,
                c->sin.sin_family = AF_INET;
 
                if (bindto_name == NULL)
-                       c->sin.sin_addr.s_addr = INADDR_ANY;
+                       c->sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
                else {
                        hp = gethostbyname(bindto_name);
                        if (hp == NULL) {
@@ -273,7 +273,7 @@ int add_service(char *name,
                c->sin.sin_port = htons(c->portnumber);
 
                if (bind(c->fd, (struct sockaddr *)&c->sin, sizeof(c->sin)) == -1) {
-                       LOG_ERROR("couldn't bind %s to socket: %s", name, strerror(errno));
+                       LOG_ERROR("couldn't bind %s to socket on port %d: %s", name, c->portnumber, strerror(errno));
                        close_socket(c->fd);
                        free_service(c);
                        return ERROR_FAIL;
@@ -298,6 +298,13 @@ int add_service(char *name,
                        free_service(c);
                        return ERROR_FAIL;
                }
+
+               struct sockaddr_in addr_in;
+               addr_in.sin_port = 0;
+               socklen_t addr_in_size = sizeof(addr_in);
+               if (getsockname(c->fd, (struct sockaddr *)&addr_in, &addr_in_size) == 0)
+                       LOG_INFO("Listening on port %hu for %s connections",
+                                ntohs(addr_in.sin_port), name);
        } else if (c->type == CONNECTION_STDINOUT) {
                c->fd = fileno(stdin);
 
@@ -338,6 +345,21 @@ int add_service(char *name,
        return ERROR_OK;
 }
 
+static void remove_connections(struct service *service)
+{
+       struct connection *connection;
+
+       connection = service->connections;
+
+       while (connection) {
+               struct connection *tmp;
+
+               tmp = connection->next;
+               remove_connection(service, connection);
+               connection = tmp;
+       }
+}
+
 static int remove_services(void)
 {
        struct service *c = services;
@@ -346,6 +368,8 @@ static int remove_services(void)
        while (c) {
                struct service *next = c->next;
 
+               remove_connections(c);
+
                if (c->name)
                        free(c->name);
 
@@ -617,6 +641,13 @@ int server_quit(void)
        return last_signal;
 }
 
+void server_free(void)
+{
+       tcl_service_free();
+       telnet_service_free();
+       jsp_service_free();
+}
+
 void exit_on_signal(int sig)
 {
 #ifndef _WIN32