chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
tmpfiles: when processing lines, always process prefixes before suffixes
[elogind.git]
/
src
/
journal
/
sd-journal.c
diff --git
a/src/journal/sd-journal.c
b/src/journal/sd-journal.c
index 283d5930630c34c4dbdfa17944a3b6c73cab41eb..ca805f83fe41fb18ac831bc915db0c2624fd0edb 100644
(file)
--- a/
src/journal/sd-journal.c
+++ b/
src/journal/sd-journal.c
@@
-51,6
+51,8
@@
#define DEFAULT_DATA_THRESHOLD (64*1024)
#define DEFAULT_DATA_THRESHOLD (64*1024)
+static void remove_file_real(sd_journal *j, JournalFile *f);
+
static bool journal_pid_changed(sd_journal *j) {
assert(j);
static bool journal_pid_changed(sd_journal *j) {
assert(j);
@@
-464,7
+466,7
@@
static int compare_entry_order(JournalFile *af, Object *_ao,
if (sd_id128_equal(ao->entry.boot_id, bo->entry.boot_id)) {
if (sd_id128_equal(ao->entry.boot_id, bo->entry.boot_id)) {
- /* If the boot id matches compare monotonic time */
+ /* If the boot id matches
,
compare monotonic time */
a = le64toh(ao->entry.monotonic);
b = le64toh(bo->entry.monotonic);
a = le64toh(ao->entry.monotonic);
b = le64toh(bo->entry.monotonic);
@@
-474,7
+476,7
@@
static int compare_entry_order(JournalFile *af, Object *_ao,
return 1;
}
return 1;
}
- /* Otherwise compare UTC time */
+ /* Otherwise
,
compare UTC time */
a = le64toh(ao->entry.realtime);
b = le64toh(bo->entry.realtime);
a = le64toh(ao->entry.realtime);
b = le64toh(bo->entry.realtime);
@@
-871,9
+873,9
@@
static int next_beyond_location(sd_journal *j, JournalFile *f, direction_t direc
static int real_journal_next(sd_journal *j, direction_t direction) {
JournalFile *f, *new_file = NULL;
uint64_t new_offset = 0;
static int real_journal_next(sd_journal *j, direction_t direction) {
JournalFile *f, *new_file = NULL;
uint64_t new_offset = 0;
- Object *o;
- uint64_t p;
+ uint64_t p = 0;
Iterator i;
Iterator i;
+ Object *o;
int r;
assert_return(j, -EINVAL);
int r;
assert_return(j, -EINVAL);
@@
-885,6
+887,7
@@
static int real_journal_next(sd_journal *j, direction_t direction) {
r = next_beyond_location(j, f, direction, &o, &p);
if (r < 0) {
log_debug("Can't iterate through %s, ignoring: %s", f->path, strerror(-r));
r = next_beyond_location(j, f, direction, &o, &p);
if (r < 0) {
log_debug("Can't iterate through %s, ignoring: %s", f->path, strerror(-r));
+ remove_file_real(j, f);
continue;
} else if (r == 0)
continue;
continue;
} else if (r == 0)
continue;
@@
-1270,7
+1273,7
@@
static bool file_type_wanted(int flags, const char *filename) {
if (flags & SD_JOURNAL_CURRENT_USER) {
char prefix[5 + DECIMAL_STR_MAX(uid_t) + 1];
if (flags & SD_JOURNAL_CURRENT_USER) {
char prefix[5 + DECIMAL_STR_MAX(uid_t) + 1];
- assert_se(snprintf(prefix, sizeof(prefix), "user-
%lu", (unsigned long)
getuid())
+ assert_se(snprintf(prefix, sizeof(prefix), "user-
"UID_FMT,
getuid())
< (int) sizeof(prefix));
if (file_has_type_prefix(prefix, filename))
< (int) sizeof(prefix));
if (file_has_type_prefix(prefix, filename))
@@
-1281,7
+1284,7
@@
static bool file_type_wanted(int flags, const char *filename) {
}
static int add_any_file(sd_journal *j, const char *path) {
}
static int add_any_file(sd_journal *j, const char *path) {
- JournalFile *f;
+ JournalFile *f
= NULL
;
int r;
assert(j);
int r;
assert(j);
@@
-1339,7
+1342,7
@@
static int add_file(sd_journal *j, const char *prefix, const char *filename) {
}
static int remove_file(sd_journal *j, const char *prefix, const char *filename) {
}
static int remove_file(sd_journal *j, const char *prefix, const char *filename) {
- char *path;
+
_cleanup_free_
char *path;
JournalFile *f;
assert(j);
JournalFile *f;
assert(j);
@@
-1351,10
+1354,17
@@
static int remove_file(sd_journal *j, const char *prefix, const char *filename)
return -ENOMEM;
f = hashmap_get(j->files, path);
return -ENOMEM;
f = hashmap_get(j->files, path);
- free(path);
if (!f)
return 0;
if (!f)
return 0;
+ remove_file_real(j, f);
+ return 0;
+}
+
+static void remove_file_real(sd_journal *j, JournalFile *f) {
+ assert(j);
+ assert(f);
+
hashmap_remove(j->files, f->path);
log_debug("File %s removed.", f->path);
hashmap_remove(j->files, f->path);
log_debug("File %s removed.", f->path);
@@
-1372,8
+1382,6
@@
static int remove_file(sd_journal *j, const char *prefix, const char *filename)
journal_file_close(f);
j->current_invalidate_counter ++;
journal_file_close(f);
j->current_invalidate_counter ++;
-
- return 0;
}
static int add_directory(sd_journal *j, const char *prefix, const char *dirname) {
}
static int add_directory(sd_journal *j, const char *prefix, const char *dirname) {
@@
-1447,8
+1455,7
@@
static int add_directory(sd_journal *j, const char *prefix, const char *dirname)
de = readdir(d);
if (!de && errno != 0) {
r = -errno;
de = readdir(d);
if (!de && errno != 0) {
r = -errno;
- log_debug("Failed to read directory %s: %s",
- m->path, strerror(errno));
+ log_debug("Failed to read directory %s: %m", m->path);
return r;
}
if (!de)
return r;
}
if (!de)
@@
-1538,8
+1545,7
@@
static int add_root_directory(sd_journal *j, const char *p) {
de = readdir(d);
if (!de && errno != 0) {
r = -errno;
de = readdir(d);
if (!de && errno != 0) {
r = -errno;
- log_debug("Failed to read directory %s: %s",
- m->path, strerror(errno));
+ log_debug("Failed to read directory %s: %m", m->path);
return r;
}
if (!de)
return r;
}
if (!de)
@@
-1842,8
+1848,7
@@
_public_ void sd_journal_close(sd_journal *j) {
hashmap_free(j->directories_by_path);
hashmap_free(j->directories_by_wd);
hashmap_free(j->directories_by_path);
hashmap_free(j->directories_by_wd);
- if (j->inotify_fd >= 0)
- close_nointr_nofail(j->inotify_fd);
+ safe_close(j->inotify_fd);
if (j->mmap) {
log_debug("mmap cache statistics: %u hit, %u miss", mmap_cache_get_hit(j->mmap), mmap_cache_get_missed(j->mmap));
if (j->mmap) {
log_debug("mmap cache statistics: %u hit, %u miss", mmap_cache_get_hit(j->mmap), mmap_cache_get_missed(j->mmap));
@@
-2293,8
+2298,6
@@
_public_ int sd_journal_process(sd_journal *j) {
l -= step;
}
}
l -= step;
}
}
-
- return determine_change(j);
}
_public_ int sd_journal_wait(sd_journal *j, uint64_t timeout_usec) {
}
_public_ int sd_journal_wait(sd_journal *j, uint64_t timeout_usec) {
@@
-2347,6
+2350,7
@@
_public_ int sd_journal_get_cutoff_realtime_usec(sd_journal *j, uint64_t *from,
Iterator i;
JournalFile *f;
bool first = true;
Iterator i;
JournalFile *f;
bool first = true;
+ uint64_t fmin = 0, tmax = 0;
int r;
assert_return(j, -EINVAL);
int r;
assert_return(j, -EINVAL);
@@
-2366,19
+2370,20
@@
_public_ int sd_journal_get_cutoff_realtime_usec(sd_journal *j, uint64_t *from,
continue;
if (first) {
continue;
if (first) {
- if (from)
- *from = fr;
- if (to)
- *to = t;
+ fmin = fr;
+ tmax = t;
first = false;
} else {
first = false;
} else {
- if (from)
- *from = MIN(fr, *from);
- if (to)
- *to = MAX(t, *to);
+ fmin = MIN(fr, fmin);
+ tmax = MAX(t, tmax);
}
}
}
}
+ if (from)
+ *from = fmin;
+ if (to)
+ *to = tmax;
+
return first ? 0 : 1;
}
return first ? 0 : 1;
}
@@
-2481,9
+2486,7
@@
_public_ int sd_journal_query_unique(sd_journal *j, const char *field) {
}
_public_ int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_t *l) {
}
_public_ int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_t *l) {
- Object *o;
size_t k;
size_t k;
- int r;
assert_return(j, -EINVAL);
assert_return(!journal_pid_changed(j), -ECHILD);
assert_return(j, -EINVAL);
assert_return(!journal_pid_changed(j), -ECHILD);
@@
-2503,9
+2506,11
@@
_public_ int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_
for (;;) {
JournalFile *of;
Iterator i;
for (;;) {
JournalFile *of;
Iterator i;
+ Object *o;
const void *odata;
size_t ol;
bool found;
const void *odata;
size_t ol;
bool found;
+ int r;
/* Proceed to next data object in the field's linked list */
if (j->unique_offset == 0) {
/* Proceed to next data object in the field's linked list */
if (j->unique_offset == 0) {
@@
-2542,8
+2547,16
@@
_public_ int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_
return r;
/* Let's do the type check by hand, since we used 0 context above. */
return r;
/* Let's do the type check by hand, since we used 0 context above. */
- if (o->object.type != OBJECT_DATA)
+ if (o->object.type != OBJECT_DATA) {
+ log_error("%s:offset " OFSfmt ": object has type %d, expected %d",
+ j->unique_file->path, j->unique_offset,
+ o->object.type, OBJECT_DATA);
return -EBADMSG;
return -EBADMSG;
+ }
+
+ r = journal_file_object_keep(j->unique_file, o, j->unique_offset);
+ if (r < 0)
+ return r;
r = return_data(j, j->unique_file, o, &odata, &ol);
if (r < 0)
r = return_data(j, j->unique_file, o, &odata, &ol);
if (r < 0)
@@
-2577,6
+2590,10
@@
_public_ int sd_journal_enumerate_unique(sd_journal *j, const void **data, size_
if (found)
continue;
if (found)
continue;
+ r = journal_file_object_release(j->unique_file, o, j->unique_offset);
+ if (r < 0)
+ return r;
+
r = return_data(j, j->unique_file, o, data, l);
if (r < 0)
return r;
r = return_data(j, j->unique_file, o, data, l);
if (r < 0)
return r;