]> git.sesse.net Git - vlc/blobdiff - src/stream_output/sap.c
osx: fix config_GetLibDir
[vlc] / src / stream_output / sap.c
index e3c9d19f0caa657942089245862fdd1a5b41230e..aa4ded33a03809f076ea5465927daac9f87397ec 100644 (file)
@@ -1,25 +1,25 @@
 /*****************************************************************************
  * 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.
  *****************************************************************************/
 
 /*****************************************************************************
@@ -35,7 +35,6 @@
 #include <stdlib.h>                                                /* free() */
 #include <stdio.h>                                              /* sprintf() */
 #include <string.h>
-#include <ctype.h>                                  /* tolower(), isxdigit() */
 #include <assert.h>
 
 #include <vlc_sout.h>
@@ -53,7 +52,7 @@ typedef struct sap_session_t
     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
@@ -104,8 +103,7 @@ sap_handler_t *SAP_Create (vlc_object_t *p_announce)
 {
     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;
 
@@ -172,6 +170,7 @@ static void AddressDestroy (sap_address_t *addr)
  * \param p_this the SAP Handler object
  * \return nothing
  */
+VLC_NORETURN
 static void *RunThread (void *self)
 {
     sap_address_t *addr = self;
@@ -211,10 +210,14 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session)
 {
     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;
@@ -227,29 +230,22 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session)
     /* 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
@@ -257,30 +253,25 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session)
         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 )
             {
@@ -289,22 +280,22 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session)
                 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;
     }
 
@@ -369,7 +360,7 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session)
 
     /* 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 */