static int citp_passthrough_getsockname(citp_fdinfo* fdi, struct sockaddr* sa, socklen_t* p_sa_len) { return ci_sys_getsockname(fdi_to_alien_fdi(fdi)->os_socket, sa, p_sa_len); }
static void sock_fmt(int fd, char* buf, int* buf_n, int buf_len) { struct sockaddr_in sa; socklen_t sa_len; int type; bprintf("socket["); sa_len = sizeof(type); CI_TRY(ci_sys_getsockopt(fd, SOL_SOCKET, SO_TYPE, &type, &sa_len)); sa_len = sizeof(sa); if( ci_sys_getsockname(fd, (struct sockaddr*) &sa, &sa_len) == 0 ) { switch( sa.sin_family ) { case AF_INET: bprintf("%s,"CI_IP_PRINTF_FORMAT":%u", type_to_proto(type), CI_IP_PRINTF_ARGS(&sa.sin_addr.s_addr), CI_BSWAP_BE16(sa.sin_port)); break; case AF_UNIX: bprintf("UNIX,%s", type_to_string(type)); break; default: bprintf("%d,%s", sa.sin_family, type_to_string(type)); break; } sa_len = sizeof(sa); if( sa.sin_family == AF_INET && ci_sys_getpeername(fd, (struct sockaddr*) &sa, &sa_len) == 0 ) bprintf(","CI_IP_PRINTF_FORMAT":%u", CI_IP_PRINTF_ARGS(&sa.sin_addr.s_addr), CI_BSWAP_BE16(sa.sin_port)); } bprintf("]"); }
/* Encapsulation of sys_getsockname for UDP EPs */ static int ci_udp_sys_getsockname( ci_fd_t sock, citp_socket* ep ) { socklen_t salen; int rc; union ci_sockaddr_u sa_u; ci_assert(ep); #if CI_CFG_FAKE_IPV6 ci_assert(ep->s->domain == AF_INET || ep->s->domain == AF_INET6); #else ci_assert(ep->s->domain == AF_INET); #endif salen = sizeof(sa_u); rc = ci_sys_getsockname( sock, &sa_u.sa, &salen ); if( rc ) return rc; if( sa_u.sa.sa_family != ep->s->domain || salen < sizeof(struct sockaddr_in) #if CI_CFG_FAKE_IPV6 || (ep->s->domain == AF_INET6 && salen < sizeof(struct sockaddr_in6) ) #endif ) { LOG_UV(log("%s: OS sock domain %d != expected domain %d or " "sys_getsockname struct small (%d exp %d)", __FUNCTION__, sa_u.sa.sa_family, ep->s->domain, salen, (int)(ep->s->domain == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6)))); return -1; } #if CI_CFG_FAKE_IPV6 if( ep->s->domain == AF_INET ) { ci_udp_set_laddr( ep, ci_get_ip4_addr(sa_u.sa.sa_family, &sa_u.sa), sa_u.sin.sin_port ); } else { ci_udp_set_laddr( ep, ci_get_ip4_addr(sa_u.sa.sa_family, &sa_u.sa), sa_u.sin6.sin6_port ); } #else ci_udp_set_laddr( ep, ci_get_ip4_addr(sa_u.sa.sa_family, &sa_u.sa), sa_u.sin.sin_port ); #endif return 0; }