- # fix $ cd myfile/anotherfile # it should return "cd: myfile/anotherfile: Not a directory"
- diff --git a/daemon/open.c b/daemon/open.c
- index 1996e98..8f9fcfe 100644
- --- a/daemon/open.c
- +++ b/daemon/open.c
- @@ -903,7 +903,8 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
- if (args->create_opts & FILE_NON_DIRECTORY_FILE) {
- DPRINTF(1, ("trying to open directory '%s' as a file\n",
- state->path.path));
- - status = ERROR_DIRECTORY;
- + /* Note: SMB returns |STATUS_FILE_IS_A_DIRECTORY| */
- + status = ERROR_DIRECTORY_NOT_SUPPORTED;
- goto out_free_state;
- }
- } else if (info.type == NF4REG) {
- @@ -911,7 +912,11 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
- if (args->create_opts & FILE_DIRECTORY_FILE) {
- DPRINTF(1, ("trying to open file '%s' as a directory\n",
- state->path.path));
- - status = ERROR_BAD_FILE_TYPE;
- + /*
- + * Note: SMB returns |STATUS_OBJECT_TYPE_MISMATCH|
- + * while NTFS returns |STATUS_NOT_A_DIRECTORY|
- + */
- + status = ERROR_DIRECTORY;
- goto out_free_state;
- }
- } else if (info.type == NF4LNK) {
- diff --git a/daemon/util.c b/daemon/util.c
- index bb5bc88..a9ddbd4 100644
- --- a/daemon/util.c
- +++ b/daemon/util.c
- @@ -1,5 +1,6 @@
- /* NFSv4.1 client for Windows
- - * Copyright (C) 2012 The Regents of the University of Michigan
- + * Copyright (C) 2012 The Regents of the University of Michigan
- + * Copyright (C) 2023-2025 Roland Mainz <roland.mainz@nrubsig.org>
- *
- * Olga Kornievskaia <aglo@umich.edu>
- * Casey Bodley <cbodley@umich.edu>
- @@ -198,7 +199,7 @@ int nfs_to_windows_error(int status, int default_error)
- case NFS4ERR_MLINK: return ERROR_TOO_MANY_LINKS;
- case NFS4ERR_NAMETOOLONG: return ERROR_FILENAME_EXCED_RANGE;
- case NFS4ERR_STALE: return ERROR_NETNAME_DELETED;
- - case NFS4ERR_NOTEMPTY: return ERROR_NOT_EMPTY;
- + case NFS4ERR_NOTEMPTY: return ERROR_DIR_NOT_EMPTY;
- case NFS4ERR_DENIED: return ERROR_LOCK_FAILED;
- case NFS4ERR_NOTSUPP: return ERROR_NOT_SUPPORTED;
- case NFS4ERR_TOOSMALL: return ERROR_BUFFER_OVERFLOW;
- @@ -213,9 +214,22 @@ int nfs_to_windows_error(int status, int default_error)
- case NFS4ERR_BADCHAR:
- case NFS4ERR_BADNAME: return ERROR_INVALID_NAME;
- - case NFS4ERR_NOTDIR:
- - case NFS4ERR_ISDIR:
- - case NFS4ERR_SYMLINK:
- + /*
- + * |NFS4ERR_NOTDIR| - The current (or saved) filehandle
- + * designates an object that is not a directory for an operation
- + * in which a directory is required.
- + * |ERROR_DIRECTORY| - The directory name is invalid.
- + */
- + case NFS4ERR_NOTDIR: return ERROR_DIRECTORY;
- + /*
- + * |NFS4ERR_ISDIR| - The current or saved filehandle designates
- + * a directory when the current operation does not allow a
- + * directory to be accepted as the target of this operation.
- + * |ERROR_DIRECTORY_NOT_SUPPORTED| - An operation is not supported
- + * on a directory.
- + */
- + case NFS4ERR_ISDIR: return ERROR_DIRECTORY_NOT_SUPPORTED;
- + case NFS4ERR_SYMLINK: return ERROR_INVALID_PARAMETER;
- case NFS4ERR_WRONG_TYPE: return ERROR_INVALID_PARAMETER;
- case NFS4ERR_EXPIRED:
- @@ -241,7 +255,7 @@ int map_symlink_errors(int status)
- case NFS4ERR_BADNAME: return ERROR_INVALID_REPARSE_DATA;
- case NFS4ERR_WRONG_TYPE: return ERROR_NOT_A_REPARSE_POINT;
- case NFS4ERR_ACCESS: return ERROR_ACCESS_DENIED;
- - case NFS4ERR_NOTEMPTY: return ERROR_NOT_EMPTY;
- + case NFS4ERR_NOTEMPTY: return ERROR_DIR_NOT_EMPTY;
- default: return nfs_to_windows_error(status, ERROR_BAD_NET_RESP);
- }
- }
- diff --git a/sys/nfs41sys_fileinfo.c b/sys/nfs41sys_fileinfo.c
- index 4c7dceb..e5bd1a0 100644
- --- a/sys/nfs41sys_fileinfo.c
- +++ b/sys/nfs41sys_fileinfo.c
- @@ -511,7 +511,7 @@ NTSTATUS map_setfile_error(
- {
- switch (error) {
- case NO_ERROR: return STATUS_SUCCESS;
- - case ERROR_NOT_EMPTY: return STATUS_DIRECTORY_NOT_EMPTY;
- + case ERROR_DIR_NOT_EMPTY: return STATUS_DIRECTORY_NOT_EMPTY;
- case ERROR_FILE_EXISTS: return STATUS_OBJECT_NAME_COLLISION;
- case ERROR_FILE_NOT_FOUND: return STATUS_OBJECT_NAME_NOT_FOUND;
- case ERROR_PATH_NOT_FOUND: return STATUS_OBJECT_PATH_NOT_FOUND;
- diff --git a/sys/nfs41sys_openclose.c b/sys/nfs41sys_openclose.c
- index d0cc36f..1c11dd6 100644
- --- a/sys/nfs41sys_openclose.c
- +++ b/sys/nfs41sys_openclose.c
- @@ -408,12 +408,15 @@ NTSTATUS map_open_errors(
- case ERROR_SHARING_VIOLATION: return STATUS_SHARING_VIOLATION;
- case ERROR_REPARSE: return STATUS_REPARSE;
- case ERROR_TOO_MANY_LINKS: return STATUS_TOO_MANY_LINKS;
- - case ERROR_DIRECTORY: return STATUS_FILE_IS_A_DIRECTORY;
- - case ERROR_BAD_FILE_TYPE: return STATUS_NOT_A_DIRECTORY;
- + case ERROR_INVALID_PARAMETER: return STATUS_INVALID_PARAMETER;
- + case ERROR_DIRECTORY: return STATUS_NOT_A_DIRECTORY;
- + case ERROR_DIRECTORY_NOT_SUPPORTED: return STATUS_FILE_IS_A_DIRECTORY;
- + case ERROR_BAD_FILE_TYPE: return STATUS_BAD_FILE_TYPE;
- case ERROR_DISK_FULL: return STATUS_DISK_FULL;
- case ERROR_DISK_QUOTA_EXCEEDED: return STATUS_DISK_QUOTA_EXCEEDED;
- case ERROR_FILE_TOO_LARGE: return STATUS_FILE_TOO_LARGE;
- case ERROR_INTERNAL_ERROR: return STATUS_INTERNAL_ERROR;
- + case ERROR_DIR_NOT_EMPTY: return STATUS_DIRECTORY_NOT_EMPTY;
- default:
- print_error("[ERROR] nfs41_Create: upcall returned ERROR_0x%lx "
- "returning STATUS_INSUFFICIENT_RESOURCES\n",
- @@ -1100,7 +1103,7 @@ NTSTATUS map_close_errors(
- case NO_ERROR: return STATUS_SUCCESS;
- case ERROR_FILE_NOT_FOUND: return STATUS_NO_SUCH_FILE;
- case ERROR_NETNAME_DELETED: return STATUS_NETWORK_NAME_DELETED;
- - case ERROR_NOT_EMPTY: return STATUS_DIRECTORY_NOT_EMPTY;
- + case ERROR_DIR_NOT_EMPTY: return STATUS_DIRECTORY_NOT_EMPTY;
- case ERROR_FILE_INVALID: return STATUS_FILE_INVALID;
- case ERROR_DISK_FULL: return STATUS_DISK_FULL;
- case ERROR_DISK_QUOTA_EXCEEDED: return STATUS_DISK_QUOTA_EXCEEDED;
- diff --git a/sys/nfs41sys_symlink.c b/sys/nfs41sys_symlink.c
- index ead2e96..fffcde7 100644
- --- a/sys/nfs41sys_symlink.c
- +++ b/sys/nfs41sys_symlink.c
- @@ -148,7 +148,7 @@ NTSTATUS map_symlink_errors(
- case ERROR_INVALID_REPARSE_DATA: return STATUS_IO_REPARSE_DATA_INVALID;
- case ERROR_NOT_A_REPARSE_POINT: return STATUS_NOT_A_REPARSE_POINT;
- case ERROR_ACCESS_DENIED: return STATUS_ACCESS_DENIED;
- - case ERROR_NOT_EMPTY: return STATUS_DIRECTORY_NOT_EMPTY;
- + case ERROR_DIR_NOT_EMPTY: return STATUS_DIRECTORY_NOT_EMPTY;
- case ERROR_OUTOFMEMORY: return STATUS_INSUFFICIENT_RESOURCES;
- case ERROR_INSUFFICIENT_BUFFER: return STATUS_BUFFER_TOO_SMALL;
- case STATUS_BUFFER_TOO_SMALL:
Prototype fix for "cd: myfile/anotherfile: Not a directory"
Posted by Anonymous on Tue 22nd Apr 2025 19:42
raw | new post
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.