11bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata/* 21bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * This file is part of ltrace. 31bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * Copyright (C) 2012 Petr Machata, Red Hat Inc. 41bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * 51bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * This program is free software; you can redistribute it and/or 61bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * modify it under the terms of the GNU General Public License as 71bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * published by the Free Software Foundation; either version 2 of the 81bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * License, or (at your option) any later version. 91bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * 101bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * This program is distributed in the hope that it will be useful, but 111bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of 121bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 131bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * General Public License for more details. 141bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * 151bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * You should have received a copy of the GNU General Public License 161bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * along with this program; if not, write to the Free Software 171bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 181bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * 02110-1301 USA 191bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata */ 201bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 211bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata/* This file contains declarations and types for working with symbol 221bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * filters. */ 231bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 241bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata#ifndef FILTER_H 251bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata#define FILTER_H 261bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 271bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata#include <sys/types.h> 281bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata#include <regex.h> 291bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 3000fbf3d921ec2ebf8fd40f0ea22edda9af3f134bPetr Machata#include "forward.h" 311bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 321bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machataenum filter_lib_matcher_type { 330b55b5852b9fe2ed6cceada004db303fe6efe6cePetr Machata /* Match by soname. */ 340b55b5852b9fe2ed6cceada004db303fe6efe6cePetr Machata FLM_SONAME, 350b55b5852b9fe2ed6cceada004db303fe6efe6cePetr Machata /* Match by path name. */ 360b55b5852b9fe2ed6cceada004db303fe6efe6cePetr Machata FLM_PATHNAME, 371bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata /* Match main binary. */ 381bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata FLM_MAIN, 391bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata}; 401bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 411bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machatastruct filter_lib_matcher { 421bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata enum filter_lib_matcher_type type; 431bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata regex_t libname_re; 441bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata}; 451bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 461bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machataenum filter_rule_type { 471bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata FR_ADD, 481bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata FR_SUBTRACT, 491bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata}; 501bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 511bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machatastruct filter_rule { 521bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata struct filter_rule *next; 531bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata struct filter_lib_matcher *lib_matcher; 541bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata regex_t symbol_re; /* Regex for matching symbol name. */ 551bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata enum filter_rule_type type; 561bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata}; 571bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 581bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machatastruct filter { 591bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata struct filter *next; 601bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata struct filter_rule *rules; 611bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata}; 621bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 631bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machatavoid filter_init(struct filter *filt); 641bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machatavoid filter_destroy(struct filter *filt); 651bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 661bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata/* Both SYMBOL_RE and MATCHER are owned and destroyed by RULE. */ 671bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machatavoid filter_rule_init(struct filter_rule *rule, enum filter_rule_type type, 681bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata struct filter_lib_matcher *matcher, 691bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata regex_t symbol_re); 701bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 711bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machatavoid filter_rule_destroy(struct filter_rule *rule); 721bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 731bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata/* RULE is added to FILT and owned and destroyed by it. */ 741bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machatavoid filter_add_rule(struct filter *filt, struct filter_rule *rule); 751bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 760b55b5852b9fe2ed6cceada004db303fe6efe6cePetr Machata/* Create a matcher that matches library name. RE is owned and 770b55b5852b9fe2ed6cceada004db303fe6efe6cePetr Machata * destroyed by MATCHER. TYPE shall be FLM_SONAME or 780b55b5852b9fe2ed6cceada004db303fe6efe6cePetr Machata * FLM_PATHNAME. */ 791bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machatavoid filter_lib_matcher_name_init(struct filter_lib_matcher *matcher, 800b55b5852b9fe2ed6cceada004db303fe6efe6cePetr Machata enum filter_lib_matcher_type type, 810b55b5852b9fe2ed6cceada004db303fe6efe6cePetr Machata regex_t re); 821bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 831bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata/* Create a matcher that matches main binary. */ 841bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machatavoid filter_lib_matcher_main_init(struct filter_lib_matcher *matcher); 851bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 861bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machatavoid filter_lib_matcher_destroy(struct filter_lib_matcher *matcher); 871bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 881bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata/* Ask whether FILTER might match a symbol in LIB. 0 if no, non-0 if 891bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * yes. Note that positive answer doesn't mean that anything will 901bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * actually be matched, just that potentially it could. */ 911bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machataint filter_matches_library(struct filter *filt, struct library *lib); 921bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 931bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata/* Ask whether FILTER matches this symbol. Returns 0 if it doesn't, 941bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata * or non-0 value if it does. */ 95b5f80ac8982c40f79915ce1e1cb9bf8650ac5fe7Petr Machataint filter_matches_symbol(struct filter *filt, const char *sym_name, 96b5f80ac8982c40f79915ce1e1cb9bf8650ac5fe7Petr Machata struct library *lib); 971bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata 981bbfbc6c6a7b7706bf4e8bf152d7ffc28453c3bdPetr Machata#endif /* FILTER_H */ 99