Browse Source

paths: Changed CREAT with a trailing slash to return NOTDIR

- before: lfs_file_open("missing/") => LFS_ERR_ISDIR
- after:  lfs_file_open("missing/") => LFS_ERR_NOTDIR

As noted by bmcdonnell-fb, returning LFS_ERR_ISDIR here was inconsistent
with the case where the file exists:

  case                           before          after
  lfs_file_open("dir_a")      => LFS_ERR_ISDIR   LFS_ERR_ISDIR
  lfs_file_open("dir_a/")     => LFS_ERR_ISDIR   LFS_ERR_ISDIR
  lfs_file_open("reg_a/")     => LFS_ERR_NOTDIR  LFS_ERR_NOTDIR
  lfs_file_open("missing_a/") => LFS_ERR_ISDIR   LFS_ERR_NOTDIR

Note this is consistent with the behavior of lfs_stat:

  lfs_file_open("reg_a/") => LFS_ERR_NOTDIR
  lfs_stat("reg_a/")      => LFS_ERR_NOTDIR

And the only other function that can "create" files, lfs_rename:

  lfs_file_open("missing_a/")       => LFS_ERR_NOTDIR
  lfs_rename("reg_a", "missing_a/") => LFS_ERR_NOTDIR

There is some ongoing discussion about if these should return NOTDIR,
ISDIR, or INVAL, but this is at least an improvement over the
rename/open mismatch.
Christopher Haster 1 year ago
parent
commit
999ef6656f
2 changed files with 19 additions and 19 deletions
  1. 1 1
      lfs.c
  2. 18 18
      tests/test_paths.toml

+ 1 - 1
lfs.c

@@ -3109,7 +3109,7 @@ static int lfs_file_opencfg_(lfs_t *lfs, lfs_file_t *file,
 
         // don't allow trailing slashes
         if (lfs_path_isdir(path)) {
-            err = LFS_ERR_ISDIR;
+            err = LFS_ERR_NOTDIR;
             goto cleanup;
         }
 

+ 18 - 18
tests/test_paths.toml

@@ -764,17 +764,17 @@ code = '''
     } else {
         lfs_file_t file;
         lfs_file_open(&lfs, &file, "coffee/drip/",
-                LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_ISDIR;
+                LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_NOTDIR;
         lfs_file_open(&lfs, &file, "coffee/coldbrew//",
-                LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_ISDIR;
+                LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_NOTDIR;
         lfs_file_open(&lfs, &file, "coffee/turkish///",
-                LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_ISDIR;
+                LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_NOTDIR;
         lfs_file_open(&lfs, &file, "coffee/tubruk////",
-                LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_ISDIR;
+                LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_NOTDIR;
         lfs_file_open(&lfs, &file, "coffee/vietnamese/////",
-                LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_ISDIR;
+                LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_NOTDIR;
         lfs_file_open(&lfs, &file, "coffee/thai//////",
-                LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_ISDIR;
+                LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_NOTDIR;
 
         // still create so we have something to test
         lfs_file_open(&lfs, &file, "coffee/drip",
@@ -3972,30 +3972,30 @@ code = '''
             LFS_O_RDONLY) => LFS_ERR_NOENT;
 
     lfs_file_open(&lfs, &file, "coffee/_rip/",
-            LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_ISDIR;
+            LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_NOTDIR;
     lfs_file_open(&lfs, &file, "coffee/c_ldbrew//",
-            LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_ISDIR;
+            LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_NOTDIR;
     lfs_file_open(&lfs, &file, "coffee/tu_kish///",
-            LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_ISDIR;
+            LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_NOTDIR;
     lfs_file_open(&lfs, &file, "coffee/tub_uk////",
-            LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_ISDIR;
+            LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_NOTDIR;
     lfs_file_open(&lfs, &file, "coffee/_vietnamese/////",
-            LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_ISDIR;
+            LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_NOTDIR;
     lfs_file_open(&lfs, &file, "coffee/thai_//////",
-            LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_ISDIR;
+            LFS_O_WRONLY | LFS_O_CREAT) => LFS_ERR_NOTDIR;
 
     lfs_file_open(&lfs, &file, "coffee/_rip/",
-            LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_ISDIR;
+            LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_NOTDIR;
     lfs_file_open(&lfs, &file, "coffee/c_ldbrew//",
-            LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_ISDIR;
+            LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_NOTDIR;
     lfs_file_open(&lfs, &file, "coffee/tu_kish///",
-            LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_ISDIR;
+            LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_NOTDIR;
     lfs_file_open(&lfs, &file, "coffee/tub_uk////",
-            LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_ISDIR;
+            LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_NOTDIR;
     lfs_file_open(&lfs, &file, "coffee/_vietnamese/////",
-            LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_ISDIR;
+            LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_NOTDIR;
     lfs_file_open(&lfs, &file, "coffee/thai_//////",
-            LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_ISDIR;
+            LFS_O_WRONLY | LFS_O_CREAT | LFS_O_EXCL) => LFS_ERR_NOTDIR;
 
     // dir open paths, only works on dirs!
     lfs_dir_t dir;