journey/main.cpp

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;
}