#include <sys/ioctl.h>
#include <linux/sockios.h>
#include <sys/statvfs.h>
-#include <sys/user.h>
#include <systemd/sd-journal.h>
#include <systemd/sd-login.h>
#include <systemd/sd-messages.h>
#include <systemd/sd-daemon.h>
+#include "mkdir.h"
#include "hashmap.h"
#include "journal-file.h"
#include "socket-util.h"
#ifdef HAVE_ACL
#include <sys/acl.h>
#include <acl/libacl.h>
-#include "acl-util.h"
+#include "acl.h"
#endif
#ifdef HAVE_SELINUX
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;
r = journal_file_rotate(&s->runtime_journal);
if (r < 0)
log_error("Failed to rotate %s: %s", s->runtime_journal->path, strerror(-r));
+ else
+ server_fix_perms(s, s->runtime_journal, 0);
}
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));
+ else
+ server_fix_perms(s, s->system_journal, 0);
}
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));
- else
+ else {
hashmap_replace(s->user_journals, k, f);
+ server_fix_perms(s, s->system_journal, PTR_TO_UINT32(k));
+ }
}
}
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.");
p = e + 1;
continue;
} else {
+ le64_t l_le;
uint64_t l;
char *k;
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') {
* 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) {
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;
assert(s);
- fn = "/etc/systemd/systemd-journald.conf";
+ fn = "/etc/systemd/journald.conf";
f = fopen(fn, "re");
if (!f) {
if (errno == ENOENT)
}
log_set_target(LOG_TARGET_CONSOLE);
+ log_set_facility(LOG_SYSLOG);
log_parse_environment();
log_open();