[FFmpeg-devel] [PATCH v3] avformat/rtsp: introduce get_sa_len() function
Kevin Lo
kevlo at kevlo.org
Fri Nov 25 09:17:22 EET 2016
Since the Linux implementation of sockaddr doesn't have sa_len as a member,
but the FreeBSD version does, introduce a get_sa_len() function that
determines the size based on the address family.
Signed-off-by: Kevin Lo <kevlo at kevlo.org>
---
v3: Check for the right feature when using a sockaddr_in6.
Some systems, such as OS/2, define AF_INET6 without a full implementation.
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index c6292c5..ff0e221 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -202,6 +202,21 @@ static int get_sockaddr(AVFormatContext *s,
return 0;
}
+static socklen_t
+get_sa_len(struct sockaddr *addr)
+{
+ switch (addr->sa_family) {
+ case AF_INET:
+ return (sizeof(struct sockaddr_in));
+#if HAVE_STRUCT_SOCKADDR_IN6
+ case AF_INET6:
+ return (sizeof(struct sockaddr_in6));
+#endif
+ default:
+ return (sizeof(struct sockaddr));
+ }
+}
+
#if CONFIG_RTPDEC
static void init_rtp_handler(RTPDynamicProtocolHandler *handler,
RTSPStream *rtsp_st, AVStream *st)
@@ -1614,7 +1629,8 @@ int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port,
}
if (ttl > 0)
snprintf(optbuf, sizeof(optbuf), "?ttl=%d", ttl);
- getnameinfo((struct sockaddr*) &addr, sizeof(addr),
+ getnameinfo((struct sockaddr*) &addr,
+ get_sa_len((struct sockaddr*) &addr),
namebuf, sizeof(namebuf), NULL, 0, NI_NUMERICHOST);
ff_url_join(url, sizeof(url), "rtp", NULL, namebuf,
port, "%s", optbuf);
@@ -1830,7 +1846,8 @@ redirect:
goto fail;
}
if (!getpeername(tcp_fd, (struct sockaddr*) &peer, &peer_len)) {
- getnameinfo((struct sockaddr*) &peer, peer_len, host, sizeof(host),
+ getnameinfo((struct sockaddr*) &peer,
+ get_sa_len((struct sockaddr*) &peer), host, sizeof(host),
NULL, 0, NI_NUMERICHOST);
}
@@ -2310,7 +2327,7 @@ static int sdp_read_header(AVFormatContext *s)
AVDictionary *opts = map_to_opts(rt);
err = getnameinfo((struct sockaddr*) &rtsp_st->sdp_ip,
- sizeof(rtsp_st->sdp_ip),
+ get_sa_len((struct sockaddr*) &rtsp_st->sdp_ip),
namebuf, sizeof(namebuf), NULL, 0, NI_NUMERICHOST);
if (err) {
av_log(s, AV_LOG_ERROR, "getnameinfo: %s\n", gai_strerror(err));
More information about the ffmpeg-devel
mailing list