IoObject *IoSocket_asyncBind(IoSocket *self, IoObject *locals, IoMessage *m) { //doc Socket asyncBind Binds the socket and returns self immediately or an Error object on error. IoObject *address = IoMessage_locals_addressArgAt_(m, locals, 0); if (Socket_bind(SOCKET(self), IoSocket_rawAddressFrom_(address))) { return self; } else { return SOCKETERROR("Failed to bind socket"); } }
static NetDescriptor * listenPortSingle(struct ListenState *listenState, struct addrinfo *info) { Socket *sock; int bindResult; int listenResult; NetDescriptor *nd; sock = Socket_openNative(info->ai_family, info->ai_socktype, info->ai_protocol); if (sock == Socket_noSocket) { int savedErrno = errno; log_add(log_Error, "socket() failed: %s.", strerror(errno)); errno = savedErrno; return NULL; } (void) Socket_setReuseAddr(sock); // Ignore errors; it's not a big deal. if (Socket_setNonBlocking(sock) == -1) { int savedErrno = errno; // Error message is already printed. Socket_close(sock); errno = savedErrno; return NULL; } bindResult = Socket_bind(sock, info->ai_addr, info->ai_addrlen); if (bindResult == -1) { int savedErrno = errno; if (errno == EADDRINUSE) { #ifdef DEBUG log_add(log_Warning, "bind() failed: %s.", strerror(errno)); #endif } else log_add(log_Error, "bind() failed: %s.", strerror(errno)); Socket_close(sock); errno = savedErrno; return NULL; } listenResult = Socket_listen(sock, listenState->flags.backlog); if (listenResult == -1) { int savedErrno = errno; log_add(log_Error, "listen() failed: %s.", strerror(errno)); Socket_close(sock); errno = savedErrno; return NULL; } nd = NetDescriptor_new(sock, (void *) listenState); if (nd == NULL) { int savedErrno = errno; log_add(log_Error, "NetDescriptor_new() failed: %s.", strerror(errno)); Socket_close(sock); errno = savedErrno; return NULL; } NetDescriptor_setReadCallback(nd, acceptCallback); return nd; }