summaryrefslogtreecommitdiff
path: root/src/journal/journalctl.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2011-12-19 22:35:46 +0100
committerLennart Poettering <lennart@poettering.net>2011-12-19 22:35:46 +0100
commit50f20cfdb0f127e415ab38c024d9ca7a3602f74b (patch)
treeb8d2296305986c6aac11bad146d591a5638b642c /src/journal/journalctl.c
parent76318284fc970b30e9dc4c079960807345331dad (diff)
journal: implement inotify-based live logging logic
Diffstat (limited to 'src/journal/journalctl.c')
-rw-r--r--src/journal/journalctl.c79
1 files changed, 59 insertions, 20 deletions
diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c
index 9220efdfec..c947730441 100644
--- a/src/journal/journalctl.c
+++ b/src/journal/journalctl.c
@@ -26,12 +26,15 @@
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
+#include <sys/poll.h>
#include "sd-journal.h"
#include "log.h"
+static bool arg_follow = true;
+
int main(int argc, char *argv[]) {
- int r, i;
+ int r, i, fd;
sd_journal *j = NULL;
log_set_max_level(LOG_DEBUG);
@@ -54,32 +57,68 @@ int main(int argc, char *argv[]) {
}
}
- SD_JOURNAL_FOREACH(j) {
+ fd = sd_journal_get_fd(j);
+ if (fd < 0) {
+ log_error("Failed to get wakeup fd: %s", strerror(-fd));
+ goto finish;
+ }
- const void *data;
- size_t length;
- char *cursor;
- uint64_t realtime = 0, monotonic = 0;
+ r = sd_journal_seek_head(j);
+ if (r < 0) {
+ log_error("Failed to seek to head: %s", strerror(-r));
+ goto finish;
+ }
- r = sd_journal_get_cursor(j, &cursor);
- if (r < 0) {
- log_error("Failed to get cursor: %s", strerror(-r));
- goto finish;
+ for (;;) {
+ struct pollfd pollfd;
+
+ while (sd_journal_next(j) > 0) {
+ const void *data;
+ size_t length;
+ char *cursor;
+ uint64_t realtime = 0, monotonic = 0;
+
+ r = sd_journal_get_cursor(j, &cursor);
+ if (r < 0) {
+ log_error("Failed to get cursor: %s", strerror(-r));
+ goto finish;
+ }
+
+ printf("entry: %s\n", cursor);
+ free(cursor);
+
+ sd_journal_get_realtime_usec(j, &realtime);
+ sd_journal_get_monotonic_usec(j, &monotonic, NULL);
+ printf("realtime: %llu\n"
+ "monotonic: %llu\n",
+ (unsigned long long) realtime,
+ (unsigned long long) monotonic);
+
+ SD_JOURNAL_FOREACH_DATA(j, data, length)
+ printf("\t%.*s\n", (int) length, (const char*) data);
}
- printf("entry: %s\n", cursor);
- free(cursor);
+ if (!arg_follow)
+ break;
+
+ zero(pollfd);
+ pollfd.fd = fd;
+ pollfd.events = POLLIN;
- sd_journal_get_realtime_usec(j, &realtime);
- sd_journal_get_monotonic_usec(j, &monotonic, NULL);
- printf("realtime: %llu\n"
- "monotonic: %llu\n",
- (unsigned long long) realtime,
- (unsigned long long) monotonic);
+ if (poll(&pollfd, 1, -1) < 0) {
+ if (errno == EINTR)
+ break;
- SD_JOURNAL_FOREACH_DATA(j, data, length)
- printf("\t%.*s\n", (int) length, (const char*) data);
+ log_error("poll(): %m");
+ r = -errno;
+ goto finish;
+ }
+ r = sd_journal_process(j);
+ if (r < 0) {
+ log_error("Failed to process: %s", strerror(-r));
+ goto finish;
+ }
}
finish: