/*****************************************************************************
* sap.c : SAP announce handler
*****************************************************************************
- * Copyright (C) 2002-2008 the VideoLAN team
+ * Copyright (C) 2002-2008 VLC authors and VideoLAN
* $Id$
*
* Authors: Clément Stenac <zorglub@videolan.org>
* Rémi Denis-Courmont <rem # videolan.org>
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/*****************************************************************************
#include <stdlib.h> /* free() */
#include <stdio.h> /* sprintf() */
#include <string.h>
-#include <ctype.h> /* tolower(), isxdigit() */
#include <assert.h>
#include <vlc_sout.h>
struct sap_session_t *next;
const session_descriptor_t *p_sd;
size_t length;
- uint8_t data[0];
+ uint8_t data[];
} sap_session_t;
/* A SAP announce address. For each of these, we run the
{
sap_handler_t *p_sap;
- p_sap = vlc_custom_create (p_announce, sizeof (*p_sap),
- VLC_OBJECT_GENERIC, "sap sender");
+ p_sap = vlc_custom_create (p_announce, sizeof (*p_sap), "sap sender");
if (p_sap == NULL)
return NULL;
* \param p_this the SAP Handler object
* \return nothing
*/
+VLC_NORETURN
static void *RunThread (void *self)
{
sap_address_t *addr = self;
{
int i;
char psz_addr[NI_MAXNUMERICHOST];
- bool b_ipv6 = false, b_ssm = false;
sap_session_t *p_sap_session;
mtime_t i_hash;
- struct sockaddr_storage addr;
+ union
+ {
+ struct sockaddr a;
+ struct sockaddr_in in;
+ struct sockaddr_in6 in6;
+ } addr;
socklen_t addrlen;
addrlen = p_session->addrlen;
/* Determine SAP multicast address automatically */
memcpy (&addr, &p_session->addr, addrlen);
- switch( p_session->addr.ss_family )
+ switch (addr.a.sa_family)
{
#if defined (HAVE_INET_PTON) || defined (WIN32)
case AF_INET6:
{
/* See RFC3513 for list of valid IPv6 scopes */
- struct in6_addr *a6 = &((struct sockaddr_in6 *)&addr)->sin6_addr;
+ struct in6_addr *a6 = &addr.in6.sin6_addr;
memcpy( a6->s6_addr + 2, "\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x02\x7f\xfe", 14 );
if( IN6_IS_ADDR_MULTICAST( a6 ) )
- {
- /* SSM <=> ff3x::/32 */
- b_ssm = (U32_AT (a6->s6_addr) & 0xfff0ffff) == 0xff300000;
-
/* force flags to zero, preserve scope */
a6->s6_addr[1] &= 0xf;
- }
else
/* Unicast IPv6 - assume global scope */
memcpy( a6->s6_addr, "\xff\x0e", 2 );
-
- b_ipv6 = true;
break;
}
#endif
case AF_INET:
{
/* See RFC2365 for IPv4 scopes */
- uint32_t ipv4;
+ uint32_t ipv4 = addr.in.sin_addr.s_addr;
- ipv4 = ntohl( ((struct sockaddr_in *)&addr)->sin_addr.s_addr );
/* 224.0.0.0/24 => 224.0.0.255 */
- if ((ipv4 & 0xffffff00) == 0xe0000000)
- ipv4 = 0xe00000ff;
+ if ((ipv4 & htonl (0xffffff00)) == htonl (0xe0000000))
+ ipv4 = htonl (0xe00000ff);
else
/* 239.255.0.0/16 => 239.255.255.255 */
- if ((ipv4 & 0xffff0000) == 0xefff0000)
- ipv4 = 0xefffffff;
+ if ((ipv4 & htonl (0xffff0000)) == htonl (0xefff0000))
+ ipv4 = htonl (0xefffffff);
else
/* 239.192.0.0/14 => 239.195.255.255 */
- if ((ipv4 & 0xfffc0000) == 0xefc00000)
- ipv4 = 0xefc3ffff;
+ if ((ipv4 & htonl (0xfffc0000)) == htonl (0xefc00000))
+ ipv4 = htonl (0xefc3ffff);
else
- if ((ipv4 & 0xff000000) == 0xef000000)
+ if ((ipv4 & htonl (0xff000000)) == htonl (0xef000000))
ipv4 = 0;
else
/* other addresses => 224.2.127.254 */
- {
- /* SSM: 232.0.0.0/8 */
- b_ssm = (ipv4 >> 24) == 232;
- ipv4 = 0xe0027ffe;
- }
+ ipv4 = htonl (0xe0027ffe);
if( ipv4 == 0 )
{
return VLC_EGENERIC;
}
- ((struct sockaddr_in *)&addr)->sin_addr.s_addr = htonl( ipv4 );
+ addr.in.sin_addr.s_addr = ipv4;
break;
}
default:
msg_Err( p_sap, "Address family %d not supported by SAP",
- addr.ss_family );
+ addr.a.sa_family );
return VLC_EGENERIC;
}
- i = vlc_getnameinfo( (struct sockaddr *)&addr, addrlen,
+ i = vlc_getnameinfo( &addr.a, addrlen,
psz_addr, sizeof( psz_addr ), NULL, NI_NUMERICHOST );
if( i )
{
- msg_Err( p_sap, "%s", vlc_gai_strerror( i ) );
+ msg_Err( p_sap, "%s", gai_strerror( i ) );
return VLC_EGENERIC;
}
/* SAPv1, not encrypted, not compressed */
psz_head[0] = 0x20;
- psz_head[1] = 0x00; /* No authentification length */
+ psz_head[1] = 0x00; /* No authentication length */
i_hash = mdate();
psz_head[2] = i_hash >> 8; /* Msg id hash */