summaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2011-05-23 17:07:06 +0200
committerDenys Vlasenko <dvlasenk@redhat.com>2011-05-23 17:07:06 +0200
commit28e6bba1e2a35f6bca8f27b5397e1c7fa2171fd4 (patch)
treec379fded6e7499800ff37dd5cd637792bef7750c /src/lib
parent2d94511dd4eae5b19f73080a3bdc5a36605262bd (diff)
downloadabrt-28e6bba1e2a35f6bca8f27b5397e1c7fa2171fd4.tar.gz
abrt-28e6bba1e2a35f6bca8f27b5397e1c7fa2171fd4.tar.xz
abrt-28e6bba1e2a35f6bca8f27b5397e1c7fa2171fd4.zip
run_event: support VAR~=REGEX match
This makes in possible to configure analyze_xsession_errors to appear only for X-related stuff Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/run_event.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/src/lib/run_event.c b/src/lib/run_event.c
index 8325ea28..856f3264 100644
--- a/src/lib/run_event.c
+++ b/src/lib/run_event.c
@@ -17,6 +17,7 @@
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <glob.h>
+#include <regex.h>
#include "abrtlib.h"
struct run_event_state *new_run_event_state()
@@ -209,6 +210,38 @@ static GList *load_rule_list(GList *rule_list,
return rule_list;
}
+static int regcmp_lines(char *val, const char *regex)
+{
+ regex_t rx;
+ int r = regcomp(&rx, regex, REG_NOSUB); //TODO: and REG_EXTENDED?
+ //log("REGEX:'%s':%d", regex, r);
+ if (r)
+ {
+ //char errbuf[256];
+ //size_t needsz = regerror(r, &rx, errbuf, sizeof(errbuf));
+ error_msg("Bad regexp '%s'", regex); // TODO: use errbuf?
+ return r;
+ }
+
+ /* Check every line */
+ while (1)
+ {
+ char *eol = strchr(val, '\n');
+ if (eol)
+ *eol = '\0';
+ r = regexec(&rx, val, 0, NULL, /*eflags:*/ 0);
+ //log("REGCMP:'%s':%d", val, r);
+ if (eol)
+ *eol = '\n';
+ if (r == 0 || !eol)
+ break;
+ val = eol + 1;
+ }
+ /* Here, r == 0 if match was found */
+ regfree(&rx);
+ return r;
+}
+
/* Deletes rules in *pp_rule_list, starting from first (remaining) rule,
* until it finds a rule with all conditions satisfied.
* In this case, it deletes this rule and returns this rule's cmd.
@@ -269,10 +302,12 @@ static char* pop_next_command(GList **pp_rule_list,
goto ret; /* error (note: dd_opendir logged error msg) */
}
}
- char *var_name = xstrndup(cond_str, eq_sign - cond_str);
+ /* Is it "VAR~=REGEX"? */
+ int regex = (eq_sign > cond_str && eq_sign[-1] == '~');
+ char *var_name = xstrndup(cond_str, eq_sign - cond_str - regex);
char *real_val = dd_load_text_ext(dd, var_name, DD_FAIL_QUIETLY_ENOENT);
free(var_name);
- int vals_differ = strcmp(real_val, eq_sign + 1);
+ int vals_differ = regex ? regcmp_lines(real_val, eq_sign + 1) : strcmp(real_val, eq_sign + 1);
free(real_val);
/* Do values match? */