X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fjournal%2Fjournald.c;h=c429896ac40cbd4aa9cb8530da247fe853743fbb;hp=93cdec6c6c6dacebdec54994c30c80012aea21cf;hb=a6903061530cac5fbaa99a080a93221c02c349f9;hpb=5e62067d08d989ab98b12497a9b27a877de8515b
diff --git a/src/journal/journald.c b/src/journal/journald.c
index 93cdec6c6..c429896ac 100644
--- a/src/journal/journald.c
+++ b/src/journal/journald.c
@@ -6,16 +6,16 @@
Copyright 2011 Lennart Poettering
systemd is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
(at your option) any later version.
systemd is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
+ Lesser General Public License for more details.
- You should have received a copy of the GNU General Public License
+ You should have received a copy of the GNU Lesser General Public License
along with systemd; If not, see .
***/
@@ -29,13 +29,13 @@
#include
#include
#include
-#include
#include
#include
#include
#include
+#include "mkdir.h"
#include "hashmap.h"
#include "journal-file.h"
#include "socket-util.h"
@@ -154,13 +154,10 @@ static uint64_t available_space(Server *s) {
for (;;) {
struct stat st;
struct dirent buf, *de;
- int k;
- k = readdir_r(d, &buf, &de);
- if (k != 0) {
- r = -k;
- goto finish;
- }
+ r = readdir_r(d, &buf, &de);
+ if (r != 0)
+ break;
if (!de)
break;
@@ -333,7 +330,10 @@ static void server_rotate(Server *s) {
if (s->runtime_journal) {
r = journal_file_rotate(&s->runtime_journal);
if (r < 0)
- log_error("Failed to rotate %s: %s", s->runtime_journal->path, strerror(-r));
+ if (s->runtime_journal)
+ log_error("Failed to rotate %s: %s", s->runtime_journal->path, strerror(-r));
+ else
+ log_error("Failed to create new runtime journal: %s", strerror(-r));
else
server_fix_perms(s, s->runtime_journal, 0);
}
@@ -341,7 +341,11 @@ static void server_rotate(Server *s) {
if (s->system_journal) {
r = journal_file_rotate(&s->system_journal);
if (r < 0)
- log_error("Failed to rotate %s: %s", s->system_journal->path, strerror(-r));
+ if (s->system_journal)
+ log_error("Failed to rotate %s: %s", s->system_journal->path, strerror(-r));
+ else
+ log_error("Failed to create new system journal: %s", strerror(-r));
+
else
server_fix_perms(s, s->system_journal, 0);
}
@@ -349,7 +353,10 @@ static void server_rotate(Server *s) {
HASHMAP_FOREACH_KEY(f, k, s->user_journals, i) {
r = journal_file_rotate(&f);
if (r < 0)
- log_error("Failed to rotate %s: %s", f->path, strerror(-r));
+ if (f->path)
+ log_error("Failed to rotate %s: %s", f->path, strerror(-r));
+ else
+ log_error("Failed to create user journal: %s", strerror(-r));
else {
hashmap_replace(s->user_journals, k, f);
server_fix_perms(s, s->system_journal, PTR_TO_UINT32(k));
@@ -612,7 +619,15 @@ retry:
else {
r = journal_file_append_entry(f, NULL, iovec, n, &s->seqnum, NULL, NULL);
- if ((r == -EBADMSG || r == -E2BIG) && !vacuumed) {
+ if ((r == -E2BIG || /* hit limit */
+ r == -EFBIG || /* hit fs limit */
+ r == -EDQUOT || /* quota hit */
+ r == -ENOSPC || /* disk full */
+ r == -EBADMSG || /* corrupted */
+ r == -ENODATA || /* truncated */
+ r == -EHOSTDOWN || /* other machine */
+ r == -EPROTONOSUPPORT) && /* unsupported feature */
+ !vacuumed) {
if (r == -E2BIG)
log_info("Allocation limit reached, rotating.");
@@ -1143,7 +1158,7 @@ static void process_native_message(
char *identifier = NULL, *message = NULL;
assert(s);
- assert(buffer || n == 0);
+ assert(buffer || buffer_size == 0);
p = buffer;
remaining = buffer_size;
@@ -1229,11 +1244,11 @@ static void process_native_message(
p[17] >= '0' && p[17] <= '9')
priority = (priority & LOG_PRIMASK) | (((p[16] - '0')*10 + (p[17] - '0')) << 3);
- else if (l >= 12 &&
- memcmp(p, "SYSLOG_IDENTIFIER=", 11) == 0) {
+ else if (l >= 19 &&
+ memcmp(p, "SYSLOG_IDENTIFIER=", 18) == 0) {
char *t;
- t = strndup(p + 11, l - 11);
+ t = strndup(p + 18, l - 18);
if (t) {
free(identifier);
identifier = t;
@@ -1254,6 +1269,7 @@ static void process_native_message(
p = e + 1;
continue;
} else {
+ le64_t l_le;
uint64_t l;
char *k;
@@ -1262,8 +1278,8 @@ static void process_native_message(
break;
}
- memcpy(&l, e + 1, sizeof(uint64_t));
- l = le64toh(l);
+ memcpy(&l_le, e + 1, sizeof(uint64_t));
+ l = le64toh(l_le);
if (remaining < e - p + 1 + sizeof(uint64_t) + l + 1 ||
e[1+sizeof(uint64_t)+l] != '\n') {
@@ -1918,7 +1934,7 @@ static int system_journal_open(Server *s) {
* if it already exists, so that we can flush
* it into the system journal */
- r = journal_file_open_reliably(fn, O_RDWR, 0640, NULL, &s->runtime_journal);
+ r = journal_file_open(fn, O_RDWR, 0640, NULL, &s->runtime_journal);
free(fn);
if (r < 0) {
@@ -2144,10 +2160,20 @@ static int process_event(Server *s, struct epoll_event *ev) {
size_t label_len = 0;
union {
struct cmsghdr cmsghdr;
+
+ /* We use NAME_MAX space for the
+ * SELinux label here. The kernel
+ * currently enforces no limit, but
+ * according to suggestions from the
+ * SELinux people this will change and
+ * it will probably be identical to
+ * NAME_MAX. For now we use that, but
+ * this should be updated one day when
+ * the final limit is known.*/
uint8_t buf[CMSG_SPACE(sizeof(struct ucred)) +
CMSG_SPACE(sizeof(struct timeval)) +
- CMSG_SPACE(sizeof(int)) +
- CMSG_SPACE(PAGE_SIZE)]; /* selinux label */
+ CMSG_SPACE(sizeof(int)) + /* fd */
+ CMSG_SPACE(NAME_MAX)]; /* selinux label */
} control;
ssize_t n;
int v;
@@ -2463,8 +2489,7 @@ static int open_proc_kmsg(Server *s) {
if (!s->import_proc_kmsg)
return 0;
-
- s->proc_kmsg_fd = open("/proc/kmsg", O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
+ s->proc_kmsg_fd = open("/proc/kmsg", O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY);
if (s->proc_kmsg_fd < 0) {
log_warning("Failed to open /proc/kmsg, ignoring: %m");
return 0;
@@ -2569,7 +2594,7 @@ static int server_parse_config_file(Server *s) {
assert(s);
- fn = "/etc/systemd/systemd-journald.conf";
+ fn = "/etc/systemd/journald.conf";
f = fopen(fn, "re");
if (!f) {
if (errno == ENOENT)
@@ -2749,7 +2774,8 @@ int main(int argc, char *argv[]) {
return EXIT_FAILURE;
}
- log_set_target(LOG_TARGET_CONSOLE);
+ log_set_target(LOG_TARGET_SAFE);
+ log_set_facility(LOG_SYSLOG);
log_parse_environment();
log_open();