nfsv41-sys 0.1.1

Bindings for the NFSv4.1 protocol structs and XDR codecs (nfsv41.h)
use nfsv41_sys::*;
use std::os::raw::c_char;

fn main() {
    unsafe {
        let fh: [u8; 4] = [0xde, 0xad, 0xbe, 0xef];
        let tag = b"roundtrip\0".to_vec();
        let mut argop: nfs_argop4 = std::mem::zeroed();
        argop.argop = nfs_opnum4_NFS4_OP_PUTFH;
        argop.nfs_argop4_u.opputfh.object.nfs_fh4_len = fh.len() as u32;
        argop.nfs_argop4_u.opputfh.object.nfs_fh4_val = fh.as_ptr() as *mut c_char;
        let mut args: COMPOUND4args = std::mem::zeroed();
        args.tag.utf8string_len = tag.len() as u32;
        args.tag.utf8string_val = tag.as_ptr() as *mut c_char;
        args.minorversion = 1;
        args.argarray.argarray_len = 1;
        args.argarray.argarray_val = &mut argop as *mut nfs_argop4;

        let mut xdr: XDR = std::mem::zeroed();
        let mut buf = vec![0u8; 4096];
        xdrmem_ncreate(
            &mut xdr,
            buf.as_mut_ptr() as *mut c_char,
            4096,
            xdr_op_XDR_ENCODE,
        );
        let ok = xdr_wrap_COMPOUND4args(&mut xdr, &mut args);
        println!("encode ok: {}", ok);
        let len = xdr.x_data.offset_from(xdr.x_v.vio_base) as usize;
        println!("len: {}", len);
        println!("hex: {:02x?}", &buf[0..len]);

        let mut xdr2: XDR = std::mem::zeroed();
        let mut b2 = buf[0..len].to_vec();
        xdrmem_ncreate(
            &mut xdr2,
            b2.as_mut_ptr() as *mut c_char,
            len as u32,
            xdr_op_XDR_DECODE,
        );
        let mut decoded: COMPOUND4args = std::mem::zeroed();
        let ok2 = xdr_wrap_COMPOUND4args(&mut xdr2, &mut decoded);
        println!("decode ok: {}", ok2);
        if ok2 {
            println!(
                "tag len {}: {}",
                decoded.tag.utf8string_len,
                String::from_utf8_lossy(std::slice::from_raw_parts(
                    decoded.tag.utf8string_val as *const u8,
                    decoded.tag.utf8string_len as usize
                ))
            );
            println!("minorversion: {}", decoded.minorversion);
            println!("nargs: {}", decoded.argarray.argarray_len);
            let da = &*decoded.argarray.argarray_val;
            println!("argop: {}", da.argop);
            println!("fh len: {}", da.nfs_argop4_u.opputfh.object.nfs_fh4_len);
            println!(
                "fh: {:02x?}",
                std::slice::from_raw_parts(
                    da.nfs_argop4_u.opputfh.object.nfs_fh4_val as *const u8,
                    da.nfs_argop4_u.opputfh.object.nfs_fh4_len as usize
                )
            );
            xdr_wrap_COMPOUND4args(&raw mut xdr_free_null_stream, &mut decoded);
        }
    }
}