forked from draios/sysdig
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Add ability to test a path against many prefixes Add a data structure that allows testing a path aka /var/log/messages against a set of path prefixes (/usr, /bin, /var/log, ...). Thinking ahead to use in libsinsp, the search structure uses pointer + length pairs instead of strings, meaning that it does not copy any data, only refers to it. This way the structure doesn't copy filtercheck values. In order to share the idea of a pair of pointer + length between this structure and the unordered_set used by "in (...)" set membership tests, move the hashing and equality function from filterchecks to a standalone header filter_value.h and use it for the unordered_map. The paths are held in a tree-like structure. At each level, an unordered map has the path components for that level and a sub-tree of paths for that root. The tree can change if new search paths are prefixes of any of the current paths (the sub-tree for the longer path is replaced by the prefix). If a new search path is a suffix of any existing path no change is made, as it is already covered by the prefix. Matching involves splitting off the first directory component and testing it against the values at that level. If a match is found, it recursively calls match for the subtree. * Add pmatch operator, using prefix_search struct. Remove the definitions of filter_value_member_t/hash function/equality function from filterchecks.h, renaming it to filter_value_t along the way. Add an operator CO_PMATCH/"pmatch" which takes a set of values like CO_IN does, but requires that the left hand side of the comparison is a PT_CHARBUF. When filter values are added, they are added to the new path_prefix_search object m_val_storages_paths. in ::flt_compare, when the operator is CO_PMATCH, test the value against m_val_storages_paths. As a result, you can run sysdig using a command line like: sudo ./userspace/sysdig/sysdig "evt.type=open and fd.directory pmatch (/var, /usr)" and see all the file opens for files below either /var or /usr.
- Loading branch information
Showing
8 changed files
with
392 additions
and
55 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
/* | ||
Copyright (C) 2013-2016 Draios inc. | ||
This file is part of sysdig. | ||
sysdig is free software; you can redistribute it and/or modify | ||
it under the terms of the GNU General Public License version 2 as | ||
published by the Free Software Foundation. | ||
sysdig 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 sysdig. If not, see <http://www.gnu.org/licenses/>. | ||
*/ | ||
|
||
#pragma once | ||
|
||
#include <string.h> | ||
#include <utility> | ||
|
||
// Used for CO_IN/CO_PMATCH filterchecks using PT_CHARBUFs to allow | ||
// for quick multi-value comparisons. Should also work for any | ||
// filtercheck with a buffer and length. When compiling with gnu | ||
// compilers, use the built in but not standard _hash_impl::hash | ||
// function, which uses murmurhash2 and is quite fast. Otherwise, uses | ||
// http://www.cse.yorku.ca/~oz/hash.html. | ||
|
||
typedef std::pair<uint8_t *, uint32_t> filter_value_t; | ||
|
||
struct g_hash_membuf | ||
{ | ||
size_t operator()(filter_value_t val) const | ||
{ | ||
#ifdef __GNUC__ | ||
return std::_Hash_impl::hash(val.first, val.second); | ||
#else | ||
size_t hash = 5381; | ||
for(uint8_t *p = val.first; p-val.first < val.second; p++) | ||
{ | ||
int c = *p; | ||
|
||
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ | ||
} | ||
return hash; | ||
#endif | ||
} | ||
}; | ||
|
||
struct g_equal_to_membuf | ||
{ | ||
bool operator()(filter_value_t a, filter_value_t b) const | ||
{ | ||
return (a.second == b.second && | ||
memcmp(a.first, b.first, a.second) == 0); | ||
} | ||
}; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.