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: toml [dependencies] nfc1-sys = "0.2"

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.

```rust extern crate nfc1sys; use std::ffi::CStr; use std::mem::MaybeUninit; use nfc1sys::{nfccontext, nfcdevice, nfcversion, nfcinit, nfcopen, nfcdevicegetname, nfcclose, nfcexit};

fn main() { let version = unsafe { CStr::fromptr(nfcversion()) }.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);
}

} ```