Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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("]");
}
Ejemplo n.º 3
0
/* 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;
}