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