use std::io;
use std::net::ToSocketAddrs;
use std::net::UdpSocket;
use crate::format::SyslogContext;
use crate::sender::internal::impl_syslog_sender_common;
pub fn udp_well_known() -> io::Result<UdpSender> {
udp("0.0.0.0:0", "127.0.0.1:514")
}
pub fn udp<L: ToSocketAddrs, R: ToSocketAddrs>(local: L, remote: R) -> io::Result<UdpSender> {
UdpSender::connect(local, remote)
}
pub fn broadcast_well_known() -> io::Result<UdpSender> {
broadcast(514)
}
pub fn broadcast(port: u16) -> io::Result<UdpSender> {
let socket = UdpSocket::bind("0.0.0.0:0")?;
socket.set_broadcast(true)?;
socket.connect(format!("255.255.255.255:{port}"))?;
Ok(UdpSender::new(socket))
}
#[derive(Debug)]
pub struct UdpSender {
socket: UdpSocket,
context: SyslogContext,
}
impl UdpSender {
pub fn connect<L: ToSocketAddrs, R: ToSocketAddrs>(local: L, remote: R) -> io::Result<Self> {
let socket = UdpSocket::bind(local)?;
socket.connect(remote)?;
Ok(Self::new(socket))
}
pub fn new(socket: UdpSocket) -> Self {
Self {
socket,
context: SyslogContext::default(),
}
}
pub fn set_context(&mut self, context: SyslogContext) {
self.context = context;
}
pub fn mut_context(&mut self) -> &mut SyslogContext {
&mut self.context
}
pub fn send_formatted(&mut self, formatted: &[u8]) -> io::Result<()> {
self.socket.send(formatted)?;
Ok(())
}
}
impl_syslog_sender_common!(UdpSender);