Generated v2 prefixes
This commit is contained in:
+280
-95
@@ -1,8 +1,11 @@
|
||||
[[case]] # root
|
||||
[cases.test_dirs_root]
|
||||
code = '''
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_t lfs2;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -14,20 +17,25 @@ code = '''
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
'''
|
||||
|
||||
[[case]] # many directory creation
|
||||
define.N = 'range(0, 100, 3)'
|
||||
[cases.test_dirs_many_creation]
|
||||
defines.N = 'range(3, 100, 3)'
|
||||
if = 'N < BLOCK_COUNT/2'
|
||||
code = '''
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_t lfs2;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "dir%03d", i);
|
||||
lfs2_mkdir(&lfs2, path) => 0;
|
||||
}
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -35,6 +43,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "dir%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -45,20 +54,25 @@ code = '''
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
'''
|
||||
|
||||
[[case]] # many directory removal
|
||||
define.N = 'range(3, 100, 11)'
|
||||
[cases.test_dirs_many_removal]
|
||||
defines.N = 'range(3, 100, 11)'
|
||||
if = 'N < BLOCK_COUNT/2'
|
||||
code = '''
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_t lfs2;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "removeme%03d", i);
|
||||
lfs2_mkdir(&lfs2, path) => 0;
|
||||
}
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -66,6 +80,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "removeme%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -75,14 +90,15 @@ code = '''
|
||||
lfs2_dir_close(&lfs2, &dir) => 0;
|
||||
lfs2_unmount(&lfs2);
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "removeme%03d", i);
|
||||
lfs2_remove(&lfs2, path) => 0;
|
||||
}
|
||||
lfs2_unmount(&lfs2);
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -95,20 +111,25 @@ code = '''
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
'''
|
||||
|
||||
[[case]] # many directory rename
|
||||
define.N = 'range(3, 100, 11)'
|
||||
[cases.test_dirs_many_rename]
|
||||
defines.N = 'range(3, 100, 11)'
|
||||
if = 'N < BLOCK_COUNT/2'
|
||||
code = '''
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_t lfs2;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "test%03d", i);
|
||||
lfs2_mkdir(&lfs2, path) => 0;
|
||||
}
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -116,6 +137,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "test%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -125,7 +147,7 @@ code = '''
|
||||
lfs2_dir_close(&lfs2, &dir) => 0;
|
||||
lfs2_unmount(&lfs2);
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
char oldpath[128];
|
||||
char newpath[128];
|
||||
@@ -135,7 +157,7 @@ code = '''
|
||||
}
|
||||
lfs2_unmount(&lfs2);
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -144,6 +166,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "tedd%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -154,29 +177,35 @@ code = '''
|
||||
lfs2_unmount(&lfs2);
|
||||
'''
|
||||
|
||||
[[case]] # reentrant many directory creation/rename/removal
|
||||
define.N = [5, 11]
|
||||
[cases.test_dirs_many_reentrant]
|
||||
defines.N = [5, 11]
|
||||
if = 'BLOCK_COUNT >= 4*N'
|
||||
reentrant = true
|
||||
code = '''
|
||||
err = lfs2_mount(&lfs2, &cfg);
|
||||
lfs2_t lfs2;
|
||||
int err = lfs2_mount(&lfs2, cfg);
|
||||
if (err) {
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
}
|
||||
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hi%03d", i);
|
||||
err = lfs2_mkdir(&lfs2, path);
|
||||
assert(err == 0 || err == LFS2_ERR_EXIST);
|
||||
}
|
||||
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hello%03d", i);
|
||||
err = lfs2_remove(&lfs2, path);
|
||||
assert(err == 0 || err == LFS2_ERR_NOENT);
|
||||
}
|
||||
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -184,6 +213,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hi%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -209,6 +239,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hello%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -218,6 +249,7 @@ code = '''
|
||||
lfs2_dir_close(&lfs2, &dir) => 0;
|
||||
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hello%03d", i);
|
||||
lfs2_remove(&lfs2, path) => 0;
|
||||
}
|
||||
@@ -234,22 +266,28 @@ code = '''
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
'''
|
||||
|
||||
[[case]] # file creation
|
||||
define.N = 'range(3, 100, 11)'
|
||||
[cases.test_dirs_file_creation]
|
||||
defines.N = 'range(3, 100, 11)'
|
||||
if = 'N < BLOCK_COUNT/2'
|
||||
code = '''
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_t lfs2;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "file%03d", i);
|
||||
lfs2_file_t file;
|
||||
lfs2_file_open(&lfs2, &file, path,
|
||||
LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => 0;
|
||||
lfs2_file_close(&lfs2, &file) => 0;
|
||||
}
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -257,6 +295,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "file%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_REG);
|
||||
@@ -267,22 +306,28 @@ code = '''
|
||||
lfs2_unmount(&lfs2);
|
||||
'''
|
||||
|
||||
[[case]] # file removal
|
||||
define.N = 'range(0, 100, 3)'
|
||||
[cases.test_dirs_file_removal]
|
||||
defines.N = 'range(3, 100, 11)'
|
||||
if = 'N < BLOCK_COUNT/2'
|
||||
code = '''
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_t lfs2;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "removeme%03d", i);
|
||||
lfs2_file_t file;
|
||||
lfs2_file_open(&lfs2, &file, path,
|
||||
LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => 0;
|
||||
lfs2_file_close(&lfs2, &file) => 0;
|
||||
}
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -290,6 +335,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "removeme%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_REG);
|
||||
@@ -299,14 +345,15 @@ code = '''
|
||||
lfs2_dir_close(&lfs2, &dir) => 0;
|
||||
lfs2_unmount(&lfs2);
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "removeme%03d", i);
|
||||
lfs2_remove(&lfs2, path) => 0;
|
||||
}
|
||||
lfs2_unmount(&lfs2);
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -319,22 +366,28 @@ code = '''
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
'''
|
||||
|
||||
[[case]] # file rename
|
||||
define.N = 'range(0, 100, 3)'
|
||||
[cases.test_dirs_file_rename]
|
||||
defines.N = 'range(3, 100, 11)'
|
||||
if = 'N < BLOCK_COUNT/2'
|
||||
code = '''
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_t lfs2;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "test%03d", i);
|
||||
lfs2_file_t file;
|
||||
lfs2_file_open(&lfs2, &file, path,
|
||||
LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => 0;
|
||||
lfs2_file_close(&lfs2, &file) => 0;
|
||||
}
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -342,6 +395,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "test%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_REG);
|
||||
@@ -351,7 +405,7 @@ code = '''
|
||||
lfs2_dir_close(&lfs2, &dir) => 0;
|
||||
lfs2_unmount(&lfs2);
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
char oldpath[128];
|
||||
char newpath[128];
|
||||
@@ -361,7 +415,7 @@ code = '''
|
||||
}
|
||||
lfs2_unmount(&lfs2);
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -370,6 +424,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "tedd%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_REG);
|
||||
@@ -380,29 +435,36 @@ code = '''
|
||||
lfs2_unmount(&lfs2);
|
||||
'''
|
||||
|
||||
[[case]] # reentrant file creation/rename/removal
|
||||
define.N = [5, 25]
|
||||
[cases.test_dirs_file_reentrant]
|
||||
defines.N = [5, 25]
|
||||
if = 'N < BLOCK_COUNT/2'
|
||||
reentrant = true
|
||||
code = '''
|
||||
err = lfs2_mount(&lfs2, &cfg);
|
||||
lfs2_t lfs2;
|
||||
int err = lfs2_mount(&lfs2, cfg);
|
||||
if (err) {
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
}
|
||||
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hi%03d", i);
|
||||
lfs2_file_t file;
|
||||
lfs2_file_open(&lfs2, &file, path, LFS2_O_CREAT | LFS2_O_WRONLY) => 0;
|
||||
lfs2_file_close(&lfs2, &file) => 0;
|
||||
}
|
||||
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hello%03d", i);
|
||||
err = lfs2_remove(&lfs2, path);
|
||||
assert(err == 0 || err == LFS2_ERR_NOENT);
|
||||
}
|
||||
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -410,6 +472,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hi%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_REG);
|
||||
@@ -435,6 +498,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hello%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_REG);
|
||||
@@ -444,6 +508,7 @@ code = '''
|
||||
lfs2_dir_close(&lfs2, &dir) => 0;
|
||||
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hello%03d", i);
|
||||
lfs2_remove(&lfs2, path) => 0;
|
||||
}
|
||||
@@ -460,24 +525,28 @@ code = '''
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
'''
|
||||
|
||||
[[case]] # nested directories
|
||||
[cases.test_dirs_nested]
|
||||
code = '''
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_t lfs2;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_mkdir(&lfs2, "potato") => 0;
|
||||
lfs2_file_t file;
|
||||
lfs2_file_open(&lfs2, &file, "burito",
|
||||
LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => 0;
|
||||
lfs2_file_close(&lfs2, &file) => 0;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_mkdir(&lfs2, "potato/baked") => 0;
|
||||
lfs2_mkdir(&lfs2, "potato/sweet") => 0;
|
||||
lfs2_mkdir(&lfs2, "potato/fried") => 0;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "potato") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
info.type => LFS2_TYPE_DIR;
|
||||
@@ -498,21 +567,21 @@ code = '''
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
// try removing?
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_remove(&lfs2, "potato") => LFS2_ERR_NOTEMPTY;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
// try renaming?
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_rename(&lfs2, "potato", "coldpotato") => 0;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_rename(&lfs2, "coldpotato", "warmpotato") => 0;
|
||||
lfs2_rename(&lfs2, "warmpotato", "hotpotato") => 0;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_remove(&lfs2, "potato") => LFS2_ERR_NOENT;
|
||||
lfs2_remove(&lfs2, "coldpotato") => LFS2_ERR_NOENT;
|
||||
lfs2_remove(&lfs2, "warmpotato") => LFS2_ERR_NOENT;
|
||||
@@ -520,7 +589,7 @@ code = '''
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
// try cross-directory renaming
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_mkdir(&lfs2, "coldpotato") => 0;
|
||||
lfs2_rename(&lfs2, "hotpotato/baked", "coldpotato/baked") => 0;
|
||||
lfs2_rename(&lfs2, "coldpotato", "hotpotato") => LFS2_ERR_NOTEMPTY;
|
||||
@@ -536,7 +605,7 @@ code = '''
|
||||
lfs2_remove(&lfs2, "hotpotato") => LFS2_ERR_NOTEMPTY;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_open(&lfs2, &dir, "hotpotato") => 0;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -558,7 +627,7 @@ code = '''
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
// final remove
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_remove(&lfs2, "hotpotato") => LFS2_ERR_NOTEMPTY;
|
||||
lfs2_remove(&lfs2, "hotpotato/baked") => 0;
|
||||
lfs2_remove(&lfs2, "hotpotato") => LFS2_ERR_NOTEMPTY;
|
||||
@@ -568,7 +637,7 @@ code = '''
|
||||
lfs2_remove(&lfs2, "hotpotato") => 0;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -584,17 +653,22 @@ code = '''
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
'''
|
||||
|
||||
[[case]] # recursive remove
|
||||
define.N = [10, 100]
|
||||
[cases.test_dirs_recursive_remove]
|
||||
defines.N = [10, 100]
|
||||
if = 'N < BLOCK_COUNT/2'
|
||||
code = '''
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_t lfs2;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_mkdir(&lfs2, "prickly-pear") => 0;
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "prickly-pear/cactus%03d", i);
|
||||
lfs2_mkdir(&lfs2, path) => 0;
|
||||
}
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "prickly-pear") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -602,6 +676,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "cactus%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -611,7 +686,7 @@ code = '''
|
||||
lfs2_dir_close(&lfs2, &dir) => 0;
|
||||
lfs2_unmount(&lfs2);
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_remove(&lfs2, "prickly-pear") => LFS2_ERR_NOTEMPTY;
|
||||
|
||||
lfs2_dir_open(&lfs2, &dir, "prickly-pear") => 0;
|
||||
@@ -622,6 +697,7 @@ code = '''
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
for (int i = 0; i < N; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "cactus%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -636,22 +712,24 @@ code = '''
|
||||
lfs2_remove(&lfs2, "prickly-pear") => LFS2_ERR_NOENT;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_remove(&lfs2, "prickly-pear") => LFS2_ERR_NOENT;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
'''
|
||||
|
||||
[[case]] # other error cases
|
||||
[cases.test_dirs_other_errors]
|
||||
code = '''
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_t lfs2;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_mkdir(&lfs2, "potato") => 0;
|
||||
lfs2_file_t file;
|
||||
lfs2_file_open(&lfs2, &file, "burito",
|
||||
LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => 0;
|
||||
lfs2_file_close(&lfs2, &file) => 0;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
|
||||
lfs2_mkdir(&lfs2, "potato") => LFS2_ERR_EXIST;
|
||||
lfs2_mkdir(&lfs2, "burito") => LFS2_ERR_EXIST;
|
||||
@@ -659,6 +737,7 @@ code = '''
|
||||
LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => LFS2_ERR_EXIST;
|
||||
lfs2_file_open(&lfs2, &file, "potato",
|
||||
LFS2_O_WRONLY | LFS2_O_CREAT | LFS2_O_EXCL) => LFS2_ERR_EXIST;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "tomato") => LFS2_ERR_NOENT;
|
||||
lfs2_dir_open(&lfs2, &dir, "burito") => LFS2_ERR_NOTDIR;
|
||||
lfs2_file_open(&lfs2, &file, "tomato", LFS2_O_RDONLY) => LFS2_ERR_NOENT;
|
||||
@@ -678,6 +757,7 @@ code = '''
|
||||
|
||||
// check that errors did not corrupt directory
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
@@ -696,7 +776,7 @@ code = '''
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
// or on disk
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -715,21 +795,27 @@ code = '''
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
'''
|
||||
|
||||
[[case]] # directory seek
|
||||
define.COUNT = [4, 128, 132]
|
||||
[cases.test_dirs_seek]
|
||||
defines.COUNT = [4, 128, 132]
|
||||
if = 'COUNT < BLOCK_COUNT/2'
|
||||
code = '''
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_t lfs2;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_mkdir(&lfs2, "hello") => 0;
|
||||
for (int i = 0; i < COUNT; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hello/kitty%03d", i);
|
||||
lfs2_mkdir(&lfs2, path) => 0;
|
||||
}
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
for (int j = 2; j < COUNT; j++) {
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
// try seeking to each dir entry
|
||||
for (int j = 0; j < COUNT; j++) {
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "hello") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -737,24 +823,25 @@ code = '''
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
|
||||
lfs2_soff_t pos;
|
||||
for (int i = 0; i < j; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "kitty%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, path) == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
pos = lfs2_dir_tell(&lfs2, &dir);
|
||||
assert(pos >= 0);
|
||||
}
|
||||
lfs2_soff_t pos = lfs2_dir_tell(&lfs2, &dir);
|
||||
assert(pos >= 0);
|
||||
|
||||
lfs2_dir_seek(&lfs2, &dir, pos) => 0;
|
||||
char path[1024];
|
||||
sprintf(path, "kitty%03d", j);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, path) == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
|
||||
lfs2_dir_rewind(&lfs2, &dir) => 0;
|
||||
sprintf(path, "kitty%03d", 0);
|
||||
sprintf(path, "kitty%03u", 0);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -774,22 +861,73 @@ code = '''
|
||||
lfs2_dir_close(&lfs2, &dir) => 0;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
}
|
||||
|
||||
// try seeking to end of dir
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "hello") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
|
||||
for (int i = 0; i < COUNT; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "kitty%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, path) == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
}
|
||||
lfs2_soff_t pos = lfs2_dir_tell(&lfs2, &dir);
|
||||
assert(pos >= 0);
|
||||
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 0;
|
||||
|
||||
lfs2_dir_seek(&lfs2, &dir, pos) => 0;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 0;
|
||||
|
||||
lfs2_dir_rewind(&lfs2, &dir) => 0;
|
||||
char path[1024];
|
||||
sprintf(path, "kitty%03d", 0);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, path) == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
|
||||
lfs2_dir_seek(&lfs2, &dir, pos) => 0;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 0;
|
||||
|
||||
lfs2_dir_close(&lfs2, &dir) => 0;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
'''
|
||||
|
||||
[[case]] # root seek
|
||||
define.COUNT = [4, 128, 132]
|
||||
[cases.test_dirs_toot_seek]
|
||||
defines.COUNT = [4, 128, 132]
|
||||
if = 'COUNT < BLOCK_COUNT/2'
|
||||
code = '''
|
||||
lfs2_format(&lfs2, &cfg) => 0;
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
lfs2_t lfs2;
|
||||
lfs2_format(&lfs2, cfg) => 0;
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
for (int i = 0; i < COUNT; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hi%03d", i);
|
||||
lfs2_mkdir(&lfs2, path) => 0;
|
||||
}
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
|
||||
for (int j = 2; j < COUNT; j++) {
|
||||
lfs2_mount(&lfs2, &cfg) => 0;
|
||||
for (int j = 0; j < COUNT; j++) {
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -797,24 +935,25 @@ code = '''
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
|
||||
lfs2_soff_t pos;
|
||||
for (int i = 0; i < j; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hi%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, path) == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
pos = lfs2_dir_tell(&lfs2, &dir);
|
||||
assert(pos >= 0);
|
||||
}
|
||||
lfs2_soff_t pos = lfs2_dir_tell(&lfs2, &dir);
|
||||
assert(pos >= 0);
|
||||
|
||||
lfs2_dir_seek(&lfs2, &dir, pos) => 0;
|
||||
char path[1024];
|
||||
sprintf(path, "hi%03d", j);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, path) == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
|
||||
lfs2_dir_rewind(&lfs2, &dir) => 0;
|
||||
sprintf(path, "hi%03d", 0);
|
||||
sprintf(path, "hi%03u", 0);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
@@ -834,5 +973,51 @@ code = '''
|
||||
lfs2_dir_close(&lfs2, &dir) => 0;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
}
|
||||
|
||||
// try seeking to end of dir
|
||||
lfs2_mount(&lfs2, cfg) => 0;
|
||||
lfs2_dir_t dir;
|
||||
lfs2_dir_open(&lfs2, &dir, "/") => 0;
|
||||
struct lfs2_info info;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
|
||||
for (int i = 0; i < COUNT; i++) {
|
||||
char path[1024];
|
||||
sprintf(path, "hi%03d", i);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, path) == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
}
|
||||
lfs2_soff_t pos = lfs2_dir_tell(&lfs2, &dir);
|
||||
assert(pos >= 0);
|
||||
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 0;
|
||||
|
||||
lfs2_dir_seek(&lfs2, &dir, pos) => 0;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 0;
|
||||
|
||||
lfs2_dir_rewind(&lfs2, &dir) => 0;
|
||||
char path[1024];
|
||||
sprintf(path, "hi%03d", 0);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, ".") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, "..") == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 1;
|
||||
assert(strcmp(info.name, path) == 0);
|
||||
assert(info.type == LFS2_TYPE_DIR);
|
||||
|
||||
lfs2_dir_seek(&lfs2, &dir, pos) => 0;
|
||||
lfs2_dir_read(&lfs2, &dir, &info) => 0;
|
||||
|
||||
lfs2_dir_close(&lfs2, &dir) => 0;
|
||||
lfs2_unmount(&lfs2) => 0;
|
||||
'''
|
||||
|
||||
|
||||
Reference in New Issue
Block a user