use crate::error::{Logger2Error, Result};
use std::io::Write;
use std::net::{TcpStream, UdpSocket};
use std::path::Path;
use std::time::Duration;
#[cfg(unix)]
pub fn send_local(socket_path: &Path, message: &str) -> Result<()> {
use std::os::unix::net::UnixDatagram;
let sock = UnixDatagram::unbound()?;
match sock.connect(socket_path) {
Ok(()) => {
sock.send(message.as_bytes())
.map_err(|e| Logger2Error::Network(socket_path.display().to_string(), e))?;
Ok(())
}
Err(_) => {
use std::os::unix::net::UnixStream;
let mut stream = UnixStream::connect(socket_path)
.map_err(|e| Logger2Error::Network(socket_path.display().to_string(), e))?;
stream
.write_all(message.as_bytes())
.map_err(|e| Logger2Error::Network(socket_path.display().to_string(), e))?;
Ok(())
}
}
}
#[cfg(not(unix))]
pub fn send_local(_socket_path: &Path, _message: &str) -> Result<()> {
Err(Logger2Error::UnsupportedPlatform(
"local unix-socket syslog is only available on unix-like systems; use --server to log to a remote syslog daemon instead".to_string(),
))
}
pub fn send_udp(server: &str, port: u16, message: &str) -> Result<()> {
let sock = UdpSocket::bind("0.0.0.0:0")
.map_err(|e| Logger2Error::Network(format!("{server}:{port}"), e))?;
sock.connect((server, port))
.map_err(|e| Logger2Error::Network(format!("{server}:{port}"), e))?;
sock.send(message.as_bytes())
.map_err(|e| Logger2Error::Network(format!("{server}:{port}"), e))?;
Ok(())
}
pub fn send_tcp(server: &str, port: u16, message: &str, timeout: Duration) -> Result<()> {
use std::net::ToSocketAddrs;
let addr = format!("{server}:{port}")
.to_socket_addrs()
.map_err(|e| Logger2Error::Network(format!("{server}:{port}"), e))?
.next()
.ok_or_else(|| {
Logger2Error::Network(
format!("{server}:{port}"),
std::io::Error::new(std::io::ErrorKind::NotFound, "no address resolved"),
)
})?;
let mut stream = TcpStream::connect_timeout(&addr, timeout)
.map_err(|e| Logger2Error::Network(format!("{server}:{port}"), e))?;
stream
.write_all(message.as_bytes())
.map_err(|e| Logger2Error::Network(format!("{server}:{port}"), e))?;
Ok(())
}