void klog_write(int level, const char* fmt, ...) { if (level > klog_level) return; char buf[LOG_BUF_MAX]; va_list ap; va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); buf[LOG_BUF_MAX - 1] = 0; struct iovec iov[1]; iov[0].iov_base = buf; iov[0].iov_len = strlen(buf); klog_writev(level, iov, 1); }
static void init_klog_vwrite(int level, const char* fmt, va_list ap) { static const char* tag = basename(getprogname()); // The kernel's printk buffer is only 1024 bytes. // TODO: should we automatically break up long lines into multiple lines? // Or we could log but with something like "..." at the end? char buf[1024]; size_t prefix_size = snprintf(buf, sizeof(buf), "<%d>%s: ", level, tag); size_t msg_size = vsnprintf(buf + prefix_size, sizeof(buf) - prefix_size, fmt, ap); if (msg_size >= sizeof(buf) - prefix_size) { msg_size = snprintf(buf + prefix_size, sizeof(buf) - prefix_size, "(%zu-byte message too long for printk)\n", msg_size); } iovec iov[1]; iov[0].iov_base = buf; iov[0].iov_len = prefix_size + msg_size; klog_writev(level, iov, 1); }