1/* 2 * This file is part of ltrace. 3 * Copyright (C) 2012 Petr Machata, Red Hat Inc. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation; either version 2 of the 8 * License, or (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 18 * 02110-1301 USA 19 */ 20 21/* This file contains declarations and types for working with symbol 22 * filters. */ 23 24#ifndef FILTER_H 25#define FILTER_H 26 27#include <sys/types.h> 28#include <regex.h> 29 30#include "forward.h" 31 32enum filter_lib_matcher_type { 33 /* Match by soname. */ 34 FLM_SONAME, 35 /* Match by path name. */ 36 FLM_PATHNAME, 37 /* Match main binary. */ 38 FLM_MAIN, 39}; 40 41struct filter_lib_matcher { 42 enum filter_lib_matcher_type type; 43 regex_t libname_re; 44}; 45 46enum filter_rule_type { 47 FR_ADD, 48 FR_SUBTRACT, 49}; 50 51struct filter_rule { 52 struct filter_rule *next; 53 struct filter_lib_matcher *lib_matcher; 54 regex_t symbol_re; /* Regex for matching symbol name. */ 55 enum filter_rule_type type; 56}; 57 58struct filter { 59 struct filter *next; 60 struct filter_rule *rules; 61}; 62 63void filter_init(struct filter *filt); 64void filter_destroy(struct filter *filt); 65 66/* Both SYMBOL_RE and MATCHER are owned and destroyed by RULE. */ 67void filter_rule_init(struct filter_rule *rule, enum filter_rule_type type, 68 struct filter_lib_matcher *matcher, 69 regex_t symbol_re); 70 71void filter_rule_destroy(struct filter_rule *rule); 72 73/* RULE is added to FILT and owned and destroyed by it. */ 74void filter_add_rule(struct filter *filt, struct filter_rule *rule); 75 76/* Create a matcher that matches library name. RE is owned and 77 * destroyed by MATCHER. TYPE shall be FLM_SONAME or 78 * FLM_PATHNAME. */ 79void filter_lib_matcher_name_init(struct filter_lib_matcher *matcher, 80 enum filter_lib_matcher_type type, 81 regex_t re); 82 83/* Create a matcher that matches main binary. */ 84void filter_lib_matcher_main_init(struct filter_lib_matcher *matcher); 85 86void filter_lib_matcher_destroy(struct filter_lib_matcher *matcher); 87 88/* Ask whether FILTER might match a symbol in LIB. 0 if no, non-0 if 89 * yes. Note that positive answer doesn't mean that anything will 90 * actually be matched, just that potentially it could. */ 91int filter_matches_library(struct filter *filt, struct library *lib); 92 93/* Ask whether FILTER matches this symbol. Returns 0 if it doesn't, 94 * or non-0 value if it does. */ 95int filter_matches_symbol(struct filter *filt, const char *sym_name, 96 struct library *lib); 97 98#endif /* FILTER_H */ 99