#include "list.h"
#include "lookup3.h"
#include "compress.h"
+#include "journal-internal.h"
#define JOURNAL_FILES_MAX 1024
-typedef struct Match Match;
-
-struct Match {
- char *data;
- size_t size;
- uint64_t le_hash;
-
- LIST_FIELDS(Match, matches);
-};
-
-typedef enum location_type {
- LOCATION_HEAD,
- LOCATION_TAIL,
- LOCATION_DISCRETE
-} location_type_t;
-
-typedef struct Location {
- location_type_t type;
-
- uint64_t seqnum;
- sd_id128_t seqnum_id;
- bool seqnum_set;
-
- uint64_t realtime;
- bool realtime_set;
-
- uint64_t monotonic;
- sd_id128_t boot_id;
- bool monotonic_set;
-
- uint64_t xor_hash;
- bool xor_hash_set;
-} Location;
-
-struct sd_journal {
- Hashmap *files;
-
- Location current_location;
- JournalFile *current_file;
- uint64_t current_field;
-
- int inotify_fd;
- Hashmap *inotify_wd_dirs;
- Hashmap *inotify_wd_roots;
-
- LIST_HEAD(Match, matches);
- unsigned n_matches;
-};
-
static void detach_location(sd_journal *j) {
Iterator i;
JournalFile *f;
assert(prefix);
assert(filename);
+ if ((j->flags & SD_JOURNAL_SYSTEM_ONLY) &&
+ !startswith(filename, "system.journal"))
+ return 0;
+
if (dir)
fn = join(prefix, "/", dir, "/", filename, NULL);
else
int r;
DIR *d;
int wd;
+ sd_id128_t id, mid;
assert(j);
assert(prefix);
assert(dir);
+ if ((j->flags & SD_JOURNAL_LOCAL_ONLY) &&
+ (sd_id128_from_string(dir, &id) < 0 ||
+ sd_id128_get_machine(&mid) < 0 ||
+ !sd_id128_equal(id, mid)))
+ return 0;
+
fn = join(prefix, "/", dir, NULL);
if (!fn)
return -ENOMEM;
}
}
-int sd_journal_open(sd_journal **ret) {
+int sd_journal_open(sd_journal **ret, int flags) {
sd_journal *j;
const char *p;
const char search_paths[] =
if (!j)
return -ENOMEM;
+ j->flags = flags;
+
j->inotify_fd = inotify_init1(IN_NONBLOCK|IN_CLOEXEC);
if (j->inotify_fd < 0) {
r = -errno;
NULSTR_FOREACH(p, search_paths) {
DIR *d;
+ if ((flags & SD_JOURNAL_RUNTIME_ONLY) &&
+ !path_startswith(p, "/run"))
+ continue;
+
d = opendir(p);
if (!d) {
if (errno != ENOENT)