/* * Initialize JDWP stuff. * * Allocates a new state structure. If "port" is non-negative, this also * tries to bind to a listen port. If "port" is less than zero, we assume * we're preparing for an outbound connection, and return without binding * to anything. * * This may be called several times if we're probing for a port. * * Returns 0 on success. */ static JdwpNetState* netStartup(short port) { JdwpNetState* netState; int one = 1; netState = (JdwpNetState*) malloc(sizeof(*netState)); memset(netState, 0, sizeof(*netState)); netState->listenSock = -1; netState->clientSock = -1; netState->wakePipe[0] = -1; netState->wakePipe[1] = -1; if (port < 0) return netState; assert(port != 0); netState->listenSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (netState->listenSock < 0) { LOGE("Socket create failed: %s\n", strerror(errno)); goto fail; } /* allow immediate re-use */ if (setsockopt(netState->listenSock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) < 0) { LOGE("setsockopt(SO_REUSEADDR) failed: %s\n", strerror(errno)); goto fail; } union { struct sockaddr_in addrInet; struct sockaddr addrPlain; } addr; addr.addrInet.sin_family = AF_INET; addr.addrInet.sin_port = htons(port); inet_aton("127.0.0.1", &addr.addrInet.sin_addr); if (bind(netState->listenSock, &addr.addrPlain, sizeof(addr)) != 0) { LOGV("attempt to bind to port %u failed: %s\n", port, strerror(errno)); goto fail; } netState->listenPort = port; LOGVV("+++ bound to port %d\n", netState->listenPort); if (listen(netState->listenSock, 5) != 0) { LOGE("Listen failed: %s\n", strerror(errno)); goto fail; } return netState; fail: netShutdown(netState); netFree(netState); return NULL; }
static void netFreeExtern(JdwpState* state) { netFree(state->netState); }