librtmp: Remember addrlen from getaddrinfo

OS X doesn't like sizeof(struct sockaddr_storage) as last parameter
for connect
This commit is contained in:
Palana
2015-02-11 15:41:23 +01:00
parent b7375fd1be
commit ce25cf86b6
2 changed files with 13 additions and 9 deletions

View File

@@ -642,7 +642,7 @@ int RTMP_AddStream(RTMP *r, const char *playpath)
}
static int
add_addr_info(struct sockaddr_storage *service, AVal *host, int port)
add_addr_info(struct sockaddr_storage *service, socklen_t *addrlen, AVal *host, int port)
{
char *hostname;
int ret = TRUE;
@@ -668,6 +668,7 @@ add_addr_info(struct sockaddr_storage *service, AVal *host, int port)
hints.ai_protocol = IPPROTO_TCP;
service->ss_family = AF_UNSPEC;
*addrlen = 0;
char portStr[8];
@@ -691,13 +692,14 @@ add_addr_info(struct sockaddr_storage *service, AVal *host, int port)
if (ptr->ai_family == AF_INET || ptr->ai_family == AF_INET6)
{
memcpy(service, ptr->ai_addr, ptr->ai_addrlen);
*addrlen = (socklen_t)ptr->ai_addrlen;
break;
}
}
freeaddrinfo(result);
if (service->ss_family == AF_UNSPEC)
if (service->ss_family == AF_UNSPEC || *addrlen == 0)
{
RTMP_Log(RTMP_LOGERROR, "Could not resolve server '%s': no valid address found", hostname);
ret = FALSE;
@@ -721,7 +723,7 @@ finish:
#endif
int
RTMP_Connect0(RTMP *r, struct sockaddr * service)
RTMP_Connect0(RTMP *r, struct sockaddr * service, socklen_t addrlen)
{
int on = 1;
r->m_sb.sb_timedout = FALSE;
@@ -749,7 +751,7 @@ RTMP_Connect0(RTMP *r, struct sockaddr * service)
}
}
if (connect(r->m_sb.sb_socket, service, sizeof(struct sockaddr_storage)) < 0)
if (connect(r->m_sb.sb_socket, service, addrlen) < 0)
{
int err = GetSockError();
if (err == E_CONNREFUSED)
@@ -880,6 +882,7 @@ RTMP_Connect(RTMP *r, RTMPPacket *cp)
HOSTENT *h;
#endif
struct sockaddr_storage service;
socklen_t addrlen = 0;
if (!r->Link.hostname.av_len)
return FALSE;
@@ -898,17 +901,17 @@ RTMP_Connect(RTMP *r, RTMPPacket *cp)
if (r->Link.socksport)
{
/* Connect via SOCKS */
if (!add_addr_info(&service, &r->Link.sockshost, r->Link.socksport))
if (!add_addr_info(&service, &addrlen, &r->Link.sockshost, r->Link.socksport))
return FALSE;
}
else
{
/* Connect directly */
if (!add_addr_info(&service, &r->Link.hostname, r->Link.port))
if (!add_addr_info(&service, &addrlen, &r->Link.hostname, r->Link.port))
return FALSE;
}
if (!RTMP_Connect0(r, (struct sockaddr *)&service))
if (!RTMP_Connect0(r, (struct sockaddr *)&service, addrlen))
return FALSE;
r->m_bSendCounter = TRUE;
@@ -921,9 +924,10 @@ SocksNegotiate(RTMP *r)
{
unsigned long addr;
struct sockaddr_storage service;
socklen_t addrlen = 0;
memset(&service, 0, sizeof(service));
add_addr_info(&service, &r->Link.hostname, r->Link.port);
add_addr_info(&service, &addrlen, &r->Link.hostname, r->Link.port);
// not doing IPv6 socks
if (service.ss_family == AF_INET6)

View File

@@ -358,7 +358,7 @@ extern "C"
int RTMP_Connect(RTMP *r, RTMPPacket *cp);
struct sockaddr;
int RTMP_Connect0(RTMP *r, struct sockaddr *svc);
int RTMP_Connect0(RTMP *r, struct sockaddr *svc, socklen_t addrlen);
int RTMP_Connect1(RTMP *r, RTMPPacket *cp);
int RTMP_Serve(RTMP *r);
int RTMP_TLS_Accept(RTMP *r, void *ctx);