]> git.sesse.net Git - vlc/blobdiff - src/misc/net.c
* modules/control/http.c: Added support for .hosts files detailing hosts
[vlc] / src / misc / net.c
index 95d76d39402da181be18106892aa8233147d42c7..a090d5d9ec36fa8c768bbf5ae9f171fdc77606b8 100644 (file)
@@ -1171,3 +1171,59 @@ static int SocksHandshakeTCP( vlc_object_t *p_obj,
 
     return VLC_SUCCESS;
 }
+
+/*****************************************************************************
+ * __net_CheckIP
+ *****************************************************************************
+ * Check that a given IP is within a set of IP/netmask.
+ *****************************************************************************/
+int __net_CheckIP( vlc_object_t *p_this, char *psz_ip, char **ppsz_hosts,
+                   int i_hosts )
+{
+    struct in_addr ip;
+    int i;
+
+    if( !inet_aton( psz_ip, &ip ) )
+    {
+        return VLC_EGENERIC;
+    }
+
+    for( i = 0; i < i_hosts; i++ )
+    {
+        struct in_addr base, mask;
+        char *psz_host = strdup( ppsz_hosts[i] );
+        char *p = strchr( psz_host, '/' );
+
+        if( p != NULL )
+        {
+            int i_mask;
+            *p++ = '\0';
+            i_mask = atoi(p);
+            if( i_mask < 0 || i_mask > 32 )
+            {
+                msg_Err( p_this, "invalid netmask %s", p );
+                mask.s_addr = INADDR_NONE;
+            }
+            else if( i_mask == 0 )
+                mask.s_addr = INADDR_ANY;
+            else
+                mask.s_addr = htons( ntohs(INADDR_NONE) << (32 - i_mask) );
+        }
+        else
+            mask.s_addr = INADDR_NONE;
+
+        if( !inet_aton( psz_host, &base ) )
+        {
+            msg_Err( p_this, "invalid base address %s", psz_host );
+            free( psz_host );
+            continue;
+        }
+        free( psz_host );
+
+        if( !((ip.s_addr ^ base.s_addr) & mask.s_addr) )
+            return VLC_TRUE;
+    }
+
+    return VLC_FALSE;
+}
+