- }
-
- return -1;
-}
-
-
-/**
- * Old-style any-source multicast join.
- * In use on Windows XP/2003 and older.
- */
-static int
-net_IPv4Join (vlc_object_t *obj, int fd,
- const struct sockaddr_in *src, const struct sockaddr_in *grp)
-{
-#ifdef IP_ADD_MEMBERSHIP
- union
- {
- struct ip_mreq gr4;
-# ifdef IP_ADD_SOURCE_MEMBERSHIP
- struct ip_mreq_source gsr4;
-# endif
- } opt;
- int cmd;
- struct in_addr id = { .s_addr = INADDR_ANY };
- socklen_t optlen;
-
- /* Multicast interface IPv4 address */
- char *iface = var_CreateGetNonEmptyString (obj, "miface-addr");
- if ((iface != NULL)
- && (inet_pton (AF_INET, iface, &id) <= 0))
- {
- msg_Err (obj, "invalid multicast interface address %s", iface);
- free (iface);
- goto error;
- }
- free (iface);
-
- memset (&opt, 0, sizeof (opt));
- if (src != NULL)
- {
-# ifdef IP_ADD_SOURCE_MEMBERSHIP
- cmd = IP_ADD_SOURCE_MEMBERSHIP;
- opt.gsr4.imr_multiaddr = grp->sin_addr;
- opt.gsr4.imr_sourceaddr = src->sin_addr;
- opt.gsr4.imr_interface = id;
- optlen = sizeof (opt.gsr4);
-# else
- errno = ENOSYS;
- goto error;
-# endif
- }
- else
- {
- cmd = IP_ADD_MEMBERSHIP;
- opt.gr4.imr_multiaddr = grp->sin_addr;
- opt.gr4.imr_interface = id;
- optlen = sizeof (opt.gr4);
- }
-
- msg_Dbg (obj, "IP_ADD_%sMEMBERSHIP multicast request",
- (src != NULL) ? "SOURCE_" : "");
-
- if (setsockopt (fd, SOL_IP, cmd, &opt, optlen) == 0)
- return 0;
-
-error: