2001-10-22 18:39:12 +04:00
/*
2008-01-30 17:00:02 +03:00
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2007-08-21 00:55:30 +04:00
* Copyright ( C ) 2004 - 2006 Red Hat , Inc . All rights reserved .
2001-10-22 18:39:12 +04:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2 .
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
2007-08-21 00:55:30 +04:00
* of the GNU Lesser General Public License v .2 .1 .
2004-03-30 23:35:44 +04:00
*
2007-08-21 00:55:30 +04:00
* You should have received a copy of the GNU Lesser General Public License
2004-03-30 23:35:44 +04:00
* along with this program ; if not , write to the Free Software Foundation ,
* Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
2001-10-22 18:39:12 +04:00
*/
2002-11-18 17:01:16 +03:00
# include "lib.h"
2001-10-22 18:39:12 +04:00
# include "filter-composite.h"
# include <stdarg.h>
static int _and_p ( struct dev_filter * f , struct device * dev )
{
struct dev_filter * * filters = ( struct dev_filter * * ) f - > private ;
while ( * filters ) {
if ( ! ( * filters ) - > passes_filter ( * filters , dev ) )
return 0 ;
filters + + ;
}
2003-01-08 19:41:22 +03:00
log_debug ( " Using %s " , dev_name ( dev ) ) ;
2001-10-22 18:39:12 +04:00
return 1 ;
}
2006-04-19 19:33:07 +04:00
static void _composite_destroy ( struct dev_filter * f )
2001-10-22 18:39:12 +04:00
{
struct dev_filter * * filters = ( struct dev_filter * * ) f - > private ;
while ( * filters ) {
( * filters ) - > destroy ( * filters ) ;
filters + + ;
}
2005-10-17 03:03:59 +04:00
dm_free ( f - > private ) ;
dm_free ( f ) ;
2001-10-22 18:39:12 +04:00
}
2004-02-13 17:46:04 +03:00
struct dev_filter * composite_filter_create ( int n , struct dev_filter * * filters )
2001-10-22 18:39:12 +04:00
{
2004-05-04 22:28:15 +04:00
struct dev_filter * * filters_copy , * cft ;
2001-10-22 18:39:12 +04:00
2008-01-30 16:19:47 +03:00
if ( ! filters )
return_NULL ;
2001-10-22 18:39:12 +04:00
2005-10-17 03:03:59 +04:00
if ( ! ( filters_copy = dm_malloc ( sizeof ( * filters ) * ( n + 1 ) ) ) ) {
2004-02-13 17:46:04 +03:00
log_error ( " composite filters allocation failed " ) ;
2001-10-22 18:39:12 +04:00
return NULL ;
}
2004-02-13 17:46:04 +03:00
memcpy ( filters_copy , filters , sizeof ( * filters ) * n ) ;
filters_copy [ n ] = NULL ;
2005-10-17 03:03:59 +04:00
if ( ! ( cft = dm_malloc ( sizeof ( * cft ) ) ) ) {
2004-02-13 17:46:04 +03:00
log_error ( " compsoite filters allocation failed " ) ;
2005-10-17 03:03:59 +04:00
dm_free ( filters_copy ) ;
2004-02-13 17:46:04 +03:00
return NULL ;
2001-10-22 18:39:12 +04:00
}
2004-05-04 22:28:15 +04:00
cft - > passes_filter = _and_p ;
2006-04-19 19:33:07 +04:00
cft - > destroy = _composite_destroy ;
2004-05-04 22:28:15 +04:00
cft - > private = filters_copy ;
2001-10-22 18:39:12 +04:00
2004-05-04 22:28:15 +04:00
return cft ;
2001-10-22 18:39:12 +04:00
}