Some POSIX functions (e.g. open, unlink, opendir, mkdir) requires setting errno to ENOTDIR rather than ENOENT when "a component of the path prefix names an existing file that is neither a directory nor a symbolic link to a directory". They are implemented by function _FAT_directory_entryFromPath in libfat, which does not provide right information to distinguish the accurate errors:
if (found && !(entry->entryData[DIR_ENTRY_attributes] & ATTRIB_DIR) && (nextPathPosition != NULL)) {
// Make sure that we aren't trying to follow a file instead of a directory in the path
found = false;
}
Note that the implementation like _FAT_open_r is not sufficient, because it only tests the last component (not prefix) of the path:
if (!_FAT_directory_entryFromPath (partition, &dirEntry, path, pathEnd) ||
!_FAT_directory_isDirectory(&dirEntry)) {
_FAT_unlock(&partition->lock);
r->_errno = ENOTDIR;
return -1;
}
Some POSIX functions (e.g.
open,unlink,opendir,mkdir) requires settingerrnotoENOTDIRrather thanENOENTwhen "a component of the path prefix names an existing file that is neither a directory nor a symbolic link to a directory". They are implemented by function_FAT_directory_entryFromPathin libfat, which does not provide right information to distinguish the accurate errors:Note that the implementation like
_FAT_open_ris not sufficient, because it only tests the last component (not prefix) of the path: