初版完成。等待调试
This commit is contained in:
parent
53d62dc0a9
commit
c05420a395
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -433,6 +433,7 @@ checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
|
||||||
name = "lws_vfs"
|
name = "lws_vfs"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"libc",
|
||||||
"prost",
|
"prost",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
|
|
@ -23,6 +23,7 @@ winapi = { version = "0.3", features = [
|
||||||
windows = "0.28"
|
windows = "0.28"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
|
libc = "0.2"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
tonic-build = "0.11"
|
tonic-build = "0.11"
|
||||||
|
|
9
config.json
Executable file
9
config.json
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"mount": {
|
||||||
|
"c:\\": "/l3c",
|
||||||
|
"d:\\": "/l0d",
|
||||||
|
"f:\\": "/l0e"
|
||||||
|
},
|
||||||
|
"port":7412,
|
||||||
|
"addr":"192.168.0.110"
|
||||||
|
}
|
|
@ -49,7 +49,7 @@ message HelloRequest { string name = 1; }
|
||||||
message HelloReply { string message = 1; }
|
message HelloReply { string message = 1; }
|
||||||
|
|
||||||
message file_info {
|
message file_info {
|
||||||
int32 flags = 1;
|
uint32 flags = 1;
|
||||||
uint32 fh_old = 2;
|
uint32 fh_old = 2;
|
||||||
bool direct_io = 3;
|
bool direct_io = 3;
|
||||||
uint64 fh = 10;
|
uint64 fh = 10;
|
||||||
|
@ -76,6 +76,7 @@ message fstat {
|
||||||
message getattr {
|
message getattr {
|
||||||
string path = 1;
|
string path = 1;
|
||||||
fstat stat = 2;
|
fstat stat = 2;
|
||||||
|
file_info fi = 3;
|
||||||
int32 ret = 15;
|
int32 ret = 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,9 +102,14 @@ message access {
|
||||||
int32 ret = 15;
|
int32 ret = 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message direntry {
|
||||||
|
string name = 1;
|
||||||
|
uint32 kind = 2;
|
||||||
|
}
|
||||||
|
|
||||||
message readdir {
|
message readdir {
|
||||||
string path = 1;
|
string path = 1;
|
||||||
repeated string dirs = 2;
|
repeated direntry dirs = 2;
|
||||||
uint32 offset = 3;
|
uint32 offset = 3;
|
||||||
file_info fi = 4;
|
file_info fi = 4;
|
||||||
int32 ret = 15;
|
int32 ret = 15;
|
||||||
|
@ -119,7 +125,7 @@ message read {
|
||||||
string path = 1;
|
string path = 1;
|
||||||
bytes buff = 2;
|
bytes buff = 2;
|
||||||
int64 size = 3;
|
int64 size = 3;
|
||||||
int64 offset = 4;
|
uint64 offset = 4;
|
||||||
file_info fi = 5;
|
file_info fi = 5;
|
||||||
int32 ret = 15;
|
int32 ret = 15;
|
||||||
}
|
}
|
||||||
|
@ -127,8 +133,8 @@ message read {
|
||||||
message write {
|
message write {
|
||||||
string path = 1;
|
string path = 1;
|
||||||
bytes buff = 2;
|
bytes buff = 2;
|
||||||
int64 size = 3;
|
uint64 size = 3;
|
||||||
int64 offset = 4;
|
uint64 offset = 4;
|
||||||
file_info fi = 5;
|
file_info fi = 5;
|
||||||
int32 ret = 15;
|
int32 ret = 15;
|
||||||
}
|
}
|
||||||
|
@ -159,6 +165,7 @@ message chown {
|
||||||
message release {
|
message release {
|
||||||
string path = 1;
|
string path = 1;
|
||||||
file_info fi = 2;
|
file_info fi = 2;
|
||||||
|
uint32 flush = 3;
|
||||||
int32 ret = 15;
|
int32 ret = 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,18 @@
|
||||||
use std::fs::{self, File, ReadDir};
|
use std::fs::{self, File, ReadDir, FileType};
|
||||||
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::io::{self, Seek as ioSeek, SeekFrom, Write};
|
use std::io::{self, Seek as ioSeek, SeekFrom, Write};
|
||||||
|
|
||||||
use crate::lws_vfs::{FileInfo, Fstat};
|
use crate::lws_vfs::{FileInfo, Fstat, Direntry};
|
||||||
|
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
extern crate winapi;
|
extern crate winapi;
|
||||||
use std::os::windows::fs::MetadataExt;
|
use std::os::windows::fs::{MetadataExt};
|
||||||
use std::os::windows::prelude::*;
|
use std::os::windows::prelude::*;
|
||||||
use winapi::um::winnt::FILE_ATTRIBUTE_READONLY;
|
use winapi::um::winnt::FILE_ATTRIBUTE_READONLY;
|
||||||
|
use libc;
|
||||||
|
|
||||||
fn from_metadata(sta: &mut Fstat, metadata: &fs::Metadata) -> Result<(), Box<dyn Error>> {
|
fn from_metadata(sta: &mut Fstat, metadata: &fs::Metadata) -> Result<(), Box<dyn Error>> {
|
||||||
sta.fst_size = metadata.len();
|
sta.fst_size = metadata.len();
|
||||||
|
@ -126,7 +127,9 @@ impl FSImpl {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn fopen(&self, path: &String, fi: &mut FileInfo) -> Result<i32, Box<dyn Error>> {
|
pub fn fopen(&self, path: &String, fi: &mut FileInfo) -> Result<i32, Box<dyn Error>> {
|
||||||
let f = fs::File::open(path)?;
|
let f = File::options()
|
||||||
|
.read(fi.flags & libc::O_RDONLY as u32 != 0)
|
||||||
|
.write(fi.flags & libc::O_WRONLY as u32 != 0).open(path)?;
|
||||||
let fd = self.file_fds.lock().unwrap().push(FileHandle::FILE(f))?;
|
let fd = self.file_fds.lock().unwrap().push(FileHandle::FILE(f))?;
|
||||||
fi.fh = fd;
|
fi.fh = fd;
|
||||||
return Ok(0);
|
return Ok(0);
|
||||||
|
@ -212,15 +215,26 @@ impl FSImpl {
|
||||||
*
|
*
|
||||||
* Introduced in version 2.3
|
* Introduced in version 2.3
|
||||||
*/
|
*/
|
||||||
pub fn freaddir(&self, path: &String, buffer: &mut Vec<String>, _size: usize, _offset: usize, fi: &mut FileInfo,
|
pub fn freaddir(&self, path: &String, buffer: &mut Vec<Direntry>, _size: usize, _offset: usize, fi: &mut FileInfo,
|
||||||
) -> Result<i32, Box<dyn Error>> {
|
) -> Result<i32, Box<dyn Error>> {
|
||||||
|
fn file_type(t: FileType) -> u32{
|
||||||
|
if t.is_dir() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if t.is_symlink() {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
let mut fh = self.file_fds.lock().unwrap();
|
let mut fh = self.file_fds.lock().unwrap();
|
||||||
let mut collect = move |entry:&mut ReadDir| -> Result<i32, Box<dyn Error>> {
|
let mut collect = move |entry:&mut ReadDir| -> Result<i32, Box<dyn Error>> {
|
||||||
loop {
|
loop {
|
||||||
match entry.next() {
|
match entry.next() {
|
||||||
Some(Ok(entry)) => {
|
Some(Ok(entry)) => {
|
||||||
let name = entry.file_name().into_string().unwrap();
|
buffer.push(Direntry {
|
||||||
buffer.push(name);
|
name: entry.file_name().into_string().unwrap(),
|
||||||
|
kind: file_type(entry.file_type().unwrap()),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
Some(Err(e)) => {
|
Some(Err(e)) => {
|
||||||
return Err(Box::new(e));
|
return Err(Box::new(e));
|
||||||
|
@ -289,8 +303,11 @@ impl FSImpl {
|
||||||
Err(Box::new(io::Error::last_os_error()))
|
Err(Box::new(io::Error::last_os_error()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn frelease(&self, _path: &String, fi: &mut FileInfo) -> Result<i32, Box<dyn Error>> {
|
pub fn frelease(&self, path: &String, fi: &mut FileInfo, flush:bool) -> Result<i32, Box<dyn Error>> {
|
||||||
if let Some(fh) = self.file_fds.lock().unwrap().pop(fi.fh) {
|
if let Some(fh) = self.file_fds.lock().unwrap().pop(fi.fh) {
|
||||||
|
if flush {
|
||||||
|
let _unused = self.fflush(path, fi);
|
||||||
|
}
|
||||||
drop(fh);
|
drop(fh);
|
||||||
Ok(0)
|
Ok(0)
|
||||||
} else {
|
} else {
|
||||||
|
@ -626,9 +643,9 @@ fn test_read_a_file_flow() {
|
||||||
assert_eq!(get_ret(ret), 0);
|
assert_eq!(get_ret(ret), 0);
|
||||||
assert_eq!(buffer, Vec::from("abcde"));
|
assert_eq!(buffer, Vec::from("abcde"));
|
||||||
|
|
||||||
let ret = fs.frelease(&path, &mut fi[0]);
|
let ret = fs.frelease(&path, &mut fi[0], false);
|
||||||
assert_eq!(get_ret(ret), 0);
|
assert_eq!(get_ret(ret), 0);
|
||||||
let ret = fs.frelease(&path, &mut fi[1]);
|
let ret = fs.frelease(&path, &mut fi[1], false);
|
||||||
assert_eq!(get_ret(ret), 0);
|
assert_eq!(get_ret(ret), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -638,7 +655,7 @@ fn test_read_a_dir_flow() {
|
||||||
let path = String::from("./src");
|
let path = String::from("./src");
|
||||||
let fs = FSImpl::new();
|
let fs = FSImpl::new();
|
||||||
let size = 0;
|
let size = 0;
|
||||||
let mut buffer: Vec<String> = vec![];
|
let mut buffer = vec![];
|
||||||
let offset = 0;
|
let offset = 0;
|
||||||
let mut fi = vec![FileInfo::default(), FileInfo::default()];
|
let mut fi = vec![FileInfo::default(), FileInfo::default()];
|
||||||
let get_ret = |ret: Result<i32, Box<dyn Error>> | match ret {
|
let get_ret = |ret: Result<i32, Box<dyn Error>> | match ret {
|
||||||
|
|
14
src/lib.rs
14
src/lib.rs
|
@ -17,7 +17,7 @@ pub mod lws_vfs {
|
||||||
}
|
}
|
||||||
|
|
||||||
// config
|
// config
|
||||||
//
|
|
||||||
// {
|
// {
|
||||||
// "mount": {
|
// "mount": {
|
||||||
// "c:\\": "/l3c",
|
// "c:\\": "/l3c",
|
||||||
|
@ -26,7 +26,7 @@ pub mod lws_vfs {
|
||||||
// },
|
// },
|
||||||
// "port":5001
|
// "port":5001
|
||||||
// }
|
// }
|
||||||
//
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
port: u16,
|
port: u16,
|
||||||
|
@ -84,6 +84,7 @@ impl LwsVfsIns {
|
||||||
}
|
}
|
||||||
fn lpath(&self, path: &String) -> String {
|
fn lpath(&self, path: &String) -> String {
|
||||||
let mut ret = String::new();
|
let mut ret = String::new();
|
||||||
|
// /l0e -> w:
|
||||||
for (k, v) in &self.config.mount_map {
|
for (k, v) in &self.config.mount_map {
|
||||||
if path.starts_with(v) {
|
if path.starts_with(v) {
|
||||||
ret = path.replace(v, k);
|
ret = path.replace(v, k);
|
||||||
|
@ -126,6 +127,7 @@ impl LwsVfs for LwsVfsIns {
|
||||||
path: path.to_string(),
|
path: path.to_string(),
|
||||||
stat: Some(fstat),
|
stat: Some(fstat),
|
||||||
ret,
|
ret,
|
||||||
|
..Getattr::default()
|
||||||
};
|
};
|
||||||
Ok(Response::new(reply))
|
Ok(Response::new(reply))
|
||||||
}
|
}
|
||||||
|
@ -167,7 +169,7 @@ impl LwsVfs for LwsVfsIns {
|
||||||
path: request.path,
|
path: request.path,
|
||||||
size: buff.len() as i64,
|
size: buff.len() as i64,
|
||||||
buff,
|
buff,
|
||||||
offset: offset as i64,
|
offset: offset as u64,
|
||||||
fi: Some(fi),
|
fi: Some(fi),
|
||||||
ret,
|
ret,
|
||||||
};
|
};
|
||||||
|
@ -203,7 +205,7 @@ impl LwsVfs for LwsVfsIns {
|
||||||
};
|
};
|
||||||
let reply = Write {
|
let reply = Write {
|
||||||
ret,
|
ret,
|
||||||
size: size as i64,
|
size: size as u64,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
Ok(Response::new(reply))
|
Ok(Response::new(reply))
|
||||||
|
@ -271,7 +273,7 @@ impl LwsVfs for LwsVfsIns {
|
||||||
let mut fi = request.fi.unwrap();
|
let mut fi = request.fi.unwrap();
|
||||||
let path = &self.lpath(&request.path);
|
let path = &self.lpath(&request.path);
|
||||||
let offset = request.offset as usize;
|
let offset = request.offset as usize;
|
||||||
let mut dirs: Vec<String> = Vec::new();
|
let mut dirs = vec![];
|
||||||
let size = 0;
|
let size = 0;
|
||||||
let ret = match self.fs.freaddir(path, &mut dirs, size, offset, &mut fi) {
|
let ret = match self.fs.freaddir(path, &mut dirs, size, offset, &mut fi) {
|
||||||
Ok(ret) => ret,
|
Ok(ret) => ret,
|
||||||
|
@ -363,7 +365,7 @@ impl LwsVfs for LwsVfsIns {
|
||||||
let request = request.into_inner();
|
let request = request.into_inner();
|
||||||
let path = &self.lpath(&request.path);
|
let path = &self.lpath(&request.path);
|
||||||
let mut fi = request.fi.unwrap();
|
let mut fi = request.fi.unwrap();
|
||||||
let ret = match self.fs.frelease(path, &mut fi) {
|
let ret = match self.fs.frelease(path, &mut fi, request.flush != 0) {
|
||||||
Ok(ret) => ret,
|
Ok(ret) => ret,
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
println!("Error: release file[{}]: {:?}", path, e);
|
println!("Error: release file[{}]: {:?}", path, e);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user