int mbed_socket::dogetpeername(struct sockaddr* addr, socklen_t* addrlen) { TCPAsynch* async; SocketAddr sockaddr; socket_error_t err; uint16_t sockport = 0; async = tcp_.tcp; err = async->getRemoteAddr(&sockaddr); async->getRemotePort(&sockport); if (async->error_check(err) || !sockaddr.is_v4()) { set_errno(EOPNOTSUPP); return -1; } struct sockaddr_in* inaddr = (struct sockaddr_in*)addr; inaddr->sin_family = AF_INET; inaddr->sin_addr.s_addr = socket_addr_get_ipv4_addr(sockaddr.getAddr()); inaddr->sin_port = sockport; *addrlen = sizeof(struct sockaddr_in); return 0; }
int mbed_socket::doaccept(struct sockaddr *addr, socklen_t *addrlen) { void* impl; impl = incomming_pop(); if (impl == NULL) { set_errno(EINVAL); TDLOG(".. doaccept error: incomming null"); return -1; } TCPListener* listener = get_listener(); if (listener == NULL) { set_errno(EOPNOTSUPP); TDLOG(".. doaccept error: no listener"); return -1; } mbed_socket* socli; socli = new mbed_socket(domain_, type_, protocol_); if (socli == NULL) { set_errno(ENOMEM); TDLOG(".. doaccept error: out of memory"); return -1; } if (socli->get_sock_fd() < 0) { delete socli; TDLOG(".. doaccept error: out of fd"); set_errno(ENOMEM); return -1; } TCPStream* stream; stream = listener->accept(impl); if (stream == NULL) { TDLOG(".. doaccept error: accept failed"); delete socli; set_errno(ENOMEM); return -1; } // it's already connected. there will be no "on_connected" cb called socli->set_stream(stream, true); stream->setOnError(on_error_t(socli, &mbed_socket::on_error)); stream->setOnReadable(on_readable_t(socli, &mbed_socket::on_readable)); stream->setOnSent(on_sent_t(socli, &mbed_socket::on_sent)); stream->setOnDisconnect(on_disconnect_t(socli, &mbed_socket::on_disconnect)); // if (addr && addrlen) { memset(addr, 0, *addrlen); struct sockaddr_in* inaddr = (struct sockaddr_in*)addr; SocketAddr sockaddr; uint16_t sockport; stream->getRemoteAddr(&sockaddr); stream->getRemotePort(&sockport); assert(sockaddr.is_v4()); inaddr = (struct sockaddr_in*)addr; inaddr->sin_family = AF_INET; inaddr->sin_addr.s_addr = socket_addr_get_ipv4_addr(sockaddr.getAddr()); inaddr->sin_port = sockport; *addrlen = sizeof(struct sockaddr_in); } return socli->get_sock_fd(); }