summaryrefslogtreecommitdiff
path: root/src/journal/journal-file.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-03-15 01:13:01 +0100
committerLennart Poettering <lennart@poettering.net>2012-03-15 01:13:01 +0100
commit9447a7f1de5e5798cf324ef26579d0dd7e601203 (patch)
treec100eaa48a3ffe383d8809cc2be58cec17c5443d /src/journal/journal-file.c
parent4d1c38b8072dca18807371170d5e14fa8dc0baa5 (diff)
journal: if we encounter a corrupted file, rotate and go on
Diffstat (limited to 'src/journal/journal-file.c')
-rw-r--r--src/journal/journal-file.c43
1 files changed, 42 insertions, 1 deletions
diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c
index 8c17620ed3..1e6d78cfa4 100644
--- a/src/journal/journal-file.c
+++ b/src/journal/journal-file.c
@@ -1727,6 +1727,9 @@ int journal_file_open(
(flags & O_ACCMODE) != O_RDWR)
return -EINVAL;
+ if (!endswith(fname, ".journal"))
+ return -EINVAL;
+
f = new0(JournalFile, 1);
if (!f)
return -ENOMEM;
@@ -1840,7 +1843,7 @@ int journal_file_rotate(JournalFile **f) {
l = strlen(old_file->path);
- p = new(char, l + 1 + 16 + 1 + 32 + 1 + 16 + 1);
+ p = new(char, l + 1 + 32 + 1 + 16 + 1 + 16 + 1);
if (!p)
return -ENOMEM;
@@ -1867,6 +1870,44 @@ int journal_file_rotate(JournalFile **f) {
return r;
}
+int journal_file_open_reliably(
+ const char *fname,
+ int flags,
+ mode_t mode,
+ JournalFile *template,
+ JournalFile **ret) {
+
+ int r;
+ size_t l;
+ char *p;
+
+ r = journal_file_open(fname, flags, mode, template, ret);
+ if (r != -EBADMSG)
+ return r;
+
+ if ((flags & O_ACCMODE) == O_RDONLY)
+ return r;
+
+ if (!(flags & O_CREAT))
+ return r;
+
+ l = strlen(fname);
+ if (asprintf(&p, "%.*s@%016llx-%016llx.journal~",
+ (int) (l-8), fname,
+ (unsigned long long) now(CLOCK_REALTIME),
+ random_ull()) < 0)
+ return -ENOMEM;
+
+ r = rename(fname, p);
+ free(p);
+ if (r < 0)
+ return -errno;
+
+ log_warning("File %s corrupted, renaming and replacing.", fname);
+
+ return journal_file_open(fname, flags, mode, template, ret);
+}
+
struct vacuum_info {
off_t usage;
char *filename;