+ snprintf(header_priority, sizeof(header_priority), "<%i>", LOG_MAKEPRI(LOG_DAEMON, LOG_PRI(level)));
+ char_array_0(header_priority);
+
+ t = (time_t) (now(CLOCK_REALTIME) / USEC_PER_SEC);
+ if (!(tm = localtime(&t)))
+ return -EINVAL;
+
+ if (strftime(header_time, sizeof(header_time), "%h %e %T ", tm) <= 0)
+ return -EINVAL;
+
+ snprintf(header_pid, sizeof(header_pid), "[%llu]: ", (unsigned long long) getpid());
+ char_array_0(header_pid);
+
+ vsnprintf(buffer, sizeof(buffer), format, ap);
+ char_array_0(buffer);
+
+ zero(iovec);
+ IOVEC_SET_STRING(iovec[0], header_priority);
+ IOVEC_SET_STRING(iovec[1], header_time);
+ IOVEC_SET_STRING(iovec[2], __progname);
+ IOVEC_SET_STRING(iovec[3], header_pid);
+ IOVEC_SET_STRING(iovec[4], buffer);
+
+ zero(msghdr);
+ msghdr.msg_iov = iovec;
+ msghdr.msg_iovlen = ELEMENTSOF(iovec);
+
+ if (sendmsg(syslog_fd, &msghdr, 0) < 0)
+ return -errno;
+
+ return 0;
+}
+
+static int write_to_kmsg(
+ int level,
+ const char*file,
+ int line,
+ const char *func,
+ const char *format,
+ va_list ap) {
+
+ char header_priority[16], header_pid[16];
+ char buffer[LOG_BUFFER_MAX];
+ struct iovec iovec[5];
+
+ if (kmsg_fd < 0)
+ return -EIO;
+
+ snprintf(header_priority, sizeof(header_priority), "<%i>", LOG_PRI(level));
+ char_array_0(header_priority);
+
+ snprintf(header_pid, sizeof(header_pid), "[%llu]: ", (unsigned long long) getpid());
+ char_array_0(header_pid);
+
+ vsnprintf(buffer, sizeof(buffer), format, ap);
+ char_array_0(buffer);
+
+ zero(iovec);
+ IOVEC_SET_STRING(iovec[0], header_priority);
+ IOVEC_SET_STRING(iovec[1], __progname);
+ IOVEC_SET_STRING(iovec[2], header_pid);
+ IOVEC_SET_STRING(iovec[3], buffer);
+ IOVEC_SET_STRING(iovec[4], (char*) "\n");
+
+ if (writev(kmsg_fd, iovec, ELEMENTSOF(iovec)) < 0)
+ return -errno;
+
+ return 0;
+}
+
+void log_meta(
+ int level,
+ const char*file,
+ int line,
+ const char *func,
+ const char *format, ...) {
+
+ va_list ap;
+ bool written;
+ int saved_errno;
+
+ if (LOG_PRI(level) > log_max_level)
+ return;
+
+ saved_errno = errno;
+ written = false;
+
+ if (log_target == LOG_TARGET_KMSG) {
+ va_start(ap, format);
+ written = write_to_kmsg(level, file, line, func, format, ap) >= 0;
+ va_end(ap);
+ } else if (log_target == LOG_TARGET_SYSLOG) {
+ va_start(ap, format);
+ written = write_to_syslog(level, file, line, func, format, ap) >= 0;
+ va_end(ap);
+ }
+
+ if (!written) {
+ va_start(ap, format);
+ write_to_console(level, file, line, func, format, ap);
+ va_end(ap);
+ }