#printing #ipp #print #cups #lpd

sys cups-sys

Low-level interface to the CUPS printing library

4 releases

Uses old Rust 2015

0.1.4 Apr 29, 2020
0.1.3 Sep 15, 2017
0.1.2 Sep 15, 2017
0.1.1 Aug 5, 2017
0.1.0 Jul 27, 2017

#5 in #ipp

MIT/Apache

10KB
106 lines

cups-sys Build Status

Rust FFI bindings to CUPS.

Background

CUPS is the standards-based, open source printing system developed by Apple Inc. for macOS and other UNIX-like operating systems. CUPS uses the Internet Printing Protocol (IPP) to support printing to local and network printers.

This library (cups-sys) provides a low-level interface to the CUPS library installed on your system. The binding is generated at build time via the bindgen project.

I just want to print from Rust

use std::mem;
use std::ptr;
use cups-sys::*;

unsafe {
  let mut dests: *mut cups_dest_t = mem::zeroed();
  let num_dests = cupsGetDests(&mut dests as *mut _);
  // Get the default printer.
  let destination: cups_dest_t = cupsGetDest(ptr::null(), ptr::null(), num_dests, dests);
  // Print a real page.
  let job_id: i32 = cupsPrintFile(
      (*destination).name,
      // File to print.
      CString::new("/path/to/file")
          .unwrap()
          .as_ptr(),
      // Name of the print job.
      CString::new("Test print job")
          .unwrap()
          .as_ptr(),
      (*destination).num_options,
      (*destination).options
  );
  println!("{}", job_id);
  cupsFreeDests(num_dests, dests);
}

For a pure-Rust IPP implementation, check out ipp.rs.

Documentation

The auto-generated FFI reference docs can be found at https://legneato.github.io/cups-sys/cups_sys/.

The original CUPS API documentation (with examples) can be found at https://www.cups.org/doc/api-cups.html.

Example usage

unsafe {
    let mut dests: *mut cups_dest_t = mem::zeroed();
    let num_dests = cupsGetDests(&mut dests as *mut _);
    let destinations = std::slice::from_raw_parts(dests, num_dests as usize);

    for destination in destinations {
        let c_printer_name = CStr::from_ptr((*destination).name);
        let printer_name = c_printer_name.to_string_lossy();

        let c_make_and_model = cupsGetOption(
            CString::new("printer-make-and-model").unwrap().as_ptr(),
            destination.num_options,
            destination.options
        );
        let make_and_model = CStr::from_ptr(c_make_and_model).to_string_lossy();
        println!("{} ({})", printer_name, make_and_model);
    }

    cupsFreeDests(num_dests, dests);
}

License

cups-sys is licensed under either of the following, at your option:

No runtime deps

~0–3MB
~49K SLoC