summaryrefslogtreecommitdiff
path: root/multimedia/libdvbpsi
diff options
context:
space:
mode:
authorjoerg <joerg@pkgsrc.org>2015-03-31 15:52:50 +0000
committerjoerg <joerg@pkgsrc.org>2015-03-31 15:52:50 +0000
commit8a6754e38f0f09d61d717f124e4c1bb68a294aa2 (patch)
treeb865ed4b16558644bf53f79464846377ec3fb2fe /multimedia/libdvbpsi
parent317674727639a29f8ed7b508128c5901bd4eca19 (diff)
downloadpkgsrc-8a6754e38f0f09d61d717f124e4c1bb68a294aa2.tar.gz
Fix example to not trigger alignment warnings. Fix a real bug while here
-- casting the address of ai_addr to sockaddr_* is not a good idea.
Diffstat (limited to 'multimedia/libdvbpsi')
-rw-r--r--multimedia/libdvbpsi/distinfo4
-rw-r--r--multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c115
2 files changed, 114 insertions, 5 deletions
diff --git a/multimedia/libdvbpsi/distinfo b/multimedia/libdvbpsi/distinfo
index 423bb3b1065..b8297ea20d8 100644
--- a/multimedia/libdvbpsi/distinfo
+++ b/multimedia/libdvbpsi/distinfo
@@ -1,6 +1,6 @@
-$NetBSD: distinfo,v 1.13 2014/04/17 12:28:56 wiz Exp $
+$NetBSD: distinfo,v 1.14 2015/03/31 15:52:50 joerg Exp $
SHA1 (libdvbpsi-1.2.0.tar.bz2) = b918985f65e1d14bf19209b6b3def254c902901a
RMD160 (libdvbpsi-1.2.0.tar.bz2) = 0c14a32f1cab0dbe834bcb02cbc8cc9a6fc47752
Size (libdvbpsi-1.2.0.tar.bz2) = 461372 bytes
-SHA1 (patch-examples_dvbinfo_udp.c) = 7c1829ca0cfd7f1c6f051569bb8b0ab0e01f1f9e
+SHA1 (patch-examples_dvbinfo_udp.c) = 4d4360780a3d54cdd669760235df7a67d296989e
diff --git a/multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c b/multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c
index fd3a37bd4f2..d8b28c89a6a 100644
--- a/multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c
+++ b/multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c
@@ -1,10 +1,11 @@
-$NetBSD: patch-examples_dvbinfo_udp.c,v 1.2 2013/10/05 08:29:38 wiz Exp $
+$NetBSD: patch-examples_dvbinfo_udp.c,v 1.3 2015/03/31 15:52:51 joerg Exp $
Portability fix from upstream (Jean-Paul Saman <jpsaman@videolan.org>).
+Don't cast alignments away.
---- examples/dvbinfo/udp.c.orig 2013-10-02 10:19:18.000000000 +0000
+--- examples/dvbinfo/udp.c.orig 2014-04-16 07:22:14.000000000 +0000
+++ examples/dvbinfo/udp.c
-@@ -61,6 +61,16 @@
+@@ -61,43 +61,53 @@
# include <fcntl.h>
#endif
@@ -21,3 +22,111 @@ Portability fix from upstream (Jean-Paul Saman <jpsaman@videolan.org>).
#include <assert.h>
#include "udp.h"
+
+ #ifdef HAVE_SYS_SOCKET_H
+-static bool is_multicast(const struct sockaddr_storage *saddr, socklen_t len)
++static bool is_multicast(const struct sockaddr *addr, socklen_t len)
+ {
+- const struct sockaddr *addr = (const struct sockaddr *) saddr;
+
+ switch(addr->sa_family)
+ {
+ #if defined(IN_MULTICAST)
+ case AF_INET:
+ {
+- const struct sockaddr_in *ip = (const struct sockaddr_in *)saddr;
+- if ((size_t)len < sizeof (*ip))
++ struct sockaddr_in ip;
++ if ((size_t)len < sizeof (ip))
+ return false;
+- return IN_MULTICAST(ntohl(ip->sin_addr.s_addr)) != 0;
++ memcpy(&ip, addr, sizeof(ip));
++ return IN_MULTICAST(ntohl(ip.sin_addr.s_addr)) != 0;
+ }
+ #endif
+ #if defined(IN6_IS_ADDR_MULTICAST)
+ case AF_INET6:
+ {
+- const struct sockaddr_in6 *ip6 = (const struct sockaddr_in6 *)saddr;
+- if ((size_t)len < sizeof (*ip6))
++ struct sockaddr_in6 ip6;
++ if ((size_t)len < sizeof (ip6))
+ return false;
+- return IN6_IS_ADDR_MULTICAST(&ip6->sin6_addr) != 0;
++ memcpy(&ip6, addr, sizeof(ip6));
++ return IN6_IS_ADDR_MULTICAST(&ip6.sin6_addr) != 0;
+ }
+ #endif
+ }
+ return false;
+ }
+
+-static bool mcast_connect(int s, const char *interface, const struct sockaddr_storage *saddr, socklen_t len)
++static bool mcast_connect(int s, const char *interface, const struct sockaddr *addr, socklen_t len)
+ {
+ unsigned int ifindex = interface ? if_nametoindex(interface) : 0;
+- const struct sockaddr *addr = (const struct sockaddr *) saddr;
+
+ #if defined(MCAST_JOIN_GROUP)
+ /* Source Specific Multicast Join */
+@@ -115,10 +125,13 @@ static bool mcast_connect(int s, const c
+ {
+ case AF_INET6:
+ {
+- const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)saddr;
++ struct sockaddr_in6 sin6;
+ assert(len >= sizeof (struct sockaddr_in6));
+- if (sin6->sin6_scope_id != 0)
+- greq.gr_interface = sin6->sin6_scope_id;
++ memcpy(&sin6, addr, sizeof(sin6));
++ if (sin6.sin6_scope_id != 0) {
++ greq.gr_interface = sin6.sin6_scope_id;
++ memcpy(&greq.gr_group, &sin6, sizeof(sin6));
++ }
+ if (setsockopt(s, SOL_IPV6, MCAST_JOIN_GROUP, &greq, sizeof(greq)) == 0)
+ return true;
+ break;
+@@ -136,12 +149,14 @@ static bool mcast_connect(int s, const c
+ case AF_INET6:
+ {
+ struct ipv6_mreq ipv6mr;
+- const struct sockaddr_in6 *ip6 = (const struct sockaddr_in6 *)saddr;
++ struct sockaddr_in6 ip6;
++ assert(len >= sizeof (struct sockaddr_in6));
++ memcpy(&ip6, addr, sizeof(ip6));
+
+ memset(&ipv6mr, 0, sizeof (ipv6mr));
+ assert(len >= sizeof (struct sockaddr_in6));
+- ipv6mr.ipv6mr_multiaddr = ip6->sin6_addr;
+- ipv6mr.ipv6mr_interface = (ifindex > 0) ? ifindex : ip6->sin6_scope_id;
++ ipv6mr.ipv6mr_multiaddr = ip6.sin6_addr;
++ ipv6mr.ipv6mr_interface = (ifindex > 0) ? ifindex : ip6.sin6_scope_id;
+ # ifdef IPV6_JOIN_GROUP
+ if (setsockopt(s, SOL_IPV6, IPV6_JOIN_GROUP, &ipv6mr, sizeof (ipv6mr)) == 0)
+ # else
+@@ -154,10 +169,12 @@ static bool mcast_connect(int s, const c
+ case AF_INET:
+ {
+ struct ip_mreq imr;
++ struct sockaddr_in ip;
+
+ memset(&imr, 0, sizeof (imr));
+ assert(len >= sizeof (struct sockaddr_in));
+- imr.imr_multiaddr = ((const struct sockaddr_in *)saddr)->sin_addr;
++ memcpy(&ip, addr, sizeof(ip));
++ imr.imr_multiaddr = ip.sin_addr;
+ #if 0 /* TODO: Source Specific Multicast Join */
+ if (ifaddr) /* Linux specific interface bound multicast address */
+ imr.imr_address.s_addr = if_addr;
+@@ -284,9 +301,8 @@ int udp_open(const char *interface, cons
+ continue;
+ }
+
+- const struct sockaddr_storage *saddr = (const struct sockaddr_storage *)&ptr->ai_addr;
+- if (is_multicast(saddr, ptr->ai_addrlen) &&
+- mcast_connect(s_ctl, NULL, saddr, ptr->ai_addrlen))
++ if (is_multicast(ptr->ai_addr, ptr->ai_addrlen) &&
++ mcast_connect(s_ctl, NULL, ptr->ai_addr, ptr->ai_addrlen))
+ {
+ close(s_ctl);
+ s_ctl = -1;