Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b506090 authored by Elliott Hughes's avatar Elliott Hughes
Browse files

Always explain why bind(2) failed.

This has confused several people lately.

Bug: http://b/20219978
Change-Id: I2537ceb83bff0b3166c230c728d4389a983db858
parent 623aa1c4
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -60,6 +60,8 @@ LOCAL_SRC_FILES := \
    qemu_tracing.cpp \
    usb_linux_client.cpp \

LOCAL_SHARED_LIBRARIES := libbase

include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
@@ -71,6 +73,8 @@ LOCAL_SRC_FILES := \
    $(LIBADB_$(HOST_OS)_SRC_FILES) \
    adb_auth_host.cpp \

LOCAL_SHARED_LIBRARIES := libbase

# Even though we're building a static library (and thus there's no link step for
# this to take effect), this adds the SSL includes to our path.
LOCAL_STATIC_LIBRARIES := libcrypto_static
+16 −17
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@

#include <string>

#include <base/stringprintf.h>

#include "adb_auth.h"
#include "adb_io.h"
#include "adb_listeners.h"
@@ -802,7 +804,6 @@ int handle_forward_request(const char* service, transport_type ttype, char* seri
    if (!strncmp(service, "forward:",8) ||
        !strncmp(service, "killforward:",12)) {
        char *local, *remote;
        int r;
        atransport *transport;

        int createForward = strncmp(service, "kill", 4);
@@ -845,12 +846,13 @@ int handle_forward_request(const char* service, transport_type ttype, char* seri
            return 1;
        }

        install_status_t r;
        if (createForward) {
            r = install_listener(local, remote, transport, no_rebind);
        } else {
            r = remove_listener(local, transport);
        }
        if(r == 0) {
        if (r == INSTALL_STATUS_OK) {
#if ADB_HOST
            /* On the host: 1st OKAY is connect, 2nd OKAY is status */
            WriteFdExactly(reply_fd, "OKAY", 4);
@@ -859,22 +861,19 @@ int handle_forward_request(const char* service, transport_type ttype, char* seri
            return 1;
        }

        if (createForward) {
            const char* message;
        std::string message;
        switch (r) {
          case INSTALL_STATUS_OK: message = " "; break;
          case INSTALL_STATUS_INTERNAL_ERROR: message = "internal error"; break;
          case INSTALL_STATUS_CANNOT_BIND:
                message = "cannot bind to socket";
            message = android::base::StringPrintf("cannot bind to socket: %s", strerror(errno));
            break;
          case INSTALL_STATUS_CANNOT_REBIND:
                message = "cannot rebind existing socket";
            message = android::base::StringPrintf("cannot rebind existing socket: %s", strerror(errno));
            break;
              default:
                message = "internal error";
            }
            sendfailmsg(reply_fd, message);
        } else {
            sendfailmsg(reply_fd, "cannot remove listener");
          case INSTALL_STATUS_LISTENER_NOT_FOUND: message = "listener not found"; break;
        }
        sendfailmsg(reply_fd, message.c_str());
        return 1;
    }
    return 0;
+4 −4
Original line number Diff line number Diff line
@@ -190,17 +190,17 @@ int format_listeners(char* buf, size_t buflen)
    return result;
}

int remove_listener(const char *local_name, atransport* transport)
install_status_t remove_listener(const char *local_name, atransport* transport)
{
    alistener *l;

    for (l = listener_list.next; l != &listener_list; l = l->next) {
        if (!strcmp(local_name, l->local_name)) {
            listener_disconnect(l, l->transport);
            return 0;
            return INSTALL_STATUS_OK;
        }
    }
    return -1;
    return INSTALL_STATUS_LISTENER_NOT_FOUND;
}

void remove_all_listeners(void)
@@ -268,10 +268,10 @@ install_status_t install_listener(const char *local_name,

    listener->fd = local_name_to_fd(local_name);
    if (listener->fd < 0) {
        printf("cannot bind '%s': %s\n", local_name, strerror(errno));
        free(listener->local_name);
        free(listener->connect_to);
        free(listener);
        printf("cannot bind '%s'\n", local_name);
        return INSTALL_STATUS_CANNOT_BIND;
    }

+2 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ enum install_status_t {
  INSTALL_STATUS_INTERNAL_ERROR = -1,
  INSTALL_STATUS_CANNOT_BIND = -2,
  INSTALL_STATUS_CANNOT_REBIND = -3,
  INSTALL_STATUS_LISTENER_NOT_FOUND = -4,
};

extern alistener listener_list;
@@ -40,7 +41,7 @@ install_status_t install_listener(const char *local_name,

int format_listeners(char* buf, size_t buflen);

int remove_listener(const char *local_name, atransport* transport);
install_status_t remove_listener(const char* local_name, atransport* transport);
void remove_all_listeners(void);

#endif /* __ADB_LISTENERS_H */
+1 −1
Original line number Diff line number Diff line
@@ -144,7 +144,7 @@ static void *server_socket_thread(void * arg)
        if(serverfd == -1) {
            serverfd = socket_inaddr_any_server(port, SOCK_STREAM);
            if(serverfd < 0) {
                D("server: cannot bind socket yet\n");
                D("server: cannot bind socket yet: %s\n", strerror(errno));
                adb_sleep_ms(1000);
                continue;
            }