X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fnetwork%2Facl.c;h=06eba088b48d7c369b6732c6c9689fbae07936f9;hb=27e278ee0e34434f8e0eec351101c1307639e848;hp=94ed26ebc32996ec56ef7db00e0d3fa60525e802;hpb=470b47fe952dbba82beca44cafefd4b6ec711384;p=vlc diff --git a/src/network/acl.c b/src/network/acl.c index 94ed26ebc3..06eba088b4 100644 --- a/src/network/acl.c +++ b/src/network/acl.c @@ -1,7 +1,7 @@ /***************************************************************************** * acl.c: ***************************************************************************** - * Copyright (C) 2005 Rémi Denis-Courmont + * Copyright © 2005-2007 Rémi Denis-Courmont * $Id$ * * Authors: Rémi Denis-Courmont @@ -24,17 +24,15 @@ /***************************************************************************** * Preamble *****************************************************************************/ -#include -#include -#include #include -#include "vlc_acl.h" +#include +#include #include -#include "network.h" -#include "charset.h" +#include +#include /* FIXME: rwlock on acl, but libvlc doesn't implement rwlock */ typedef struct vlc_acl_entry_t @@ -56,9 +54,10 @@ struct vlc_acl_t static int ACL_Resolve( vlc_object_t *p_this, uint8_t *p_bytes, const char *psz_ip ) { - struct addrinfo hints = { 0 }, *res; + struct addrinfo hints, *res; int i_family; + memset (&hints, 0, sizeof (hints)); hints.ai_socktype = SOCK_STREAM; /* doesn't matter */ hints.ai_flags = AI_NUMERICHOST; @@ -107,8 +106,15 @@ static int ACL_Resolve( vlc_object_t *p_this, uint8_t *p_bytes, } -/* - * Returns 0 if allowed, 1 if not, -1 on error. +/** + * Check if a given address passes an access control list. + * + * @param p_acl pre-existing ACL to match the address against + * @param psz_ip numeric IPv4/IPv6 address + * + * @return 0 if the first matching ACL entry is an access grant, + * 1 if the first matching ACL entry is a denial of access, + * -1 on error. */ int ACL_Check( vlc_acl_t *p_acl, const char *psz_ip ) { @@ -139,6 +145,10 @@ int ACL_Check( vlc_acl_t *p_acl, const char *psz_ip ) return !p_acl->b_allow_default; } +/** + * Adds an item to an ACL. + * Items are always matched in the same order as they are added. + */ int ACL_AddNet( vlc_acl_t *p_acl, const char *psz_ip, int i_len, vlc_bool_t b_allow ) { @@ -191,6 +201,14 @@ int ACL_AddNet( vlc_acl_t *p_acl, const char *psz_ip, int i_len, } +/** + * Creates an empty ACL. + * + * @param b_allow whether to grant (VLC_TRUE) or deny (VLC_FALSE) access + * by default (ie if none of the ACL entries matched). + * + * @return an ACL object. NULL in case of error. + */ vlc_acl_t *__ACL_Create( vlc_object_t *p_this, vlc_bool_t b_allow ) { vlc_acl_t *p_acl; @@ -209,6 +227,14 @@ vlc_acl_t *__ACL_Create( vlc_object_t *p_this, vlc_bool_t b_allow ) } +/** + * Perform a deep copy of an existing ACL. + * + * @param p_this object to attach the copy to. + * @param p_acl ACL object to be copied. + * + * @return a new ACL object, or NULL on error. + */ vlc_acl_t *__ACL_Duplicate( vlc_object_t *p_this, const vlc_acl_t *p_acl ) { vlc_acl_t *p_dupacl; @@ -246,6 +272,9 @@ vlc_acl_t *__ACL_Duplicate( vlc_object_t *p_this, const vlc_acl_t *p_acl ) } +/** + * Releases all resources associated with an ACL object. + */ void ACL_Destroy( vlc_acl_t *p_acl ) { if( p_acl != NULL ) @@ -258,10 +287,15 @@ void ACL_Destroy( vlc_acl_t *p_acl ) } } -#ifndef isblank -# define isblank(c) ((c) == ' ' || (c) == '\t') -#endif +/** + * Reads ACL entries from a file. + * + * @param p_acl ACL object in which to insert parsed entries. + * @param psz_patch filename from which to parse entries. + * + * @return 0 on success, -1 on error. + */ int ACL_LoadFile( vlc_acl_t *p_acl, const char *psz_path ) { FILE *file; @@ -307,12 +341,14 @@ int ACL_LoadFile( vlc_acl_t *p_acl, const char *psz_path ) psz_path); do { - fgets( line, sizeof( line ), file ); - if( ferror( file ) || feof( file ) ) + if( fgets( line, sizeof( line ), file ) == NULL ) { - msg_Err( p_acl->p_owner, "error reading %s : %s\n", - psz_path, strerror( errno ) ); - goto error; + if( ferror( file ) ) + { + msg_Err( p_acl->p_owner, "error reading %s : %s\n", + psz_path, strerror( errno ) ); + } + goto error; } } while( strchr( line, '\n' ) == NULL);