/* * This file is part of ltrace. * Copyright (C) 2012 Petr Machata, Red Hat Inc. * * 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 (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. * * 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 St, Fifth Floor, Boston, MA * 02110-1301 USA */ /* This file contains declarations and types for working with symbol * filters. */ #ifndef FILTER_H #define FILTER_H #include <sys/types.h> #include <regex.h> #include "forward.h" enum filter_lib_matcher_type { /* Match by soname. */ FLM_SONAME, /* Match by path name. */ FLM_PATHNAME, /* Match main binary. */ FLM_MAIN, }; struct filter_lib_matcher { enum filter_lib_matcher_type type; regex_t libname_re; }; enum filter_rule_type { FR_ADD, FR_SUBTRACT, }; struct filter_rule { struct filter_rule *next; struct filter_lib_matcher *lib_matcher; regex_t symbol_re; /* Regex for matching symbol name. */ enum filter_rule_type type; }; struct filter { struct filter *next; struct filter_rule *rules; }; void filter_init(struct filter *filt); void filter_destroy(struct filter *filt); /* Both SYMBOL_RE and MATCHER are owned and destroyed by RULE. */ void filter_rule_init(struct filter_rule *rule, enum filter_rule_type type, struct filter_lib_matcher *matcher, regex_t symbol_re); void filter_rule_destroy(struct filter_rule *rule); /* RULE is added to FILT and owned and destroyed by it. */ void filter_add_rule(struct filter *filt, struct filter_rule *rule); /* Create a matcher that matches library name. RE is owned and * destroyed by MATCHER. TYPE shall be FLM_SONAME or * FLM_PATHNAME. */ void filter_lib_matcher_name_init(struct filter_lib_matcher *matcher, enum filter_lib_matcher_type type, regex_t re); /* Create a matcher that matches main binary. */ void filter_lib_matcher_main_init(struct filter_lib_matcher *matcher); void filter_lib_matcher_destroy(struct filter_lib_matcher *matcher); /* Ask whether FILTER might match a symbol in LIB. 0 if no, non-0 if * yes. Note that positive answer doesn't mean that anything will * actually be matched, just that potentially it could. */ int filter_matches_library(struct filter *filt, struct library *lib); /* Ask whether FILTER matches this symbol. Returns 0 if it doesn't, * or non-0 value if it does. */ int filter_matches_symbol(struct filter *filt, const char *sym_name, struct library *lib); #endif /* FILTER_H */