#include "list.h"
#include "lookup3.h"
#include "nulstr-util.h"
+#include "origin-id.h"
#include "path-util.h"
#include "prioq.h"
#include "process-util.h"
#define DEFAULT_DATA_THRESHOLD (64*1024)
+DEFINE_PRIVATE_ORIGIN_ID_HELPERS(sd_journal, journal);
+
static void remove_file_real(sd_journal *j, JournalFile *f);
static int journal_file_read_tail_timestamp(sd_journal *j, JournalFile *f);
static void journal_file_unlink_newest_by_bood_id(sd_journal *j, JournalFile *f);
-static bool journal_pid_changed(sd_journal *j) {
- assert(j);
-
- /* We don't support people creating a journal object and
- * keeping it around over a fork(). Let's complain. */
-
- return j->original_pid != getpid_cached();
-}
-
static int journal_put_error(sd_journal *j, int r, const char *path) {
_cleanup_free_ char *copy = NULL;
int k;
uint64_t hash;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(data, -EINVAL);
if (size == 0)
_public_ int sd_journal_add_conjunction(sd_journal *j) {
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
if (!j->level0)
return 0;
_public_ int sd_journal_add_disjunction(sd_journal *j) {
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
if (!j->level0)
return 0;
}
_public_ void sd_journal_flush_matches(sd_journal *j) {
- if (!j)
+ if (!j || journal_origin_changed(j))
return;
if (j->level0)
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
r = iterated_cache_get(j->files_cache, NULL, &files, &n_files);
if (r < 0)
int c = 0, r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(skip <= INT_MAX, -ERANGE);
if (skip == 0) {
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(cursor, -EINVAL);
if (!j->current_file || j->current_file->current_offset <= 0)
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(!isempty(cursor), -EINVAL);
for (const char *p = cursor;;) {
Object *o;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(!isempty(cursor), -EINVAL);
if (!j->current_file || j->current_file->current_offset <= 0)
_public_ int sd_journal_seek_monotonic_usec(sd_journal *j, sd_id128_t boot_id, uint64_t usec) {
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
detach_location(j);
_public_ int sd_journal_seek_realtime_usec(sd_journal *j, uint64_t usec) {
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
detach_location(j);
_public_ int sd_journal_seek_head(sd_journal *j) {
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
detach_location(j);
_public_ int sd_journal_seek_tail(sd_journal *j) {
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
detach_location(j);
return NULL;
*j = (sd_journal) {
- .original_pid = getpid_cached(),
+ .origin_id = origin_id_query(),
.toplevel_fd = -EBADF,
.inotify_fd = -EBADF,
.flags = flags,
Directory *d;
Prioq *p;
- if (!j)
+ if (!j || journal_origin_changed(j))
return;
while ((p = hashmap_first(j->newest_by_boot_id)))
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
f = j->current_file;
if (!f)
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
f = j->current_file;
if (!f)
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
f = j->current_file;
if (!f)
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(field, -EINVAL);
assert_return(data, -EINVAL);
assert_return(size, -EINVAL);
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(data, -EINVAL);
assert_return(size, -EINVAL);
}
_public_ void sd_journal_restart_data(sd_journal *j) {
- if (!j)
+ if (!j || journal_origin_changed(j))
return;
j->current_field = 0;
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
if (j->no_inotify)
return -EMEDIUMTYPE;
int fd;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
fd = sd_journal_get_fd(j);
if (fd < 0)
int fd;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(timeout_usec, -EINVAL);
fd = sd_journal_get_fd(j);
bool got_something = false;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
if (j->inotify_fd < 0) /* We have no inotify fd yet? Then there's noting to process. */
return 0;
uint64_t t;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
if (j->inotify_fd < 0) {
JournalFile *f;
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(from || to, -EINVAL);
assert_return(from != to, -EINVAL);
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(ret_from != ret_to, -EINVAL);
ORDERED_HASHMAP_FOREACH(f, j->files) {
uint64_t sum = 0;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(ret, -EINVAL);
ORDERED_HASHMAP_FOREACH(f, j->files) {
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(!isempty(field), -EINVAL);
assert_return(field_is_valid(field), -EINVAL);
size_t k;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(j->unique_field, -EINVAL);
k = strlen(j->unique_field);
}
_public_ void sd_journal_restart_unique(sd_journal *j) {
- if (!j)
+ if (!j || journal_origin_changed(j))
return;
j->unique_file = NULL;
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(field, -EINVAL);
if (!j->fields_file) {
}
_public_ void sd_journal_restart_fields(sd_journal *j) {
- if (!j)
+ if (!j || journal_origin_changed(j))
return;
j->fields_file = NULL;
_public_ int sd_journal_reliable_fd(sd_journal *j) {
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
return !j->on_network;
}
int r;
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(ret, -EINVAL);
r = sd_journal_get_data(j, "MESSAGE_ID", &data, &size);
_public_ int sd_journal_set_data_threshold(sd_journal *j, size_t sz) {
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
j->data_threshold = sz;
return 0;
_public_ int sd_journal_get_data_threshold(sd_journal *j, size_t *sz) {
assert_return(j, -EINVAL);
- assert_return(!journal_pid_changed(j), -ECHILD);
+ assert_return(!journal_origin_changed(j), -ECHILD);
assert_return(sz, -EINVAL);
*sz = j->data_threshold;