Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,11 @@ fn main() {
.allowlist_type("ipp_.*")
.allowlist_var("IPP_.*");

// Lets wrapper.h include cups/dnssd.h, which only CUPS 3 has.
if cups_cfg == "cups3" {
builder = builder.clang_arg("-DCUPS_RS_CUPS3");
}

for include_path in library.include_paths {
builder = builder.clang_arg(format!("-I{}", include_path.display()));
}
Expand Down
53 changes: 53 additions & 0 deletions examples/discover_system_services.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
// DNS-SD is built on cups/dnssd.h, a CUPS 3-only addition; nothing to run under CUPS 2.
#[cfg(not(cups3))]
fn main() {
eprintln!("discover_system_services requires CUPS 3; skipping under CUPS 2.");
}

#[cfg(cups3)]
use cups_rs::Dnssd;
#[cfg(cups3)]
use std::sync::mpsc;
#[cfg(cups3)]
use std::time::{Duration, Instant};

#[cfg(cups3)]
fn main() -> cups_rs::Result<()> {
let (error_sender, error_receiver) = mpsc::channel();
let (browse_sender, browse_receiver) = mpsc::channel();
let dnssd = Dnssd::new(error_sender)?;
let _ipp = dnssd.browse("_ipp-system._tcp", None, browse_sender.clone())?;
let _ipps = dnssd.browse("_ipps-system._tcp", None, browse_sender)?;
let mut resolvers = Vec::new();
let deadline = Instant::now() + Duration::from_secs(5);

while Instant::now() < deadline {
while let Ok(service) = browse_receiver.try_recv() {
if service.added {
resolvers.push(dnssd.resolve_service(&service)?);
}
}
for resolver in &mut resolvers {
if let Some(resolved) = resolver.try_recv()? {
let service = resolved.service;
println!(
"{} {}:{} ({}) addresses={:?}",
service.name,
service.hostname,
service.port,
service.service_type,
resolved.addresses
);
for (name, value) in service.txt {
println!(" {name}={value}");
}
}
}
while let Ok(error) = error_receiver.try_recv() {
eprintln!("DNS-SD error: {error}");
}
std::thread::sleep(Duration::from_millis(20));
}

Ok(())
}
Loading
Loading