forked from rust-lang/rust
    
        
        - 
                Notifications
    You must be signed in to change notification settings 
- Fork 38
Closed
Description
Given is the following test code, built on a CMake setup (with some details omitted):
# Cargo.toml
...
[dependencies]
c_str_macro = "1"// main.rs
use std::os::raw::c_char;
use std::ffi::CStr;
use c_str_macro::c_str;
#[repr(C)]
pub struct esp_vfs_spiffs_conf_t {
    pub base_path: *const c_char,
    pub partition_label: *const c_char,
    pub max_files: usize,
    pub format_if_mount_failed: bool,
}
extern "C" {
    pub fn esp_vfs_spiffs_register(conf: *const esp_vfs_spiffs_conf_t) -> i32;
}
fn init_partition(path: &CStr, label: &CStr, max_files: usize) {
    let storage_conf = esp_vfs_spiffs_conf_t {
        base_path: path.as_ptr(),
        partition_label: label.as_ptr(),
        max_files,
        format_if_mount_failed: true,
    };
    unsafe { esp_vfs_spiffs_register(&storage_conf) };
}
fn test() {
    let path = std::path::Path::new("/storage/foobar");
    if let Err(err) = std::fs::File::create(path) {
        println!("Failed to create file: {err}");
        return;
    }
    match std::fs::read_dir("/storage") {
        Ok(dir) => {
            for entry in dir {
                println!("{entry:?}");
            }
        }
        Err(err) => println!("Failed to read root: {err}"),
    }
    if let Err(err) = std::fs::remove_file(path) {
        println!("Failed to remove file: {err}");
    }
}
#[no_mangle]
pub extern "C" fn app_main() {
    init_partition(c_str!("/storage"), c_str!("storage"), 3);
    test();
}I expect the following output:
Ok(DirEntry("/storage/foobar"))
Instead, the output I get is the following:
Ok(DirEntry("/storage/"))
Err(Os { code: 5, kind: Uncategorized, message: "I/O error" })
The OS error is unrelated (SPIFFS seems to indicate the end of folder iteration by returning a value that gets turned into EIO), but note that the path in the DirEntry has an empty filename.
This issue is present on:
| rustc verion | esp-idf 4.4.1 | 
|---|---|
| Rustc 1.60.0.0 | x | 
| Rustc 1.59.0.1 | x | 
| Rustc 1.59.0.0 | not affected | 
leelists
Metadata
Metadata
Assignees
Labels
No labels