journald 0.7.0

A rust binding for the systemd journald api
Documentation
use libc::c_int;
use libsystemd_sys::{c_void, const_iovec, journal as ffi, size_t};

use super::{JournalEntry, Result};
use crate::ffi_result;

pub fn submit(entry: &JournalEntry) -> Result<()> {
	let mut fields = Vec::<String>::new();

	for (k, v) in entry.get_fields() {
		fields.push(format!("{}={}", k, v));
	}

	let fields_iovec = array_to_iovecs(&fields.iter().map(|v| v.as_str()).collect::<Vec<&str>>());

	unsafe {
		ffi_result(ffi::sd_journal_sendv(
			fields_iovec.as_ptr(),
			fields_iovec.len() as c_int,
		))?
	};

	Ok(())
}

pub fn array_to_iovecs(args: &[&str]) -> Vec<const_iovec> {
	args.iter()
		.map(|d| const_iovec {
			iov_base: d.as_ptr() as *const c_void,
			iov_len: d.len() as size_t,
		})
		.collect()
}