1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2015年10月25日 |
---|
#980 in 文件系统
在 smbc 中使用
41KB
707 行
smbclient-sys
libsmbclient 的 FFI 包装器,是 SAMBA 实现的一部分。
用法
将此添加到您的 Cargo.toml
smbclient_sys = "0.1.0"
要访问 SMB 共享并读取文件
extern crate smbclient_sys as smbc;
extern crate libc;
use std::str;
use std::ffi::{CStr, CString};
use libc::{c_char, c_int, strncpy, O_RDONLY};
extern "C" fn auth_data(srv: *const c_char,
shr: *const c_char,
wg: *mut c_char,
wglen: c_int,
un: *mut c_char,
unlen: c_int,
pw: *mut c_char,
pwlen: c_int) {
unsafe {
strncpy(un, CString::new("vertexclique").unwrap().as_ptr(), 12);
strncpy(pw, CString::new("1234").unwrap().as_ptr(), 3);
}
}
pub static mut authCallback: smbc::smbc_get_auth_data_fn = Some(auth_data);
fn main() {
println!("Launch...");
unsafe {
let fname = CString::new("smb://air5650-nas/rechner/naber.txt").unwrap();
// Buffer for contents
let dstlen = 300;
let mut file_contents = Vec::with_capacity(dstlen as usize);
smbc::smbc_init(authCallback, 0);
let retval: i32 = smbc::smbc_open(fname.as_ptr(), O_RDONLY, 0);
if retval < 0 {
println!("Couldn't accessed to a SMB file");
} else {
println!("Accessed to specified SMB file");
// Read file to buffer
let read_val: i64 = smbc::smbc_read(retval, file_contents.as_mut_ptr(), dstlen);
if read_val > 0 {
// File successfully read, print contents to stdout
let c_str: &CStr = CStr::from_ptr(file_contents.as_mut_ptr() as *const i8);
let content_bytes: &[u8] = c_str.to_bytes();
let str_slice: &str = str::from_utf8(content_bytes).unwrap();
let str_buf: String = str_slice.to_owned();
println!("{0}", str_buf);
} else {
// Panic \o/ if you couldn't read
panic!("Couldn't read file over SMB share");
}
// Close it
smbc::smbc_close(read_val as i32);
}
}
}
有关更多信息,请参阅 examples
目录。
要求
libsmbclient
需要开发环境- 某些系统需要与 samba 软件包一起安装
udev
。(可选依赖项)
依赖项
~1.5MB
~35K SLoC