// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

use std::ffi::CStr;

use libc;
use log::{self, Level, LevelFilter, Metadata, Record, SetLoggerError};

static LOGGER: SyslogLogger = SyslogLogger;

struct SyslogLogger;

impl log::Log for SyslogLogger {
    fn enabled(&self, metadata: &Metadata) -> bool {
        if cfg!(debug_assertions) {
            metadata.level() <= Level::Debug
        } else {
            metadata.level() <= Level::Info
        }
    }

    fn log(&self, record: &Record) {
        if !self.enabled(&record.metadata()) {
            return;
        }

        let level = match record.level() {
            Level::Error => libc::LOG_ERR,
            Level::Warn => libc::LOG_WARNING,
            Level::Info => libc::LOG_INFO,
            Level::Debug => libc::LOG_DEBUG,
            Level::Trace => libc::LOG_DEBUG,
        };

        let msg = format!("{}\0", record.args());
        let cmsg = if let Ok(m) = CStr::from_bytes_with_nul(msg.as_bytes()) {
            m
        } else {
            // For now we just drop messages with interior nuls.
            return;
        };

        // Safe because this doesn't modify any memory.  There's not much use
        // in checking the return value because this _is_ the logging function
        // so there's no way for us to tell anyone about the error.
        unsafe {
            libc::syslog(level, cmsg.as_ptr());
        }
    }
    fn flush(&self) {}
}

/// Initializes the logger to send log messages to syslog.
pub fn init(ident: &'static CStr) -> Result<(), SetLoggerError> {
    // Safe because this only modifies libc's internal state and is safe to call
    // multiple times.
    unsafe {
        libc::openlog(
            ident.as_ptr(),
            libc::LOG_NDELAY | libc::LOG_PID,
            libc::LOG_USER,
        )
    };
    log::set_logger(&LOGGER)?;
    let level = if cfg!(debug_assertions) {
        LevelFilter::Debug
    } else {
        LevelFilter::Info
    };
    log::set_max_level(level);

    Ok(())
}
