static
char *AddressToSDP (const struct sockaddr *addr, socklen_t addrlen, char *buf)
{
+ if (addrlen < offsetof (struct sockaddr, sa_family)
+ + sizeof (addr->sa_family))
+ return NULL;
+
const char *ttl = NULL;
strcpy (buf, "IN IP* ");
return NULL;
}
- if (vlc_getnameinfo (addr, addrlen, buf + 4, MAXSDPADDRESS - 4, NULL,
+ if (vlc_getnameinfo (addr, addrlen, buf + 7, MAXSDPADDRESS - 7, NULL,
NI_NUMERICHOST))
return NULL;
char *StartSDP (const char *name, const char *description, const char *url,
- const char *email, const char *phone,
+ const char *email, const char *phone, vlc_bool_t ssm,
const struct sockaddr *orig, socklen_t origlen,
const struct sockaddr *addr, socklen_t addrlen)
{
uint64_t t = NTPtime64 ();
- char *sdp, machine[MAXSDPADDRESS], conn[MAXSDPADDRESS];
+ char *sdp, machine[MAXSDPADDRESS], conn[MAXSDPADDRESS],
+ sfilter[MAXSDPADDRESS + sizeof ("\r\na=source-filter: incl * ")];
const char *preurl = "\r\nu=", *premail = "\r\ne=", *prephone = "\r\np=";
if (name == NULL)
if (!IsSDPString (name) || !IsSDPString (description)
|| !IsSDPString (url) || !IsSDPString (email) || !IsSDPString (phone)
- || (AddressToSDP ((struct sockaddr *)&orig, origlen, machine) == NULL)
- || (AddressToSDP ((struct sockaddr *)&addr, addrlen, conn) == NULL))
+ || (AddressToSDP ((struct sockaddr *)orig, origlen, machine) == NULL)
+ || (AddressToSDP ((struct sockaddr *)addr, addrlen, conn) == NULL))
return NULL;
+ if (ssm)
+ sprintf (sfilter, "\r\na=source-filter: incl IN IP%c * %s",
+ machine[5], machine + 7);
+ else
+ *sfilter = '\0';
+
if (asprintf (&sdp, "v=0"
"\r\no=- "I64Fu" "I64Fu" %s"
"\r\ns=%s"
"%s%s" // optional phone number
"\r\nc=%s"
// bandwidth not specified
- "\r\nt= 0 0" // one dummy time span
+ "\r\nt=0 0" // one dummy time span
// no repeating
// no time zone adjustment (silly idea anyway)
// no encryption key (deprecated)
"\r\na=recvonly"
"\r\na=type:broadcast"
"\r\na=charset:UTF-8"
+ "%s" // optional source filter
"\r\n",
/* o= */ t, t, machine,
/* s= */ name,
/* u= */ preurl, url,
/* e= */ premail, email,
/* p= */ prephone, phone,
- /* c= */ conn) == -1)
+ /* c= */ conn,
+ /* source-filter */ sfilter) == -1)
return NULL;
return sdp;
}