26 #include <sys/types.h>
42 #define MAX_ERR_STR_SIZE 256
44 static void show_error(
char **error_str,
const char *
fmt, ...)
46 unsigned long long index;
58 len = input ?
strlen(input) : 0;
65 for (i = 1; i < len && i <
index; i++)
68 error[len + i + 1] =
'\n';
79 static void free_token(
char *
token)
100 sprintf(*tok,
"%c%c", *token,
'~');
111 static int filter_cmp(
const void *
a,
const void *
b)
129 struct filter_type
key;
147 filter_type = find_filter_type(filter,
id);
155 die(
"Could not allocate filter");
157 for (i = 0; i < filter->
filters; i++) {
162 if (i < filter->filters)
187 memset(filter, 0,
sizeof(*filter));
199 memset(arg, 0,
sizeof(*arg));
215 free_arg(arg->
num.left);
216 free_arg(arg->
num.right);
220 free_arg(arg->
exp.left);
221 free_arg(arg->
exp.right);
226 regfree(&arg->
str.reg);
237 free_arg(arg->
op.left);
238 free_arg(arg->
op.right);
258 regex_t *
sreg, regex_t *ereg)
261 return !regexec(sreg, event->
system, 0,
NULL, 0) &&
262 !regexec(ereg, event->
name, 0,
NULL, 0);
265 return !regexec(ereg, event->
system, 0,
NULL, 0) ||
266 !regexec(ereg, event->
name, 0,
NULL, 0);
271 char *sys_name,
char *event_name)
283 event_name = sys_name;
288 sprintf(reg,
"^%s$", event_name);
290 ret = regcomp(&ereg, reg, REG_ICASE|REG_NOSUB);
298 sprintf(reg,
"^%s$", sys_name);
299 ret = regcomp(&sreg, reg, REG_ICASE|REG_NOSUB);
307 for (i = 0; i < pevent->
nr_events; i++) {
309 if (event_match(event, sys_name ? &sreg :
NULL, &ereg)) {
311 add_event(events, event);
325 static void free_events(
struct event_list *events)
331 events = events->
next;
337 create_arg_item(
struct event_format *event,
const char *token,
343 arg = allocate_arg();
352 arg->
value.str = strdup(token);
354 die(
"malloc string");
381 show_error(error_str,
"expected a value but found %s",
393 arg = allocate_arg();
395 arg->
op.type = btype;
405 arg = allocate_arg();
407 arg->
op.type = etype;
417 arg = allocate_arg();
420 arg->
op.type = etype;
457 show_error(error_str,
466 switch (arg->
value.type) {
483 op_type = op->
num.type;
485 str = arg->
value.str;
488 memset(op, 0,
sizeof(*op));
504 show_error(error_str,
505 "Illegal lvalue for string comparison");
520 ret = regcomp(&op->
str.reg, str, REG_ICASE|REG_NOSUB);
522 show_error(error_str,
523 "RegEx '%s' did not compute",
529 show_error(error_str,
530 "Illegal comparison for string");
537 op->
str.val = strdup(str);
539 die(
"malloc string");
545 op->
str.buffer[op->
str.field->size] = 0;
556 switch (op->
num.type) {
559 show_error(error_str,
560 "Op not allowed with integers");
581 show_error(error_str,
601 arg = rotate_op_right(arg, op);
610 arg = rotate_op_right(arg, op);
632 static enum op_type process_op(
const char *token,
641 if (
strcmp(token,
"&&") == 0)
643 else if (
strcmp(token,
"||") == 0)
645 else if (
strcmp(token,
"!") == 0)
652 if (
strcmp(token,
"+") == 0) {
654 }
else if (
strcmp(token,
"-") == 0) {
656 }
else if (
strcmp(token,
"*") == 0) {
658 }
else if (
strcmp(token,
"/") == 0) {
660 }
else if (
strcmp(token,
"%") == 0) {
662 }
else if (
strcmp(token,
">>") == 0) {
664 }
else if (
strcmp(token,
"<<") == 0) {
666 }
else if (
strcmp(token,
"&") == 0) {
668 }
else if (
strcmp(token,
"|") == 0) {
670 }
else if (
strcmp(token,
"^") == 0) {
672 }
else if (
strcmp(token,
"~") == 0)
679 if (
strcmp(token,
"==") == 0)
681 else if (
strcmp(token,
"!=") == 0)
683 else if (
strcmp(token,
"<") == 0)
685 else if (
strcmp(token,
">") == 0)
687 else if (
strcmp(token,
"<=") == 0)
689 else if (
strcmp(token,
">=") == 0)
691 else if (
strcmp(token,
"=~") == 0)
693 else if (
strcmp(token,
"!~") == 0)
701 static int check_op_done(
struct filter_arg *arg)
708 return arg->
op.right !=
NULL;
740 die(
"can not reparent other than OP");
743 if (old_child->
op.right == arg) {
744 ptr = &old_child->
op.right;
745 other_child = old_child->
op.left;
746 }
else if (old_child->
op.left == arg) {
747 ptr = &old_child->
op.left;
748 other_child = old_child->
op.right;
750 die(
"Error in reparent op, find other child");
756 if (parent == old_child) {
757 free_arg(other_child);
764 if (parent->
op.right == old_child)
765 ptr = &parent->
op.right;
766 else if (parent->
op.left == old_child)
767 ptr = &parent->
op.left;
769 die(
"Error in reparent op");
862 die(
"bad arg in filter tree");
880 arg = allocate_arg();
890 char **error_str,
int not)
908 type = read_token(&token);
913 arg = create_arg_item(event, token, type, error_str);
918 else if (current_exp) {
919 ret = add_right(current_exp, arg, error_str);
939 show_error(error_str,
940 "Illegal token ','");
946 show_error(error_str,
947 "Open paren can not come after item");
951 show_error(error_str,
952 "Open paren can not come after expression");
959 show_error(error_str,
960 "Unbalanced number of '('");
974 ret = add_right(current_op, arg, error_str);
982 if (!current_op && !current_exp)
986 if (current_exp && !check_op_done(current_exp))
988 if (current_op && !check_op_done(current_op))
1000 op_type = process_op(token, &btype, &ctype, &etype);
1006 if (!current_exp && !current_op)
1020 show_error(error_str,
1021 "Unknown op token %s", token);
1028 arg = create_arg_op(btype);
1030 ret = add_left(arg, current_op);
1032 ret = add_left(arg, current_exp);
1038 arg = create_arg_op(btype);
1040 ret = add_right(current_op, arg, error_str);
1047 ret = add_right(current_exp, arg, error_str);
1055 arg = create_arg_exp(etype);
1057 arg = create_arg_cmp(ctype);
1060 ret = add_right(current_op, arg, error_str);
1063 ret = add_left(arg, left_item);
1084 if (!current_op && !current_exp)
1088 current_op = current_exp;
1090 current_op = collapse_tree(current_op);
1097 show_error(error_str,
"Syntax error");
1099 free_arg(current_op);
1100 free_arg(current_exp);
1107 process_event(
struct event_format *event,
const char *filter_str,
1116 show_error(error_str,
1117 "Unbalanced number of ')'");
1125 *parg = allocate_arg();
1135 const char *filter_str,
char **error_str)
1137 struct filter_type *filter_type;
1142 ret = process_event(event, filter_str, &arg, error_str);
1148 arg = allocate_arg();
1153 filter_type = add_filter_type(filter, event->
id);
1155 free_arg(filter_type->
filter);
1175 const char *filter_str,
1178 struct pevent *pevent = filter->
pevent;
1181 const char *filter_start;
1182 const char *next_event;
1184 char *event_name =
NULL;
1185 char *sys_name =
NULL;
1197 filter_start =
strchr(filter_str,
':');
1199 len = filter_start - filter_str;
1201 len =
strlen(filter_str);
1205 next_event =
strchr(filter_str,
',');
1207 (!filter_start || next_event < filter_start))
1208 len = next_event - filter_str;
1209 else if (filter_start)
1210 len = filter_start - filter_str;
1212 len =
strlen(filter_str);
1215 memcpy(this_event, filter_str, len);
1216 this_event[len] = 0;
1221 filter_str = next_event;
1223 sys_name = strtok_r(this_event,
"/", &sp);
1224 event_name = strtok_r(
NULL,
"/", &sp);
1227 show_error(error_str,
"No filter found");
1229 free_events(events);
1235 ret = find_event(pevent, &events,
strim(sys_name),
strim(event_name));
1238 show_error(error_str,
1239 "No event found under '%s.%s'",
1240 sys_name, event_name);
1242 show_error(error_str,
1243 "No event found under '%s'",
1245 free_events(events);
1250 }
while (filter_str);
1257 for (event = events;
event;
event =
event->next) {
1258 ret = filter_event(filter, event->
event, filter_start,
1272 free_events(events);
1280 static void free_filter_type(
struct filter_type *filter_type)
1282 free_arg(filter_type->
filter);
1299 struct filter_type *filter_type;
1305 filter_type = find_filter_type(filter, event_id);
1310 free_filter_type(filter_type);
1314 (
unsigned long)(filter_type + 1);
1316 memmove(filter_type, filter_type + 1, len);
1320 sizeof(*filter_type));
1335 for (i = 0; i < filter->
filters; i++)
1354 static int copy_filter_type(
struct event_filter *filter,
1356 struct filter_type *filter_type)
1365 sys = filter_type->
event->system;
1366 name = filter_type->
event->name;
1371 str = arg_to_str(source, filter_type->
filter);
1375 if (
strcmp(str,
"TRUE") == 0 ||
strcmp(str,
"FALSE") == 0) {
1377 arg = allocate_arg();
1379 if (
strcmp(str,
"TRUE") == 0)
1384 filter_type = add_filter_type(filter, event->
id);
1391 filter_event(filter, event, str,
NULL);
1411 for (i = 0; i < source->
filters; i++) {
1412 if (copy_filter_type(dest, source, &source->
event_filters[i]))
1433 struct pevent *src_pevent;
1434 struct pevent *dest_pevent;
1436 struct filter_type *filter_type;
1441 src_pevent = source->
pevent;
1442 dest_pevent = dest->
pevent;
1448 for (i = 0; i < dest->
filters; i++) {
1450 arg = filter_type->
filter;
1457 event = filter_type->
event;
1459 if (src_pevent != dest_pevent) {
1473 if (
strcmp(str,
"TRUE") != 0 &&
strcmp(str,
"FALSE") != 0)
1474 filter_event(dest, event, str,
NULL);
1490 struct filter_type *filter_type;
1502 for (i = 0; i < filter->
filters; i++) {
1508 if (filter_type->
filter->boolean.value)
1511 if (!filter_type->
filter->boolean.value)
1517 ids = realloc(ids,
sizeof(*ids) * (count + 1));
1519 die(
"Can't allocate ids");
1520 ids[count++] = filter_type->
event_id;
1526 for (i = 0; i <
count; i++)
1545 struct filter_type *filter_type;
1550 filter_type = find_filter_type(filter, event_id);
1560 return !filter_type->
filter->boolean.value;
1563 return filter_type->
filter->boolean.value;
1583 static unsigned long long
1587 unsigned long long val;
1590 if (field == &comm) {
1593 name = get_comm(event, record);
1594 return (
unsigned long)
name;
1602 switch (field->
size) {
1610 return (
long long)
val;
1615 static unsigned long long
1618 static unsigned long long
1621 unsigned long long lval, rval;
1623 lval = get_arg_value(event, arg->
exp.left, record);
1624 rval = get_arg_value(event, arg->
exp.right, record);
1626 switch (arg->
exp.type) {
1643 return lval >> rval;
1646 return lval << rval;
1659 die(
"error in exp");
1664 static unsigned long long
1667 switch (arg->
type) {
1669 return get_value(event, arg->
field.field, record);
1673 die(
"must have number field!");
1674 return arg->
value.val;
1677 return get_exp_value(event, arg, record);
1680 die(
"oops in filter");
1688 unsigned long long lval, rval;
1690 lval = get_arg_value(event, arg->
num.left, record);
1691 rval = get_arg_value(event, arg->
num.right, record);
1693 switch (arg->
num.type) {
1695 return lval == rval;
1698 return lval != rval;
1707 return lval >= rval;
1710 return lval <= rval;
1721 struct pevent *pevent;
1722 unsigned long long addr;
1723 const char *val =
NULL;
1728 val = record->
data + arg->
str.field->offset;
1734 if (*(val + arg->
str.field->size - 1)) {
1738 val = arg->
str.buffer;
1742 event = arg->
str.field->event;
1743 pevent =
event->pevent;
1744 addr = get_value(event, arg->
str.field, record);
1765 if (arg->
str.field == &comm)
1766 val = get_comm(event, record);
1768 val = get_field_str(arg, record);
1770 switch (arg->
str.type) {
1779 return !regexec(&arg->
str.reg, val, 0,
NULL, 0);
1782 return regexec(&arg->
str.reg, val, 0,
NULL, 0);
1793 switch (arg->
op.type) {
1795 return test_filter(event, arg->
op.left, record) &&
1796 test_filter(event, arg->
op.right, record);
1799 return test_filter(event, arg->
op.left, record) ||
1800 test_filter(event, arg->
op.right, record);
1803 return !test_filter(event, arg->
op.right, record);
1814 switch (arg->
type) {
1820 return test_op(event, arg, record);
1823 return test_num(event, arg, record);
1826 return test_str(event, arg, record);
1835 return !!get_arg_value(event, arg, record);
1855 struct filter_type *filter_type;
1860 filter_type = find_filter_type(filter, event_id);
1862 return filter_type ? 1 : 0;
1879 struct pevent *pevent = filter->
pevent;
1880 struct filter_type *filter_type;
1888 filter_type = find_filter_type(filter, event_id);
1893 return test_filter(filter_type->
event, filter_type->
filter, record) ?
1908 switch (arg->
op.type) {
1916 left = arg_to_str(filter, arg->
op.left);
1917 right = arg_to_str(filter, arg->
op.right);
1918 if (!left || !right)
1922 if (
strcmp(left,
"TRUE") == 0)
1924 else if (
strcmp(left,
"FALSE") == 0)
1927 if (
strcmp(right,
"TRUE") == 0)
1929 else if (
strcmp(right,
"FALSE") == 0)
1932 if (left_val >= 0) {
1940 if (right_val >= 0) {
1943 switch (arg->
op.type) {
1945 val = left_val && right_val;
1948 val = left_val || right_val;
1961 if (right_val >= 0) {
1983 right = arg_to_str(filter, arg->
op.right);
1988 if (
strcmp(right,
"TRUE") == 0)
1990 else if (
strcmp(right,
"FALSE") == 0)
1992 if (right_val >= 0) {
2003 snprintf(str, len,
"%s(%s)", op, right);
2028 return strdup(arg->
field.field->name);
2039 lstr = arg_to_str(filter, arg->
exp.left);
2040 rstr = arg_to_str(filter, arg->
exp.right);
2044 switch (arg->
exp.type) {
2081 snprintf(str, len,
"%s %s %s", lstr, op, rstr);
2097 lstr = arg_to_str(filter, arg->
num.left);
2098 rstr = arg_to_str(filter, arg->
num.right);
2102 switch (arg->
num.type) {
2128 sprintf(str,
"%s %s %s", lstr, op, rstr);
2149 switch (arg->
str.type) {
2169 arg->
str.field->name,
2184 switch (arg->
type) {
2194 return op_to_str(filter, arg);
2200 return str_to_str(filter, arg);
2203 return val_to_str(filter, arg);
2206 return field_to_str(filter, arg);
2209 return exp_to_str(filter, arg);
2230 struct filter_type *filter_type;
2235 filter_type = find_filter_type(filter, event_id);
2240 return arg_to_str(filter, filter_type->
filter);
2254 struct filter_type *filter_type1;
2255 struct filter_type *filter_type2;
2270 for (i = 0; i < filter1->
filters; i++) {
2272 filter_type2 = find_filter_type(filter2, filter_type1->
event_id);
2275 if (filter_type1->
filter->type != filter_type2->
filter->type)
2277 switch (filter_type1->
filter->type) {
2286 str1 = arg_to_str(filter1, filter_type1->
filter);
2287 str2 = arg_to_str(filter2, filter_type2->
filter);
2289 result =
strcmp(str1, str2) != 0;
2300 if (i < filter1->filters)