#print #cups #printer #ipp #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

#3 in #cups


106 lines

cups-sys Build Status

Rust FFI bindings to CUPS.


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(
      // File to print.
      // Name of the print job.
      CString::new("Test print job")
  println!("{}", job_id);
  cupsFreeDests(num_dests, dests);

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


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(
        let make_and_model = CStr::from_ptr(c_make_and_model).to_string_lossy();
        println!("{} ({})", printer_name, make_and_model);

    cupsFreeDests(num_dests, dests);


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

No runtime deps

~40K SLoC