133 lines
2.3 KiB
C++
133 lines
2.3 KiB
C++
#include <cstdio>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <fstream>
|
|
#include <iostream>
|
|
|
|
#include <systemd/sd-journal.h>
|
|
#include "re2/re2.h"
|
|
|
|
using namespace re2;
|
|
using namespace std;
|
|
|
|
// ideas: sort by usage
|
|
// configurable regex engine: http://sljit.sourceforge.net/regex_perf.html
|
|
|
|
void save_cursor(sd_journal* j, const char* filename) {
|
|
char* cursor;
|
|
//sd_journal_seek_tail(j);
|
|
int r = sd_journal_get_cursor(j, &cursor);
|
|
|
|
if (r >= 0) {
|
|
cout << cursor << endl;
|
|
FILE* f = fopen(filename, "wb");
|
|
|
|
if (f) {
|
|
fwrite(cursor, sizeof(char), strlen(cursor), f);
|
|
free(cursor);
|
|
}
|
|
|
|
fclose(f);
|
|
} else {
|
|
cerr << "Failed to get cursor: " << strerror(-r) << endl;
|
|
}
|
|
|
|
}
|
|
|
|
void seek_cursor(sd_journal* j, const char* filename) {
|
|
FILE* f = fopen(filename, "rb");
|
|
|
|
if (f) {
|
|
fseek(f, 0, SEEK_END);
|
|
long int s = ftell(f);
|
|
|
|
if (s > 0) {
|
|
fseek(f, 0, SEEK_SET);
|
|
char* c = (char*)malloc(s);
|
|
|
|
size_t r = fread(c, s, 1, f);
|
|
if (r == 1) {
|
|
cout << c << endl;
|
|
sd_journal_seek_cursor(j, c);
|
|
} else {
|
|
cerr << "only " << r << endl;
|
|
}
|
|
|
|
free(c);
|
|
} else {
|
|
cerr << "empty file" << endl;
|
|
}
|
|
|
|
fclose(f);
|
|
} else {
|
|
fprintf(stderr, "Failed to open load cursor\n");
|
|
}
|
|
}
|
|
|
|
int main(int argc, char* argv[]) {
|
|
|
|
// read rules
|
|
ifstream in("test.rules");
|
|
string line;
|
|
RE2 re1("^\\w\\{3\\} \\[ :0-9\\]\\{11\\} \\[._\\[:alnum:\\]-\\]\\+ (.*)\\[\\[0-9\\]+\\]: (.*)$");
|
|
|
|
while (getline(in, line).good()) {
|
|
//cout << line << endl;
|
|
}
|
|
|
|
|
|
|
|
int r;
|
|
sd_journal* j;
|
|
|
|
r = sd_journal_open(&j, SD_JOURNAL_LOCAL_ONLY);
|
|
|
|
if (r < 0) {
|
|
fprintf(stderr, "Failed to open journal: %s\n", strerror(-r));
|
|
return 1;
|
|
}
|
|
|
|
seek_cursor(j, "last");
|
|
// skip current
|
|
sd_journal_next(j);
|
|
|
|
RE2 re(".*pixmap$");
|
|
|
|
if (!re.ok()) {
|
|
printf("pattern error!\n");
|
|
return 1;
|
|
}
|
|
|
|
|
|
while (sd_journal_next(j) > 0) {
|
|
const char* d;
|
|
size_t l;
|
|
|
|
r = sd_journal_get_data(j, "MESSAGE", (const void**)&d, &l);
|
|
|
|
if (r < 0) {
|
|
fprintf(stderr, "Failed to read message field: %s\n", strerror(-r));
|
|
continue;
|
|
|
|
}
|
|
|
|
re2::StringPiece input(d, l);
|
|
|
|
//if (RE2::FullMatch(input, re)) {
|
|
// printf("match: %d %d @%d\n", result.data() - subject, result.size(), input.data() - subject);
|
|
printf("%.*s\n", (int) l, d);
|
|
//}
|
|
|
|
//
|
|
}
|
|
|
|
//sd_journal_previous(j);
|
|
save_cursor(j, "last");
|
|
|
|
sd_journal_close(j);
|
|
|
|
return 0;
|
|
}
|
|
|