X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=src%2Fjournal%2Fsd-journal.c;h=3ccb14a242832fa2b4d0e0c903313d40004bed16;hb=68313d3dfa2082dae8a06643d639e0200afc19fc;hp=4c4cc2d21ca694871499a0e1272f9e4cc3f4964e;hpb=87011c25d96e9fbcd8a465ba758fa037c7d08203;p=elogind.git diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 4c4cc2d21..3ccb14a24 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -50,6 +50,15 @@ #define DEFAULT_DATA_THRESHOLD (64*1024) +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(); +} + /* We return an error here only if we didn't manage to memorize the real error. */ static int set_put_error(sd_journal *j, int r) { @@ -163,7 +172,7 @@ static bool same_field(const void *_a, size_t s, const void *_b, size_t t) { return true; } - return true; + assert_not_reached("\"=\" not found"); } static Match *match_new(Match *p, MatchType t) { @@ -177,7 +186,7 @@ static Match *match_new(Match *p, MatchType t) { if (p) { m->parent = p; - LIST_PREPEND(Match, matches, p->matches, m); + LIST_PREPEND(matches, p->matches, m); } return m; @@ -190,7 +199,7 @@ static void match_free(Match *m) { match_free(m->matches); if (m->parent) - LIST_REMOVE(Match, matches, m->parent->matches, m); + LIST_REMOVE(matches, m->parent->matches, m); free(m->data); free(m); @@ -209,6 +218,8 @@ _public_ int sd_journal_add_match(sd_journal *j, const void *data, size_t size) if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!data) return -EINVAL; @@ -303,7 +314,10 @@ fail: } _public_ int sd_journal_add_conjunction(sd_journal *j) { - assert(j); + if (!j) + return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!j->level0) return 0; @@ -321,7 +335,10 @@ _public_ int sd_journal_add_conjunction(sd_journal *j) { } _public_ int sd_journal_add_disjunction(sd_journal *j) { - assert(j); + if (!j) + return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!j->level0) return 0; @@ -345,7 +362,7 @@ static char *match_make_string(Match *m) { bool enclose = false; if (!m) - return strdup(""); + return strdup("none"); if (m->type == MATCH_DISCRETE) return strndup(m->data, m->size); @@ -371,10 +388,8 @@ static char *match_make_string(Match *m) { p = k; enclose = true; - } else { - free(p); + } else p = t; - } } if (enclose) { @@ -393,7 +408,6 @@ char *journal_make_match_string(sd_journal *j) { } _public_ void sd_journal_flush_matches(sd_journal *j) { - if (!j) return; @@ -587,11 +601,14 @@ static int next_for_match( if (r < 0) return r; else if (r > 0) { - if (np == 0 || (direction == DIRECTION_DOWN ? np > cp : np < cp)) + if (np == 0 || (direction == DIRECTION_DOWN ? cp < np : cp > np)) np = cp; } } + if (np == 0) + return 0; + } else if (m->type == MATCH_AND_TERM) { Match *i, *last_moved; @@ -624,8 +641,7 @@ static int next_for_match( } } - if (np == 0) - return 0; + assert(np > 0); r = journal_file_move_to_object(f, OBJECT_ENTRY, np, &n); if (r < 0) @@ -730,7 +746,7 @@ static int find_location_for_match( if (r <= 0) return r; - if (np == 0 || (direction == DIRECTION_DOWN ? np < cp : np > cp)) + if (np == 0 || (direction == DIRECTION_DOWN ? cp > np : cp < np)) np = cp; } @@ -826,7 +842,7 @@ static int next_beyond_location(sd_journal *j, JournalFile *f, direction_t direc return r; } - /* OK, we found the spot, now let's advance until to an entry + /* OK, we found the spot, now let's advance until an entry * that is actually different from what we were previously * looking at. This is necessary to handle entries which exist * in two (or more) journal files, and which shall all be @@ -870,6 +886,8 @@ static int real_journal_next(sd_journal *j, direction_t direction) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; HASHMAP_FOREACH(f, j->files, i) { bool found; @@ -888,10 +906,7 @@ static int real_journal_next(sd_journal *j, direction_t direction) { k = compare_entry_order(f, o, new_file, new_offset); - if (direction == DIRECTION_DOWN) - found = k < 0; - else - found = k > 0; + found = direction == DIRECTION_DOWN ? k < 0 : k > 0; } if (found) { @@ -925,6 +940,8 @@ static int real_journal_next_skip(sd_journal *j, direction_t direction, uint64_t if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (skip == 0) { /* If this is not a discrete skip, then at least @@ -965,6 +982,8 @@ _public_ int sd_journal_get_cursor(sd_journal *j, char **cursor) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!cursor) return -EINVAL; @@ -1004,6 +1023,8 @@ _public_ int sd_journal_seek_cursor(sd_journal *j, const char *cursor) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (isempty(cursor)) return -EINVAL; @@ -1103,6 +1124,8 @@ _public_ int sd_journal_test_cursor(sd_journal *j, const char *cursor) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (isempty(cursor)) return -EINVAL; @@ -1181,6 +1204,8 @@ _public_ int sd_journal_test_cursor(sd_journal *j, const char *cursor) { _public_ int sd_journal_seek_monotonic_usec(sd_journal *j, sd_id128_t boot_id, uint64_t usec) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; reset_location(j); j->current_location.type = LOCATION_SEEK; @@ -1194,6 +1219,8 @@ _public_ int sd_journal_seek_monotonic_usec(sd_journal *j, sd_id128_t boot_id, u _public_ int sd_journal_seek_realtime_usec(sd_journal *j, uint64_t usec) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; reset_location(j); j->current_location.type = LOCATION_SEEK; @@ -1206,6 +1233,8 @@ _public_ int sd_journal_seek_realtime_usec(sd_journal *j, uint64_t usec) { _public_ int sd_journal_seek_head(sd_journal *j) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; reset_location(j); j->current_location.type = LOCATION_HEAD; @@ -1216,6 +1245,8 @@ _public_ int sd_journal_seek_head(sd_journal *j) { _public_ int sd_journal_seek_tail(sd_journal *j) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; reset_location(j); j->current_location.type = LOCATION_TAIL; @@ -1235,11 +1266,11 @@ static void check_network(sd_journal *j, int fd) { return; j->on_network = - F_TYPE_CMP(sfs.f_type, CIFS_MAGIC_NUMBER) || - F_TYPE_CMP(sfs.f_type, CODA_SUPER_MAGIC) || - F_TYPE_CMP(sfs.f_type, NCP_SUPER_MAGIC) || - F_TYPE_CMP(sfs.f_type, NFS_SUPER_MAGIC) || - F_TYPE_CMP(sfs.f_type, SMB_SUPER_MAGIC); + F_TYPE_EQUAL(sfs.f_type, CIFS_MAGIC_NUMBER) || + F_TYPE_EQUAL(sfs.f_type, CODA_SUPER_MAGIC) || + F_TYPE_EQUAL(sfs.f_type, NCP_SUPER_MAGIC) || + F_TYPE_EQUAL(sfs.f_type, NFS_SUPER_MAGIC) || + F_TYPE_EQUAL(sfs.f_type, SMB_SUPER_MAGIC); } static bool file_has_type_prefix(const char *prefix, const char *filename) { @@ -1654,6 +1685,7 @@ static sd_journal *journal_new(int flags, const char *path) { if (!j) return NULL; + j->original_pid = getpid(); j->inotify_fd = -1; j->flags = flags; j->data_threshold = DEFAULT_DATA_THRESHOLD; @@ -1815,6 +1847,8 @@ _public_ int sd_journal_get_realtime_usec(sd_journal *j, uint64_t *ret) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!ret) return -EINVAL; @@ -1841,6 +1875,8 @@ _public_ int sd_journal_get_monotonic_usec(sd_journal *j, uint64_t *ret, sd_id12 if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; f = j->current_file; if (!f) @@ -1907,6 +1943,8 @@ _public_ int sd_journal_get_data(sd_journal *j, const char *field, const void ** if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!field) return -EINVAL; if (!data) @@ -2033,6 +2071,8 @@ _public_ int sd_journal_enumerate_data(sd_journal *j, const void **data, size_t if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!data) return -EINVAL; if (!size) @@ -2083,6 +2123,8 @@ _public_ int sd_journal_get_fd(sd_journal *j) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (j->inotify_fd >= 0) return j->inotify_fd; @@ -2110,6 +2152,8 @@ _public_ int sd_journal_get_events(sd_journal *j) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; fd = sd_journal_get_fd(j); if (fd < 0) @@ -2123,6 +2167,8 @@ _public_ int sd_journal_get_timeout(sd_journal *j, uint64_t *timeout_usec) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!timeout_usec) return -EINVAL; @@ -2223,6 +2269,8 @@ _public_ int sd_journal_process(sd_journal *j) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; j->last_process_usec = now(CLOCK_MONOTONIC); @@ -2261,7 +2309,10 @@ _public_ int sd_journal_wait(sd_journal *j, uint64_t timeout_usec) { int r; uint64_t t; - assert(j); + if (!j) + return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (j->inotify_fd < 0) { @@ -2310,6 +2361,8 @@ _public_ int sd_journal_get_cutoff_realtime_usec(sd_journal *j, uint64_t *from, if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!from && !to) return -EINVAL; if (from == to) @@ -2351,6 +2404,8 @@ _public_ int sd_journal_get_cutoff_monotonic_usec(sd_journal *j, sd_id128_t boot if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!from && !to) return -EINVAL; if (from == to) @@ -2408,6 +2463,8 @@ _public_ int sd_journal_get_usage(sd_journal *j, uint64_t *bytes) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!bytes) return -EINVAL; @@ -2429,6 +2486,8 @@ _public_ int sd_journal_query_unique(sd_journal *j, const char *field) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (isempty(field)) return -EINVAL; if (!field_is_valid(field)) @@ -2453,6 +2512,8 @@ _public_ int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_ if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!data) return -EINVAL; if (!l) @@ -2565,6 +2626,8 @@ _public_ void sd_journal_restart_unique(sd_journal *j) { _public_ int sd_journal_reliable_fd(sd_journal *j) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; return !j->on_network; } @@ -2598,6 +2661,8 @@ _public_ int sd_journal_get_catalog(sd_journal *j, char **ret) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!ret) return -EINVAL; @@ -2635,6 +2700,8 @@ _public_ int sd_journal_get_catalog_for_message_id(sd_id128_t id, char **ret) { _public_ int sd_journal_set_data_threshold(sd_journal *j, size_t sz) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; j->data_threshold = sz; return 0; @@ -2643,6 +2710,8 @@ _public_ int sd_journal_set_data_threshold(sd_journal *j, size_t sz) { _public_ int sd_journal_get_data_threshold(sd_journal *j, size_t *sz) { if (!j) return -EINVAL; + if (journal_pid_changed(j)) + return -ECHILD; if (!sz) return -EINVAL;