The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#define SD_JOURNAL_SUPPRESS_LOCATION
#include <systemd/sd-journal.h>

MODULE = Linux::Systemd::Journal::Write	PACKAGE = Linux::Systemd::Journal::Write

PROTOTYPES: DISABLE

NO_OUTPUT int
__sd_journal_print(int pri, const char *msg, ...)
    CODE:
        RETVAL = sd_journal_print( pri, "%s", msg );
    POSTCALL:
        if (RETVAL < 0)
             croak("Error %d while sending message", RETVAL);

NO_OUTPUT int
__sd_journal_perror(const char *msg)
    CODE:
        RETVAL = sd_journal_perror(msg );
    POSTCALL:
        if (RETVAL < 0)
             croak("Error %d while sending message", RETVAL);

NO_OUTPUT int
__sd_journal_send(AV *data)
    CODE:
        int array_size = av_top_index(data) + 1;
        struct iovec iov[array_size];

        for (int i = 0; i < array_size; i++) {
            SV *s = av_shift(data);
            char *str = SvPV(s, SvLEN(s));
            iov[i].iov_base = str;
            iov[i].iov_len = strlen(str);
        }

        RETVAL = sd_journal_sendv(iov, array_size);
    POSTCALL:
        if (RETVAL < 0)
             croak("Error sending message: %s", strerror(RETVAL));