[vlc-commits] [Git][videolan/vlc][master] 14 commits: vlc_network: add a union to avoid mixing sockaddr pointers
Steve Lhomme (@robUx4)
gitlab at videolan.org
Fri Jan 24 05:54:45 UTC 2025
Steve Lhomme pushed to branch master at VideoLAN / VLC
Commits:
2e97000a by Steve Lhomme at 2025-01-24T05:39:47+00:00
vlc_network: add a union to avoid mixing sockaddr pointers
Similar to the one from 5c62c801edea6c4ef695668831ec4252d78166de.
- - - - -
4af56b19 by Steve Lhomme at 2025-01-24T05:39:47+00:00
vlc_network: use vlc_sockaddr for net_GetXXXAddress()
- - - - -
91a7601f by Steve Lhomme at 2025-01-24T05:39:47+00:00
udp: use vlc_sockaddr instead of local equivalent
- - - - -
100d9852 by Steve Lhomme at 2025-01-24T05:39:47+00:00
tunnel_test: use vlc_sockaddr to read addresses
- - - - -
48b62caa by Steve Lhomme at 2025-01-24T05:39:47+00:00
amt: remove unnecessary cast
- - - - -
9826042a by Steve Lhomme at 2025-01-24T05:39:47+00:00
amt: replace duplicate variables by a single vlc_sockaddr
- - - - -
875fa7c3 by Steve Lhomme at 2025-01-24T05:39:47+00:00
sout/udp: use vlc_sockaddr to read addresses
- - - - -
521c782e by Steve Lhomme at 2025-01-24T05:39:47+00:00
sout/rtp: use vlc_sockaddr to read addresses
- - - - -
16f953de by Steve Lhomme at 2025-01-24T05:39:47+00:00
netsync: use vlc_sockaddr to read addresses
- - - - -
75e62753 by Steve Lhomme at 2025-01-24T05:39:47+00:00
smb2: use vlc_sockaddr to read addresses
- - - - -
433b8bd6 by Steve Lhomme at 2025-01-24T05:39:47+00:00
sap: use vlc_sockaddr to read addresses
Instead of local equivalent.
- - - - -
2096955e by Steve Lhomme at 2025-01-24T05:39:47+00:00
os2/getaddrinfo: use vlc_sockaddr
- - - - -
f785073f by Steve Lhomme at 2025-01-24T05:39:47+00:00
bonjour: use vlc_sockaddr to read addresses
Instead of local equivalent.
- - - - -
6d827302 by Steve Lhomme at 2025-01-24T05:39:47+00:00
udp: use vlc_sockaddr instead of local variant
- - - - -
11 changed files:
- include/vlc_network.h
- modules/access/amt.c
- modules/access/http/tunnel_test.c
- modules/access/smb2.c
- modules/control/netsync.c
- modules/services_discovery/bonjour.m
- modules/stream_out/rtp.c
- modules/stream_out/udp.c
- src/network/udp.c
- src/os2/getaddrinfo.c
- src/stream_output/sap.c
Changes:
=====================================
include/vlc_network.h
=====================================
@@ -292,6 +292,16 @@ static inline int vlc_setsockopt(int s, int level, int name,
# endif
#endif
+/* union of the various sockaddr structures often used together */
+typedef union {
+ struct sockaddr sa;
+ struct sockaddr_storage ss;
+ struct sockaddr_in sin;
+#ifdef AF_INET6
+ struct sockaddr_in6 sin6;
+#endif
+} vlc_sockaddr;
+
VLC_API int vlc_getnameinfo( const struct sockaddr *, int, char *, int, int *, int );
/**
@@ -343,22 +353,22 @@ net_SockAddrIsMulticast (const struct sockaddr *addr, socklen_t len)
static inline int net_GetSockAddress( int fd, char *address, int *port )
{
- struct sockaddr_storage addr;
- socklen_t addrlen = sizeof( addr );
+ vlc_sockaddr addr;
+ socklen_t addrlen = sizeof( addr.ss );
- return getsockname( fd, (struct sockaddr *)&addr, &addrlen )
- || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address,
+ return getsockname( fd, &addr.sa, &addrlen )
+ || vlc_getnameinfo( &addr.sa, addrlen, address,
NI_MAXNUMERICHOST, port, NI_NUMERICHOST )
? VLC_EGENERIC : 0;
}
static inline int net_GetPeerAddress( int fd, char *address, int *port )
{
- struct sockaddr_storage addr;
- socklen_t addrlen = sizeof( addr );
+ vlc_sockaddr addr;
+ socklen_t addrlen = sizeof( addr.ss );
- return getpeername( fd, (struct sockaddr *)&addr, &addrlen )
- || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address,
+ return getpeername( fd, &addr.sa, &addrlen )
+ || vlc_getnameinfo( &addr.sa, addrlen, address,
NI_MAXNUMERICHOST, port, NI_NUMERICHOST )
? VLC_EGENERIC : 0;
}
=====================================
modules/access/amt.c
=====================================
@@ -293,19 +293,10 @@ typedef struct _access_sys_t
vlc_timer_t updateTimer;
/* Mulicast group and source, differentiate between address family based on the sa_family which is the first field (sin_family or sin6_family) in both structs */
- union {
- struct sockaddr_in ipv4;
- struct sockaddr_in6 ipv6;
- } mcastGroupAddr;
- union {
- struct sockaddr_in ipv4;
- struct sockaddr_in6 ipv6;
- } mcastSrcAddr;
+ vlc_sockaddr mcastGroupAddr;
+ vlc_sockaddr mcastSrcAddr;
/* AMT relay imformation */
- union {
- struct sockaddr_in ipv4;
- struct sockaddr_in6 ipv6;
- } relayDiscoAddr;
+ vlc_sockaddr relayDiscoAddr;
/* AMT Relay Membership Query data (RFC7450) */
struct relay_mem_query_msg_t {
@@ -477,12 +468,12 @@ static int Open( vlc_object_t *p_this )
/* Store the binary socket representation of multicast group address */
if ( serverinfo->ai_family == AF_INET )
{
- sys->mcastGroupAddr.ipv4 = *(struct sockaddr_in*)serverinfo->ai_addr;
+ sys->mcastGroupAddr.sin = *(struct sockaddr_in*)serverinfo->ai_addr;
hints.ai_family = AF_INET; /* now that we know family of the group we can improve the hints for resolving the source */
}
else
{
- sys->mcastGroupAddr.ipv6 = *(struct sockaddr_in6*)serverinfo->ai_addr;
+ sys->mcastGroupAddr.sin6 = *(struct sockaddr_in6*)serverinfo->ai_addr;
hints.ai_family = AF_INET6;
}
/* Release the allocated memory */
@@ -546,9 +537,9 @@ static int Open( vlc_object_t *p_this )
/* Store the binary socket representation of multicast source address */
if ( serverinfo->ai_family == AF_INET )
{
- sys->mcastSrcAddr.ipv4 = *(struct sockaddr_in*)serverinfo->ai_addr;
+ sys->mcastSrcAddr.sin = *(struct sockaddr_in*)serverinfo->ai_addr;
} else {
- sys->mcastSrcAddr.ipv6 = *(struct sockaddr_in6*)serverinfo->ai_addr;
+ sys->mcastSrcAddr.sin6 = *(struct sockaddr_in6*)serverinfo->ai_addr;
}
msg_Dbg( p_access, "Setting multicast source address to %s", mcastSrc);
}
@@ -665,7 +656,7 @@ static block_t *BlockAMT(stream_t *p_access, bool *restrict eof)
{
access_sys_t *sys = p_access->p_sys;
ssize_t len = 0, shift = 0;
- int tunnel = UDP_HDR_LEN + AMT_HDR_LEN + (sys->mcastGroupAddr.ipv4.sin_family == AF_INET ? IP_HDR_LEN : IPv6_FIXED_HDR_LEN );
+ int tunnel = UDP_HDR_LEN + AMT_HDR_LEN + (sys->mcastGroupAddr.sin.sin_family == AF_INET ? IP_HDR_LEN : IPv6_FIXED_HDR_LEN );
/* Allocate anticipated MTU buffer for holding the UDP packet suitable for native or AMT tunneled multicast */
block_t *pkt = block_Alloc( sys->mtu + tunnel );
@@ -821,7 +812,7 @@ static block_t *BlockAMT(stream_t *p_access, bool *restrict eof)
/* Otherwise pull native multicast */
struct sockaddr temp;
socklen_t temp_size = sizeof( struct sockaddr );
- len = recvfrom( sys->fd, (char *)pkt->p_buffer, sys->mtu + tunnel, 0, (struct sockaddr*)&temp, &temp_size );
+ len = recvfrom( sys->fd, (char *)pkt->p_buffer, sys->mtu + tunnel, 0, &temp, &temp_size );
if ( len <= 0 )
{
msg_Err(p_access, "recv() call failed: %zd was returned", len);
@@ -894,9 +885,9 @@ static bool open_amt_tunnel( stream_t *p_access )
/* Store the binary representation */
if ( server->ai_family == AF_INET )
{
- sys->relayDiscoAddr.ipv4 = *(struct sockaddr_in*)server_addr;
+ sys->relayDiscoAddr.sin = *(struct sockaddr_in*)server_addr;
} else {
- sys->relayDiscoAddr.ipv6 = *(struct sockaddr_in6*)server_addr;
+ sys->relayDiscoAddr.sin6 = *(struct sockaddr_in6*)server_addr;
}
if( amt_sockets_init( p_access ) != 0 )
@@ -942,8 +933,8 @@ static bool open_amt_tunnel( stream_t *p_access )
/* Arm IGMP timer once we've confirmed we are getting packets */
vlc_timer_schedule( sys->updateTimer, false,
- VLC_TICK_FROM_SEC( sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic), 0 );
- msg_Err(p_access, "Arming timer. qqic is %d",sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic);
+ VLC_TICK_FROM_SEC( sys->relayDiscoAddr.sin.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic), 0 );
+ msg_Err(p_access, "Arming timer. qqic is %d",sys->relayDiscoAddr.sin.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic);
break; /* found an active server sending UDP packets, so exit loop */
}
@@ -1132,16 +1123,12 @@ static void make_ipv6( amt_ipv6_t *p, uint16_t length, struct in6_addr *dst )
*/
static int amt_sockets_init( stream_t *p_access )
{
- struct sockaddr *rcvAddr;
- struct sockaddr_in rcvAddr4;
- struct sockaddr_in6 rcvAddr6;
+ vlc_sockaddr rcvAddr = {0};
access_sys_t *sys = p_access->p_sys;
- memset( &rcvAddr4, 0, sizeof(struct sockaddr_in) );
- memset( &rcvAddr6, 0, sizeof(struct sockaddr_in6) );
int enable = 0, res = 0;
/* create UDP socket */
- sys->sAMT = vlc_socket( sys->relayDiscoAddr.ipv4.sin_family, SOCK_DGRAM, IPPROTO_UDP, true );
+ sys->sAMT = vlc_socket( sys->relayDiscoAddr.sin.sin_family, SOCK_DGRAM, IPPROTO_UDP, true );
if( sys->sAMT == -1 )
{
msg_Err( p_access, "Failed to create UDP socket" );
@@ -1155,23 +1142,29 @@ static int amt_sockets_init( stream_t *p_access )
goto error;
}
- rcvAddr4.sin_family = AF_INET;
- rcvAddr4.sin_port = htons( 0 );
- rcvAddr4.sin_addr.s_addr = INADDR_ANY;
-
- rcvAddr6.sin6_family = AF_INET6;
- rcvAddr6.sin6_port = htons( 0 );
- rcvAddr6.sin6_addr = (struct in6_addr) IN6ADDR_ANY_INIT;
-
- rcvAddr = sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? (struct sockaddr*) &rcvAddr4 : (struct sockaddr*) &rcvAddr6;
+ socklen_t rcvNamelen;
+ if (sys->relayDiscoAddr.sin.sin_family == AF_INET)
+ {
+ rcvNamelen = sizeof(rcvAddr.sin);
+ rcvAddr.sin.sin_family = AF_INET;
+ rcvAddr.sin.sin_port = htons( 0 );
+ rcvAddr.sin.sin_addr.s_addr = INADDR_ANY;
+ }
+ else
+ {
+ rcvNamelen = sizeof(rcvAddr.sin6);
+ rcvAddr.sin6.sin6_family = AF_INET6;
+ rcvAddr.sin6.sin6_port = htons( 0 );
+ rcvAddr.sin6.sin6_addr = (struct in6_addr) IN6ADDR_ANY_INIT;
+ }
- if( bind(sys->sAMT, rcvAddr, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sizeof(rcvAddr4) : sizeof(rcvAddr6) ) != 0 )
+ if( bind(sys->sAMT, &rcvAddr.sa, rcvNamelen ) != 0 )
{
msg_Err( p_access, "Failed to bind UDP socket error: %s", vlc_strerror(errno) );
goto error;
}
- sys->sQuery = vlc_socket( sys->relayDiscoAddr.ipv4.sin_family, SOCK_DGRAM, IPPROTO_UDP, true );
+ sys->sQuery = vlc_socket( sys->relayDiscoAddr.sin.sin_family, SOCK_DGRAM, IPPROTO_UDP, true );
if( sys->sQuery == -1 )
{
msg_Err( p_access, "Failed to create query socket" );
@@ -1179,22 +1172,24 @@ static int amt_sockets_init( stream_t *p_access )
}
/* bind socket to local address */
- struct sockaddr_in stLocalAddr4 =
+ vlc_sockaddr stLocalAddr = {0};
+ socklen_t stLocalNamelen;
+ if (sys->relayDiscoAddr.sin.sin_family == AF_INET)
{
- .sin_family = AF_INET,
- .sin_port = htons( 0 ),
- .sin_addr.s_addr = INADDR_ANY,
- };
-
- struct sockaddr_in6 stLocalAddr6;
- memset( &rcvAddr6, 0, sizeof(struct sockaddr_in6) );
- stLocalAddr6.sin6_family = AF_INET6;
- stLocalAddr6.sin6_port = htons( 0 );
- stLocalAddr6.sin6_addr = (struct in6_addr) IN6ADDR_ANY_INIT;
-
- struct sockaddr *stLocalAddr = sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? (struct sockaddr*) &stLocalAddr4 : (struct sockaddr*) &stLocalAddr6;
+ stLocalNamelen = sizeof(stLocalAddr.sin);
+ stLocalAddr.sin.sin_family = AF_INET;
+ stLocalAddr.sin.sin_port = htons( 0 );
+ stLocalAddr.sin.sin_addr.s_addr = INADDR_ANY;
+ }
+ else
+ {
+ stLocalNamelen = sizeof(stLocalAddr.sin6);
+ stLocalAddr.sin6.sin6_family = AF_INET6;
+ stLocalAddr.sin6.sin6_port = htons( 0 );
+ stLocalAddr.sin6.sin6_addr = (struct in6_addr) IN6ADDR_ANY_INIT;
+ }
- if( bind(sys->sQuery, stLocalAddr, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sizeof(stLocalAddr4) : sizeof(stLocalAddr6) ) != 0 )
+ if( bind(sys->sQuery, &stLocalAddr.sa, stLocalNamelen ) != 0 )
{
msg_Err( p_access, "Failed to bind query socket" );
goto error;
@@ -1250,7 +1245,7 @@ static void amt_send_relay_discovery_msg( stream_t *p_access, char *relay_ip )
sys->glob_ulNonce = ulNonce;
/* send it */
- nRet = sendto( sys->sAMT, chaSendBuffer, sizeof(chaSendBuffer), 0, (struct sockaddr*) &sys->relayDiscoAddr, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6));
+ nRet = sendto( sys->sAMT, chaSendBuffer, sizeof(chaSendBuffer), 0, &sys->relayDiscoAddr.sa, sys->relayDiscoAddr.sin.sin_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6));
if( nRet < 0)
{
@@ -1296,7 +1291,7 @@ static void amt_send_relay_request( stream_t *p_access, char *relay_ip )
*/
chaSendBuffer[0] = AMT_REQUEST;
- chaSendBuffer[1] = sys->mcastGroupAddr.ipv4.sin_family == AF_INET6;
+ chaSendBuffer[1] = sys->mcastGroupAddr.sin.sin_family == AF_INET6;
chaSendBuffer[2] = 0;
chaSendBuffer[3] = 0;
@@ -1421,7 +1416,7 @@ static int amt_send_mem_update( stream_t *p_access, bool leave)
ulNonce = sys->glob_ulNonce;
memcpy( &pSendBuffer[8], &ulNonce, NONCE_LEN );
- if ( sys->mcastGroupAddr.ipv4.sin_family == AF_INET )
+ if ( sys->mcastGroupAddr.sin.sin_family == AF_INET )
{
/* make IP header for IGMP packet */
amt_ip_alert_t p_ipHead;
@@ -1440,13 +1435,13 @@ static int amt_send_mem_update( stream_t *p_access, bool leave)
amt_igmpv3_groupRecord_t groupRcd;
groupRcd.auxDatalen = 0;
- groupRcd.ssm = sys->mcastGroupAddr.ipv4.sin_addr.s_addr;
+ groupRcd.ssm = sys->mcastGroupAddr.sin.sin_addr.s_addr;
- if( sys->mcastSrcAddr.ipv4.sin_addr.s_addr )
+ if( sys->mcastSrcAddr.sin.sin_addr.s_addr )
{
groupRcd.type = leave ? AMT_IGMP_BLOCK:AMT_IGMP_INCLUDE;
groupRcd.nSrc = htons(1);
- groupRcd.srcIP[0] = sys->mcastSrcAddr.ipv4.sin_addr.s_addr;
+ groupRcd.srcIP[0] = sys->mcastSrcAddr.sin.sin_addr.s_addr;
}
else
@@ -1487,7 +1482,7 @@ static int amt_send_mem_update( stream_t *p_access, bool leave)
make_ipv6(&ip, IPv6_HOP_BY_HOP_OPTION_LEN + MLD_REPORT_LEN, &tmp);
- if( make_mld_report(p_access,leave,&report,&sys->mcastGroupAddr.ipv6.sin6_addr,&sys->mcastSrcAddr.ipv6.sin6_addr) )
+ if( make_mld_report(p_access,leave,&report,&sys->mcastGroupAddr.sin6.sin6_addr,&sys->mcastSrcAddr.sin6.sin6_addr) )
{
goto oom;
}
@@ -1581,18 +1576,27 @@ static bool amt_rcv_relay_adv( stream_t *p_access )
return false;
}
- struct sockaddr_in relayAddr4;
- relayAddr4.sin_port = htons( AMT_PORT );
- relayAddr4.sin_family = AF_INET;
-
- struct sockaddr_in6 relayAddr6;
- relayAddr6.sin6_port = htons( AMT_PORT );
- relayAddr6.sin6_family = AF_INET6;
+ vlc_sockaddr relayAddr = {0};
+ socklen_t relayNamelen;
+ void *bin_address_start;
+ if (sys->relayDiscoAddr.sin.sin_family == AF_INET)
+ {
+ relayNamelen = sizeof(relayAddr.sin);
+ bin_address_start = &relayAddr.sin.sin_addr;
+ relayAddr.sin.sin_port = htons( AMT_PORT );
+ relayAddr.sin.sin_family = AF_INET;
+ }
+ else
+ {
+ relayNamelen = sizeof(relayAddr.sin6);
+ bin_address_start = &relayAddr.sin6.sin6_addr;
+ relayAddr.sin6.sin6_port = htons( AMT_PORT );
+ relayAddr.sin6.sin6_family = AF_INET6;
+ }
- void *bin_address_start = (sys->relayDiscoAddr.ipv4.sin_family == AF_INET) ? (void*) &relayAddr4.sin_addr : (void*) &relayAddr6.sin6_addr;
- memcpy( bin_address_start , &pkt[8], sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? 4 : 16);
+ memcpy( bin_address_start , &pkt[8], sys->relayDiscoAddr.sin.sin_family == AF_INET ? 4 : 16);
- int nRet = connect( sys->sAMT, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? (struct sockaddr*)&relayAddr4 : (struct sockaddr*)&relayAddr6, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sizeof(relayAddr4) : sizeof(relayAddr6) );
+ int nRet = connect( sys->sAMT, &relayAddr.sa, relayNamelen );
if( nRet < 0 )
{
msg_Err( p_access, "Error connecting AMT UDP socket: %s", vlc_strerror(errno) );
@@ -1649,7 +1653,7 @@ static bool amt_rcv_relay_mem_query( stream_t *p_access )
ssize_t len = recv( sys->sAMT, pkt, i_buf_len, 0 );
- if ( len <= 0 || (sys->mcastGroupAddr.ipv4.sin_family == AF_INET && len != (RELAY_QUERY_MSG_LEN - 40)) || (sys->mcastGroupAddr.ipv4.sin_family == AF_INET6 && len < RELAY_QUERY_MSG_LEN) ) /* subtract 40 for ipv4 case */
+ if ( len <= 0 || (sys->mcastGroupAddr.sin.sin_family == AF_INET && len != (RELAY_QUERY_MSG_LEN - 40)) || (sys->mcastGroupAddr.sin.sin_family == AF_INET6 && len < RELAY_QUERY_MSG_LEN) ) /* subtract 40 for ipv4 case */
{
msg_Err(p_access, "length of relay query message invalid!");
return false;
@@ -1665,7 +1669,7 @@ static bool amt_rcv_relay_mem_query( stream_t *p_access )
return false;
}
- if ( sys->mcastGroupAddr.ipv4.sin_family == AF_INET )
+ if ( sys->mcastGroupAddr.sin.sin_family == AF_INET )
{
size_t shift = AMT_HDR_LEN + MAC_LEN + NONCE_LEN + IP_HDR_IGMP_LEN;
sys->relay_query.igmp.type = pkt[shift];
@@ -1754,5 +1758,5 @@ static void amt_update_timer_cb( void *data )
/* Arms the timer again for a single shot from this callback. That way, the
* time spent in amt_send_mem_update() is taken into consideration. */
vlc_timer_schedule( sys->updateTimer, false,
- VLC_TICK_FROM_SEC( sys->mcastGroupAddr.ipv4.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic), 0 );
+ VLC_TICK_FROM_SEC( sys->mcastGroupAddr.sin.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic), 0 );
}
=====================================
modules/access/http/tunnel_test.c
=====================================
@@ -122,23 +122,23 @@ static int server_socket(unsigned *port)
if (fd == -1)
return -1;
- struct sockaddr_in6 addr = {
- .sin6_family = AF_INET6,
+ vlc_sockaddr addr = {
+ .sin6.sin6_family = AF_INET6,
#ifdef HAVE_SA_LEN
- .sin6_len = sizeof (addr),
+ .sin6.sin6_len = sizeof (addr),
#endif
- .sin6_addr = in6addr_loopback,
+ .sin6.sin6_addr = in6addr_loopback,
};
- socklen_t addrlen = sizeof (addr);
+ socklen_t addrlen = sizeof (addr.sin6);
- if (bind(fd, (struct sockaddr *)&addr, addrlen)
- || getsockname(fd, (struct sockaddr *)&addr, &addrlen))
+ if (bind(fd, &addr.sa, addrlen)
+ || getsockname(fd, &addr.sa, &addrlen))
{
vlc_close(fd);
return -1;
}
- *port = ntohs(addr.sin6_port);
+ *port = ntohs(addr.sin6.sin6_port);
return fd;
}
=====================================
modules/access/smb2.c
=====================================
@@ -551,25 +551,25 @@ vlc_smb2_print_addr(stream_t *access)
{
struct access_sys *sys = access->p_sys;
- struct sockaddr_storage addr;
- if (getsockname(smb2_get_fd(sys->smb2), (struct sockaddr *)&addr,
- &(socklen_t){ sizeof(addr) }) != 0)
+ vlc_sockaddr addr;
+ if (getsockname(smb2_get_fd(sys->smb2), &addr.sa,
+ &(socklen_t){ sizeof(addr.ss) }) != 0)
return;
- void *sin_addr;
- switch (addr.ss_family)
+ const void *sin_addr;
+ switch (addr.ss.ss_family)
{
case AF_INET6:
- sin_addr = &((struct sockaddr_in6 *)&addr)->sin6_addr;
+ sin_addr = &addr.sin6.sin6_addr;
break;
case AF_INET:
- sin_addr = &((struct sockaddr_in *)&addr)->sin_addr;
+ sin_addr = &addr.sin.sin_addr;
break;
default:
return;
}
char ip[INET6_ADDRSTRLEN];
- if (inet_ntop(addr.ss_family, sin_addr, ip, sizeof(ip)) == NULL)
+ if (inet_ntop(addr.ss.ss_family, sin_addr, ip, sizeof(ip)) == NULL)
return;
if (strcmp(ip, sys->encoded_url.psz_host) == 0)
=====================================
modules/control/netsync.c
=====================================
@@ -202,11 +202,10 @@ static void *Master(void *handle)
continue;
/* We received something */
- struct sockaddr_storage from;
- socklen_t fromlen = sizeof (from);
+ vlc_sockaddr from;
+ socklen_t fromlen = sizeof (from.ss);
- if (recvfrom(sys->fd, data, 8, 0,
- (struct sockaddr *)&from, &fromlen) < 8)
+ if (recvfrom(sys->fd, data, 8, 0, &from.sa, &fromlen) < 8)
continue;
vlc_tick_t master_system = GetPcrSystem(sys->input);
@@ -217,8 +216,7 @@ static void *Master(void *handle)
data[1] = hton64(master_system);
/* Reply to the sender */
- sendto(sys->fd, data, 16, 0,
- (struct sockaddr *)&from, fromlen);
+ sendto(sys->fd, data, 16, 0, &from.sa, fromlen);
#if 0
/* not sure we need the client information to sync,
since we are the master anyway */
=====================================
modules/services_discovery/bonjour.m
=====================================
@@ -30,6 +30,7 @@
#include <vlc_modules.h>
#include <vlc_services_discovery.h>
#include <vlc_renderer_discovery.h>
+#include <vlc_network.h>
#import <Foundation/Foundation.h>
#import <arpa/inet.h>
@@ -130,24 +131,18 @@ static NSString * ipAddressAsStringForData(NSData * data)
return returnValue;
}
- typedef union {
- struct sockaddr sa;
- struct sockaddr_in ipv4;
- struct sockaddr_in6 ipv6;
- } ip_socket_address;
-
- ip_socket_address *socketAddress = (ip_socket_address *)[data bytes];
+ const vlc_sockaddr *socketAddress = (const vlc_sockaddr *)[data bytes];
if (socketAddress) {
const char *addressStr = NULL;
if (socketAddress->sa.sa_family == AF_INET) {
addressStr = inet_ntop(socketAddress->sa.sa_family,
- (void *)&(socketAddress->ipv4.sin_addr),
+ &(socketAddress->sin.sin_addr),
addressBuffer,
sizeof(addressBuffer));
} else if (socketAddress->sa.sa_family == AF_INET6) {
addressStr = inet_ntop(socketAddress->sa.sa_family,
- (void *)&(socketAddress->ipv6.sin6_addr),
+ &(socketAddress->sin6.sin6_addr),
addressBuffer,
sizeof(addressBuffer));
}
=====================================
modules/stream_out/rtp.c
=====================================
@@ -733,7 +733,7 @@ char *SDPGenerate( sout_stream_t *p_stream, const char *rtsp_url )
{
sout_stream_sys_t *p_sys = p_stream->p_sys;
struct vlc_memstream sdp;
- struct sockaddr_storage dst;
+ vlc_sockaddr dst;
char *psz_sdp = NULL;
socklen_t dstlen;
int i;
@@ -763,13 +763,11 @@ char *SDPGenerate( sout_stream_t *p_stream, const char *rtsp_url )
inclport = true;
/* Oh boy, this is really ugly! */
- dstlen = sizeof( dst );
+ dstlen = sizeof( dst.ss );
if( p_sys->es[0]->listen.fd != NULL )
- getsockname( p_sys->es[0]->listen.fd[0],
- (struct sockaddr *)&dst, &dstlen );
+ getsockname( p_sys->es[0]->listen.fd[0], &dst.sa, &dstlen );
else
- getpeername( p_sys->es[0]->sinkv[0].rtp_fd,
- (struct sockaddr *)&dst, &dstlen );
+ getpeername( p_sys->es[0]->sinkv[0].rtp_fd, &dst.sa, &dstlen );
}
else
{
@@ -783,14 +781,14 @@ char *SDPGenerate( sout_stream_t *p_stream, const char *rtsp_url )
dstlen = ipv6 ? sizeof( struct sockaddr_in6 )
: sizeof( struct sockaddr_in );
memset (&dst, 0, dstlen);
- dst.ss_family = ipv6 ? AF_INET6 : AF_INET;
+ dst.ss.ss_family = ipv6 ? AF_INET6 : AF_INET;
#ifdef HAVE_SA_LEN
- dst.ss_len = dstlen;
+ dst.ss.ss_len = dstlen;
#endif
}
if( vlc_sdp_Start( &sdp, VLC_OBJECT( p_stream ), SOUT_CFG_PREFIX,
- NULL, 0, (struct sockaddr *)&dst, dstlen ) )
+ NULL, 0, &dst.sa, dstlen ) )
goto out;
/* TODO: a=source-filter */
=====================================
modules/stream_out/udp.c
=====================================
@@ -83,31 +83,27 @@ static void Flush(sout_stream_t *stream, void *id)
static session_descriptor_t *CreateSDP(vlc_object_t *obj, int fd)
{
- union {
- struct sockaddr addr;
- struct sockaddr_in in;
- struct sockaddr_in6 in6;
- } src, dst;
+ vlc_sockaddr src, dst;
socklen_t srclen = sizeof (srclen), dstlen = sizeof (dst);
char dhost[INET6_ADDRSTRLEN];
unsigned short dport;
- if (getsockname(fd, &src.addr, &srclen)
- || getpeername(fd, &dst.addr, &dstlen)) {
+ if (getsockname(fd, &src.sa, &srclen)
+ || getpeername(fd, &dst.sa, &dstlen)) {
int val = errno;
msg_Err(obj, "cannot format SDP: %s", vlc_strerror_c(val));
return NULL;
}
- switch (dst.addr.sa_family) {
+ switch (dst.sa.sa_family) {
case AF_INET:
- inet_ntop(AF_INET, &dst.in.sin_addr, dhost, sizeof (dhost));
- dport = dst.in.sin_port;
+ inet_ntop(AF_INET, &dst.sin.sin_addr, dhost, sizeof (dhost));
+ dport = dst.sin.sin_port;
break;
case AF_INET6:
- inet_ntop(AF_INET6, &dst.in6.sin6_addr, dhost, sizeof (dhost));
- dport = dst.in6.sin6_port;
+ inet_ntop(AF_INET6, &dst.sin6.sin6_addr, dhost, sizeof (dhost));
+ dport = dst.sin6.sin6_port;
break;
default:
return NULL;
@@ -116,7 +112,7 @@ static session_descriptor_t *CreateSDP(vlc_object_t *obj, int fd)
struct vlc_memstream sdp;
if (vlc_sdp_Start(&sdp, obj, SOUT_CFG_PREFIX,
- &src.addr, srclen, &dst.addr, dstlen))
+ &src.sa, srclen, &dst.sa, dstlen))
return NULL;
vlc_memstream_printf(&sdp, "m=video %d udp mpeg\r\n", ntohs(dport));
=====================================
src/network/udp.c
=====================================
@@ -118,21 +118,16 @@ static int net_SetupDgramSocket (vlc_object_t *p_obj, int fd,
if (net_SockAddrIsMulticast (ptr->ai_addr, ptr->ai_addrlen))
{
- union
- {
- struct sockaddr a;
- struct sockaddr_in in;
- struct sockaddr_in6 in6;
- } dumb = {
+ vlc_sockaddr dumb = {
{ .sa_family = ptr->ai_addr->sa_family, },
};
static_assert (offsetof (struct sockaddr_in, sin_port) ==
offsetof (struct sockaddr_in6, sin6_port), "Mismatch");
assert(ptr->ai_addrlen <= sizeof (dumb));
- memcpy(&dumb.in6.sin6_port, ((unsigned char *)ptr->ai_addr)
+ memcpy(&dumb.sin6.sin6_port, ((unsigned char *)ptr->ai_addr)
+ offsetof (struct sockaddr_in, sin_port), 2);
- bind(fd, &dumb.a, ptr->ai_addrlen);
+ bind(fd, &dumb.sa, ptr->ai_addrlen);
}
else
#endif
@@ -502,20 +497,14 @@ static int net_Subscribe(vlc_object_t *obj, int fd,
static int net_SetDSCP( int fd, uint8_t dscp )
{
- union {
- struct sockaddr a;
- struct sockaddr_in in;
-#ifdef IPV6_TCLASS
- struct sockaddr_in in6;
-#endif
- } addr;
+ vlc_sockaddr addr;
- if (getsockname(fd, &addr.a, &(socklen_t){ sizeof (addr) }))
+ if (getsockname(fd, &addr.sa, &(socklen_t){ sizeof (addr) }))
return -1;
int level, cmd;
- switch (addr.a.sa_family)
+ switch (addr.sa.sa_family)
{
#ifdef IPV6_TCLASS
case AF_INET6:
=====================================
src/os2/getaddrinfo.c
=====================================
@@ -160,18 +160,17 @@ makeaddrinfo (int af, int type, int proto,
static struct addrinfo *
makeipv4info (int type, int proto, u_long ip, u_short port, const char *name)
{
- struct sockaddr_in addr;
+ vlc_sockaddr addr = {0};
- memset (&addr, 0, sizeof (addr));
- addr.sin_family = AF_INET;
+ addr.sin.sin_family = AF_INET;
# ifdef HAVE_SA_LEN
- addr.sin_len = sizeof (addr);
+ addr.sin.sin_len = sizeof (addr.sin);
# endif
- addr.sin_port = port;
- addr.sin_addr.s_addr = ip;
+ addr.sin.sin_port = port;
+ addr.sin.sin_addr.s_addr = ip;
return makeaddrinfo (AF_INET, type, proto,
- (struct sockaddr*)&addr, sizeof (addr), name);
+ &addr.sa, sizeof (addr.sin), name);
}
/*
=====================================
src/stream_output/sap.c
=====================================
@@ -63,11 +63,7 @@ typedef struct sap_address_t
vlc_cond_t wait;
char group[NI_MAXNUMERICHOST];
- union {
- struct sockaddr a;
- struct sockaddr_in in;
- struct sockaddr_in6 in6;
- } orig;
+ vlc_sockaddr orig;
socklen_t origlen;
int fd;
unsigned interval;
@@ -101,7 +97,7 @@ static sap_address_t *AddressCreate (vlc_object_t *obj, const char *group)
strlcpy (addr->group, group, sizeof (addr->group));
addr->fd = fd;
addr->origlen = sizeof (addr->orig);
- getsockname(fd, &addr->orig.a, &addr->origlen);
+ getsockname(fd, &addr->orig.sa, &addr->origlen);
addr->interval = var_CreateGetInteger (obj, "sap-interval");
vlc_cond_init (&addr->wait);
@@ -165,12 +161,7 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
{
int i;
char psz_addr[NI_MAXNUMERICHOST];
- union
- {
- struct sockaddr a;
- struct sockaddr_in in;
- struct sockaddr_in6 in6;
- } addr;
+ vlc_sockaddr addr;
socklen_t addrlen = 0;
struct addrinfo *res;
@@ -191,13 +182,13 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
}
/* Determine SAP multicast address automatically */
- switch (addr.a.sa_family)
+ switch (addr.sa.sa_family)
{
#if defined (HAVE_INET_PTON) || defined (_WIN32)
case AF_INET6:
{
/* See RFC3513 for list of valid IPv6 scopes */
- struct in6_addr *a6 = &addr.in6.sin6_addr;
+ struct in6_addr *a6 = &addr.sin6.sin6_addr;
memcpy( a6->s6_addr + 2, "\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x02\x7f\xfe", 14 );
@@ -214,7 +205,7 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
case AF_INET:
{
/* See RFC2365 for IPv4 scopes */
- uint32_t ipv4 = addr.in.sin_addr.s_addr;
+ uint32_t ipv4 = addr.sin.sin_addr.s_addr;
/* 224.0.0.0/24 => 224.0.0.255 */
if ((ipv4 & htonl (0xffffff00)) == htonl (0xe0000000))
@@ -241,17 +232,17 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
return NULL;
}
- addr.in.sin_addr.s_addr = ipv4;
+ addr.sin.sin_addr.s_addr = ipv4;
break;
}
default:
msg_Err (obj, "Address family %u not supported by SAP",
- (unsigned)addr.a.sa_family);
+ (unsigned)addr.sa.sa_family);
return NULL;
}
- i = vlc_getnameinfo( &addr.a, addrlen,
+ i = vlc_getnameinfo( &addr.sa, addrlen,
psz_addr, sizeof( psz_addr ), NULL, NI_NUMERICHOST );
if( i )
@@ -289,26 +280,26 @@ matched:
/* SAPv1, not encrypted, not compressed */
uint8_t flags = 0x20;
#ifdef AF_INET6
- if (sap_addr->orig.a.sa_family == AF_INET6)
+ if (sap_addr->orig.sa.sa_family == AF_INET6)
flags |= 0x10;
#endif
vlc_memstream_putc(&stream, flags);
vlc_memstream_putc(&stream, 0x00); /* No authentication length */
vlc_memstream_write(&stream, &(uint16_t){ vlc_tick_now() }, 2); /* ID hash */
- switch (sap_addr->orig.a.sa_family)
+ switch (sap_addr->orig.sa.sa_family)
{
#ifdef AF_INET6
case AF_INET6:
{
- const struct in6_addr *a6 = &sap_addr->orig.in6.sin6_addr;
+ const struct in6_addr *a6 = &sap_addr->orig.sin6.sin6_addr;
vlc_memstream_write(&stream, a6, 16);
break;
}
#endif
case AF_INET:
{
- const struct in_addr *a4 = &sap_addr->orig.in.sin_addr;
+ const struct in_addr *a4 = &sap_addr->orig.sin.sin_addr;
vlc_memstream_write(&stream, a4, 4);
break;
}
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/417580d0df4da2bd9c0e95237227f9791accc1b1...6d8273022f08f20d59c947387351f728b6d51246
--
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/417580d0df4da2bd9c0e95237227f9791accc1b1...6d8273022f08f20d59c947387351f728b6d51246
You're receiving this email because of your account on code.videolan.org.
VideoLAN code repository instance
More information about the vlc-commits
mailing list