#nfc #low-level #safe-bindings #high-level #find #libnfc #nfc1

sys nfc1-sys

Low-level Rust bindings for libnfc. For high-level safe bindings, see crate nfc1.

11 releases

0.3.9 Oct 2, 2024
0.3.5 May 23, 2023
0.3.4 Mar 11, 2023
0.3.0 Dec 7, 2022
0.1.4 Apr 27, 2021

#818 in Hardware support

Download history 13/week @ 2024-07-12 5/week @ 2024-07-19 94/week @ 2024-07-26 15/week @ 2024-08-02 22/week @ 2024-08-09 8/week @ 2024-08-16 26/week @ 2024-09-20 545/week @ 2024-09-27 120/week @ 2024-10-04 17/week @ 2024-10-11

216 downloads per month
Used in 4 crates (via nfc1)

MIT license

1MB
19K SLoC

C 18K SLoC // 0.2% comments Rust 401 SLoC // 0.0% comments Automake 396 SLoC // 0.0% comments M4 295 SLoC // 0.0% comments Shell 190 SLoC // 0.3% comments Batch 95 SLoC Bitbake 33 SLoC Snakemake 12 SLoC // 0.3% comments

Contains (obscure autoconf code, 7KB) vendor/nfc/configure.ac

nfc1-sys

Crates.io

This crate provides low-level bindings to libnfc, generated by bindgen.

In contrast to nfc-sys, this crate additionally provides:

  • Metadata which allows dependent crates to find the nfc/nfc.h header, compile native code that depends on libnfc or link to it in Rust code.
  • Vendored submodule copy of libnfc (with build tweaks for x86_64-pc-windows-msvc), which means you don't have to separately install libnfc to use this crate. The vendoring is optional and can be disabled by removing the vendored feature.

Features

Feature Default? Description
vendored Yes Use vendored libnfc, instead of installed one on the platform.
drivers Yes Add chip or driver specific symbols from vendored libnfc.
logging No Enables logging when using the vendored libnfc.
conffiles No Enables config files on vendored libnfc.
envvars No Enables environment variables on vendored libnfc.

Usage

Add nfc1-sys as a dependency in your project's Cargo.toml file:

[dependencies]
nfc1-sys = "0.3"

Import the nfc1_sys crate in your project, then you can use all functions starting with nfc_ from libnfc.

See the libnfc wiki or libnfc 1.8.0 examples for information on how to use it. The API is the same, as this is just a binding.

Usage example

Note that there is quite a lot of unsafe code here. This is because this is just a simple binding, not a safe wrapper.

extern crate nfc1_sys;
use std::ffi::CStr;
use std::mem::MaybeUninit;
use nfc1_sys::{nfc_context, nfc_device, nfc_version, nfc_init, nfc_open, nfc_device_get_name, nfc_close, nfc_exit};

fn main() {
	let version = unsafe { CStr::from_ptr(nfc_version()) }.to_str().unwrap();
	println!("libnfc v{}", version);

	let context: *mut nfc_context = unsafe {
		let mut ctx = MaybeUninit::uninit();
		nfc_init(ctx.as_mut_ptr());
		ctx.assume_init()
	};

	let device: *mut nfc_device = unsafe {
		let pnd = nfc_open(context, std::ptr::null_mut());
		if pnd.as_ref().is_none() {
			nfc_exit(context);
			panic!("Error opening NFC reader");
		}
		pnd
	};

	let device_name = unsafe { CStr::from_ptr(nfc_device_get_name(device)) }.to_str().unwrap();
	println!("NFC reader: {} opened", device_name);

	unsafe {
		nfc_close(device);
		nfc_exit(context);
	}
}

Dependencies

~0–2.4MB
~49K SLoC