diff --git a/Makefile.am b/Makefile.am
index 119d968889..b54c21b374 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -502,7 +502,8 @@ MANPAGES = \
man/sd_journal_print.3 \
man/sd_journal_stream_fd.3 \
man/sd_journal_open.3 \
- man/sd_journal_next.3
+ man/sd_journal_next.3 \
+ man/sd_journal_get_data.3
MANPAGES_ALIAS = \
man/reboot.8 \
@@ -547,7 +548,12 @@ MANPAGES_ALIAS = \
man/sd_journal_close.3 \
man/sd_journal_previous.3 \
man/sd_journal_next_skip.3 \
- man/sd_journal_previous_skip.3
+ man/sd_journal_previous_skip.3 \
+ man/SD_JOURNAL_FOREACH.3 \
+ man/SD_JOURNAL_FOREACH_BACKWARDS.3 \
+ man/sd_journal_enumerate_data.3 \
+ man/sd_journal_restart_data.3 \
+ man/SD_JOURNAL_FOREACH_DATA.3
man/reboot.8: man/halt.8
man/poweroff.8: man/halt.8
@@ -592,6 +598,11 @@ man/sd_journal_close.3: man/sd_journal_open.3
man/sd_journal_previous.3: man/sd_journal_next.3
man/sd_journal_next_skip.3: man/sd_journal_next.3
man/sd_journal_previous_skip.3: man/sd_journal_next.3
+man/SD_JOURNAL_FOREACH.3: man/sd_journal_next.3
+man/SD_JOURNAL_FOREACH_BACKWARDS.3: man/sd_journal_next.3
+man/sd_journal_enumerate_data.3: man/sd_journal_get_data.3
+man/sd_journal_restart_data.3: man/sd_journal_get_data.3
+man/SD_JOURNAL_FOREACH_DATA.3: man/sd_journal_get_data.3
XML_FILES = \
${patsubst %.1,%.xml,${patsubst %.3,%.xml,${patsubst %.5,%.xml,${patsubst %.7,%.xml,${patsubst %.8,%.xml,$(MANPAGES)}}}}}
diff --git a/man/sd_journal_get_data.xml b/man/sd_journal_get_data.xml
new file mode 100644
index 0000000000..9d8a4a2221
--- /dev/null
+++ b/man/sd_journal_get_data.xml
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+ sd_journal_get_data
+ systemd
+
+
+
+ Developer
+ Lennart
+ Poettering
+ lennart@poettering.net
+
+
+
+
+
+ sd_journal_get_data
+ 3
+
+
+
+ sd_journal_get_data
+ sd_journal_enumerate_data
+ sd_journal_restart_data
+ SD_JOURNAL_FOREACH_DATA
+ Read data fields from the current journal entry
+
+
+
+
+ #include <systemd/sd-journal.h>
+
+
+ int sd_journal_get_data
+ sd_journal* j
+ const char* field
+ const void** data
+ size_t* length
+
+
+
+ int sd_journal_enumerate_data
+ sd_journal* j
+ const void** data
+ size_t* length
+
+
+
+ int sd_journal_restart_data
+ sd_journal* j
+
+
+
+ SD_JOURNAL_FOREACH_DATA
+ sd_journal* j
+ const void* data
+ size_t length
+
+
+
+
+
+
+ Description
+
+ sd_journal_get_data() gets
+ the data object associated with a specific field from
+ the current journal entry. It takes four arguments:
+ the journal context object, a string with the field
+ name to request, plus a pair of pointers to
+ pointer/size variables where the data object and its
+ size shall be stored in. The field name should be an
+ entry field name. Well-known field names are listed in
+ systemd.journal-fields7. The
+ returned data is in a read-only memory map and is only
+ valid until the next invocation of
+ sd_journal_get_data() or
+ sd_journal_enumerate_data(), or
+ the read pointer is altered. Note that the data
+ returned will be prefixed with the field name and
+ '='.
+
+ sd_journal_enumerate_data()
+ may be used to iterate through all fields of the
+ current entry. On each invocation the data for the
+ next field is returned. The order of these fields is
+ not defined. The data returned is in the same format
+ as with sd_journal_get_data() and
+ also follows the same life-time semantics.
+
+ sd_journal_restart_data()
+ resets the data enumeration index to the beginning of
+ the entry. The next invocation of
+ sd_journal_enumerate_data() will return the first
+ field of the entry again.
+
+ Note that the
+ SD_JOURNAL_FOREACH_DATA() macro
+ may be used as a wrapper around
+ sd_journal_restart_data() and
+ sd_journal_enumerate_data().
+
+ Note that these functions will not work before
+ sd_journal_next3
+ (or related call) has not been called at least
+ once.
+
+
+
+ Return Value
+
+ sd_journal_get_data()
+ returns 0 on success or a negative errno-style error
+ code. If the current entry does not include the
+ specified field -ENOENT is returned. If
+ sd_journal_next3
+ has not been called at least once -EADDRNOTAVAIL is
+ returned. sd_journal_enumerate_data()
+ returns a positive integer if the next field has been
+ read, 0 when no more fields are known, or a negative
+ errno-style error
+ code. sd_journal_restart_data()
+ returns nothing.
+
+
+
+ Notes
+
+ The sd_journal_get_data(),
+ sd_journal_enumerate_data() and
+ sd_journal_restart_data()
+ interfaces are available as shared library, which can
+ be compiled and linked to with the
+ libsystemd-journal
+ pkg-config1
+ file.
+
+
+
+ Examples
+
+ See
+ sd_journal_next3
+ for a complete example how to use
+ sd_journal_get_data().
+
+ Use the
+ SD_JOURNAL_FOREACH_DATA macro to
+ iterate through all fields of the current journal
+ entry:
+
+ ...
+int print_fields(sd_journal *j) {
+ const void *data;
+ size_t l;
+ SD_JOURNAL_FOREACH_DATA(j, data, length)
+ printf("%.*s\n", (int) length, data);
+}
+...
+
+
+
+
+ See Also
+
+
+ systemd1,
+ systemd.journal-fields7,
+ sd-journal3,
+ sd_journal_open3,
+ sd_journal_next3
+
+
+
+
diff --git a/man/sd_journal_next.xml b/man/sd_journal_next.xml
index f55ee15744..90fcecb107 100644
--- a/man/sd_journal_next.xml
+++ b/man/sd_journal_next.xml
@@ -47,6 +47,8 @@
sd_journal_previous
sd_journal_next_skip
sd_journal_previous_skip
+ SD_JOURNAL_FOREACH
+ SD_JOURNAL_FOREACH_BACKWARDS
Advance or set back the read pointer in the journal
@@ -76,6 +78,15 @@
uint64_t skip
+
+ SD_JOURNAL_FOREACH
+ sd_journal* j
+
+
+
+ SD_JOURNAL_FOREACH_BACKWARDS
+ sd_journal* j
+
@@ -105,6 +116,13 @@
that the entry then pointing to is later in time than
then previous one, or has the same timestamp.
+ Note that
+ sd_journal_get_data3
+ and related calls will fail unless
+ sd_journal_next() has been
+ invoked at least once in order to position the read
+ pointer on a journal entry.
+
Note that the
SD_JOURNAL_FOREACH() macro may be used
as a wrapper around
diff --git a/src/systemd/sd-journal.h b/src/systemd/sd-journal.h
index 935b0452b3..e70f575ce9 100644
--- a/src/systemd/sd-journal.h
+++ b/src/systemd/sd-journal.h
@@ -85,6 +85,7 @@ int sd_journal_next_skip(sd_journal *j, uint64_t skip);
int sd_journal_get_realtime_usec(sd_journal *j, uint64_t *ret);
int sd_journal_get_monotonic_usec(sd_journal *j, uint64_t *ret, sd_id128_t *ret_boot_id);
+
int sd_journal_get_data(sd_journal *j, const char *field, const void **data, size_t *l);
int sd_journal_enumerate_data(sd_journal *j, const void **data, size_t *l);
void sd_journal_restart_data(sd_journal *j);