static boolean freerdp_listener_check_fds(freerdp_listener* instance) { int i; void* sin_addr; int peer_sockfd; freerdp_peer* client; socklen_t peer_addr_size; struct sockaddr_storage peer_addr; rdpListener* listener = (rdpListener*) instance->listener; if (listener->num_sockfds < 1) return false; for (i = 0; i < listener->num_sockfds; i++) { peer_addr_size = sizeof(peer_addr); peer_sockfd = accept(listener->sockfds[i], (struct sockaddr*) &peer_addr, &peer_addr_size); if (peer_sockfd == -1) { #ifdef _WIN32 int wsa_error = WSAGetLastError(); /* No data available */ if (wsa_error == WSAEWOULDBLOCK) continue; #else if (errno == EAGAIN || errno == EWOULDBLOCK) continue; #endif perror("accept"); return false; } client = freerdp_peer_new(peer_sockfd); sin_addr = NULL; if (peer_addr.ss_family == AF_INET) sin_addr = &(((struct sockaddr_in*) &peer_addr)->sin_addr); else if (peer_addr.ss_family == AF_INET6) sin_addr = &(((struct sockaddr_in6*) &peer_addr)->sin6_addr); #ifndef _WIN32 else if (peer_addr.ss_family == AF_UNIX) client->local = true; #endif if (sin_addr) inet_ntop(peer_addr.ss_family, sin_addr, client->hostname, sizeof(client->hostname)); IFCALL(instance->PeerAccepted, instance, client); } return true; }
static boolean freerdp_listener_check_fds(freerdp_listener* instance) { rdpListener* listener = (rdpListener*)instance->listener; struct sockaddr_storage peer_addr; socklen_t peer_addr_size; int peer_sockfd; int i; freerdp_peer* client; void* sin_addr; if (listener->num_sockfds < 1) return False; for (i = 0; i < listener->num_sockfds; i++) { peer_addr_size = sizeof(peer_addr); peer_sockfd = accept(listener->sockfds[i], (struct sockaddr *)&peer_addr, &peer_addr_size); if (peer_sockfd == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) continue; perror("accept"); return False; } client = freerdp_peer_new(peer_sockfd); if (peer_addr.ss_family == AF_INET) sin_addr = &(((struct sockaddr_in*)&peer_addr)->sin_addr); else sin_addr = &(((struct sockaddr_in6*)&peer_addr)->sin6_addr); inet_ntop(peer_addr.ss_family, sin_addr, client->hostname, sizeof(client->hostname)); IFCALL(instance->PeerAccepted, instance, client); } return True; }
static BOOL freerdp_listener_check_fds(freerdp_listener* instance) { int i; void* sin_addr; int peer_sockfd; freerdp_peer* client = NULL; int peer_addr_size; struct sockaddr_storage peer_addr; rdpListener* listener = (rdpListener*) instance->listener; static const BYTE localhost6_bytes[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; BOOL peer_accepted; if (listener->num_sockfds < 1) return FALSE; for (i = 0; i < listener->num_sockfds; i++) { WSAResetEvent(listener->events[i]); peer_addr_size = sizeof(peer_addr); peer_sockfd = _accept(listener->sockfds[i], (struct sockaddr*) &peer_addr, &peer_addr_size); peer_accepted = FALSE; if (peer_sockfd == -1) { #ifdef _WIN32 int wsa_error = WSAGetLastError(); /* No data available */ if (wsa_error == WSAEWOULDBLOCK) continue; #else if (errno == EAGAIN || errno == EWOULDBLOCK) continue; #endif WLog_DBG(TAG, "accept"); free(client); return FALSE; } client = freerdp_peer_new(peer_sockfd); if (!client) { closesocket((SOCKET) peer_sockfd); return FALSE; } sin_addr = NULL; if (peer_addr.ss_family == AF_INET) { sin_addr = &(((struct sockaddr_in*) &peer_addr)->sin_addr); if ((*(UINT32*) sin_addr) == 0x0100007f) client->local = TRUE; } else if (peer_addr.ss_family == AF_INET6) { sin_addr = &(((struct sockaddr_in6*) &peer_addr)->sin6_addr); if (memcmp(sin_addr, localhost6_bytes, 16) == 0) client->local = TRUE; } #ifndef _WIN32 else if (peer_addr.ss_family == AF_UNIX) client->local = TRUE; #endif if (sin_addr) inet_ntop(peer_addr.ss_family, sin_addr, client->hostname, sizeof(client->hostname)); IFCALLRET(instance->PeerAccepted, peer_accepted, instance, client); if (!peer_accepted) { WLog_ERR(TAG, "PeerAccepted callback failed"); closesocket((SOCKET) peer_sockfd); freerdp_peer_free(client); } } return TRUE; }
static BOOL freerdp_listener_check_fds(freerdp_listener* instance) { int i; void* sin_addr; int peer_sockfd; freerdp_peer* client = NULL; socklen_t peer_addr_size; struct sockaddr_storage peer_addr; rdpListener* listener = (rdpListener*) instance->listener; static const BYTE localhost6_bytes[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }; if (listener->num_sockfds < 1) return FALSE; for (i = 0; i < listener->num_sockfds; i++) { peer_addr_size = sizeof(peer_addr); peer_sockfd = accept(listener->sockfds[i], (struct sockaddr*) &peer_addr, &peer_addr_size); if (peer_sockfd == -1) { #ifdef _WIN32 int wsa_error = WSAGetLastError(); /* No data available */ if (wsa_error == WSAEWOULDBLOCK) continue; #else if (errno == EAGAIN || errno == EWOULDBLOCK) continue; #endif DEBUG_WARN("accept"); if (client) free(client); return FALSE; } client = freerdp_peer_new(peer_sockfd); sin_addr = NULL; if (peer_addr.ss_family == AF_INET) { sin_addr = &(((struct sockaddr_in*) &peer_addr)->sin_addr); if ((*(UINT32*) sin_addr) == 0x0100007f) client->local = TRUE; } else if (peer_addr.ss_family == AF_INET6) { sin_addr = &(((struct sockaddr_in6*) &peer_addr)->sin6_addr); if (memcmp(sin_addr, localhost6_bytes, 16) == 0) client->local = TRUE; } #ifndef _WIN32 else if (peer_addr.ss_family == AF_UNIX) client->local = TRUE; #endif if (sin_addr) inet_ntop(peer_addr.ss_family, sin_addr, client->hostname, sizeof(client->hostname)); IFCALL(instance->PeerAccepted, instance, client); } return TRUE; }