From 04ec469c72c6a220108312cdec3d30081cfe938a Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Wed, 16 Jan 2002 21:27:57 +0000 Subject: Fixup error mapping so we have only one table containing errno -> dos error -> NT STATUS maps. Fixes problem with disk full returning incorrect error. Jeremy. (This used to be commit 16fcbf3c1ccf1d704765653f68395dd596c0d841) --- source3/include/smb.h | 7 ++++++ source3/lib/error.c | 54 +++++++++++++++++++++++------------------------ source3/libsmb/errormap.c | 1 + source3/smbd/error.c | 52 ++++++++++++--------------------------------- 4 files changed, 48 insertions(+), 66 deletions(-) diff --git a/source3/include/smb.h b/source3/include/smb.h index cfb5d5f5e1..bbc2d597ac 100644 --- a/source3/include/smb.h +++ b/source3/include/smb.h @@ -1631,6 +1631,13 @@ typedef struct user_struct } user_struct; +struct unix_error_map { + int unix_error; + int dos_class; + int dos_code; + NTSTATUS nt_error; +}; + #include "ntdomain.h" #include "client.h" diff --git a/source3/lib/error.c b/source3/lib/error.c index cb2fffb962..df177bcea0 100644 --- a/source3/lib/error.c +++ b/source3/lib/error.c @@ -23,53 +23,51 @@ /* Mapping between Unix, DOS and NT error numbers */ -struct { - int unix_error; - int dos_error; - NTSTATUS nt_error; -} unix_dos_nt_errmap[] = { - { EPERM, ERRnoaccess, NT_STATUS_ACCESS_DENIED }, - { EACCES, ERRnoaccess, NT_STATUS_ACCESS_DENIED }, - { ENOENT, ERRbadfile, NT_STATUS_NO_SUCH_FILE }, - { ENOTDIR, ERRbadpath, NT_STATUS_NOT_A_DIRECTORY }, - { EIO, ERRgeneral, NT_STATUS_IO_DEVICE_ERROR }, - { EBADF, ERRsrverror, NT_STATUS_INVALID_HANDLE }, - { EINVAL, ERRsrverror, NT_STATUS_INVALID_HANDLE }, - { EEXIST, ERRfilexists, NT_STATUS_ACCESS_DENIED}, - { ENFILE, ERRnofids, NT_STATUS_TOO_MANY_OPENED_FILES }, - { EMFILE, ERRnofids, NT_STATUS_TOO_MANY_OPENED_FILES }, - { ENOSPC, ERRdiskfull, NT_STATUS_DISK_FULL }, +struct unix_error_map unix_dos_nt_errmap[] = { + { EPERM, ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED }, + { EACCES, ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED }, + { ENOENT, ERRDOS, ERRbadfile, NT_STATUS_NO_SUCH_FILE }, + { ENOTDIR, ERRDOS, ERRbadpath, NT_STATUS_NOT_A_DIRECTORY }, + { EIO, ERRHRD, ERRgeneral, NT_STATUS_IO_DEVICE_ERROR }, + { EBADF, ERRSRV, ERRsrverror, NT_STATUS_INVALID_HANDLE }, + { EINVAL, ERRSRV, ERRsrverror, NT_STATUS_INVALID_HANDLE }, + { EEXIST, ERRDOS, ERRfilexists, NT_STATUS_ACCESS_DENIED}, + { ENFILE, ERRDOS, ERRnofids, NT_STATUS_TOO_MANY_OPENED_FILES }, + { EMFILE, ERRDOS, ERRnofids, NT_STATUS_TOO_MANY_OPENED_FILES }, + { ENOSPC, ERRHRD, ERRdiskfull, NT_STATUS_DISK_FULL }, #ifdef EDQUOT - { EDQUOT, ERRdiskfull, NT_STATUS_DISK_FULL }, + { EDQUOT, ERRHRD, ERRdiskfull, NT_STATUS_DISK_FULL }, #endif #ifdef ENOTEMPTY - { ENOTEMPTY, ERRnoaccess, NT_STATUS_DIRECTORY_NOT_EMPTY }, + { ENOTEMPTY, ERRDOS, ERRnoaccess, NT_STATUS_DIRECTORY_NOT_EMPTY }, #endif #ifdef EXDEV - { EXDEV, ERRdiffdevice, NT_STATUS_NOT_SAME_DEVICE }, + { EXDEV, ERRDOS, ERRdiffdevice, NT_STATUS_NOT_SAME_DEVICE }, #endif - { EROFS, ERRnowrite, NT_STATUS_ACCESS_DENIED }, - - { 0, 0, NT_STATUS_OK } +#ifdef EROFS + { EROFS, ERRHRD, ERRnowrite, NT_STATUS_ACCESS_DENIED }, +#endif + { 0, 0, 0, NT_STATUS_OK } }; -/* Map an NT error code from a Unix error code */ +/********************************************************************* + Map an NT error code from a Unix error code. +*********************************************************************/ + NTSTATUS map_nt_error_from_unix(int unix_error) { int i = 0; - if (unix_error == 0) return NT_STATUS_OK; + if (unix_error == 0) + return NT_STATUS_OK; /* Look through list */ while(unix_dos_nt_errmap[i].unix_error != 0) { - if (unix_dos_nt_errmap[i].unix_error == unix_error) { + if (unix_dos_nt_errmap[i].unix_error == unix_error) return unix_dos_nt_errmap[i].nt_error; - } - i++; } /* Default return */ - return NT_STATUS_ACCESS_DENIED; } diff --git a/source3/libsmb/errormap.c b/source3/libsmb/errormap.c index 1c44675c83..401a07b77d 100644 --- a/source3/libsmb/errormap.c +++ b/source3/libsmb/errormap.c @@ -773,6 +773,7 @@ static struct { {ERRHRD, ERRlock, NT_STATUS_FILE_LOCK_CONFLICT}, {ERRHRD, ERRwrongdisk, NT_STATUS_WRONG_VOLUME}, {ERRHRD, 38, NT_STATUS_END_OF_FILE}, + {ERRHRD, ERRdiskfull, NT_STATUS_DISK_FULL}, {ERRHRD, 50, NT_STATUS_CTL_FILE_NOT_SUPPORTED}, {ERRHRD, 51, NT_STATUS_REMOTE_NOT_LISTENING}, {ERRHRD, 52, NT_STATUS_DUPLICATE_NAME}, diff --git a/source3/smbd/error.c b/source3/smbd/error.c index 3c829deb09..fc26aa4ded 100644 --- a/source3/smbd/error.c +++ b/source3/smbd/error.c @@ -25,6 +25,9 @@ int unix_ERR_class=SMB_SUCCESS; int unix_ERR_code=0; +/* From lib/error.c */ +extern struct unix_error_map unix_dos_nt_errmap[]; + /**************************************************************************** Create an error packet from a cached error. ****************************************************************************/ @@ -42,45 +45,16 @@ int cached_error_packet(char *outbuf,files_struct *fsp,int line,const char *file return error_packet(outbuf,NT_STATUS_OK,eclass,err,line,file); } -struct -{ - int unixerror; - int smbclass; - int smbcode; -} unix_smb_errmap[] = -{ - {EPERM,ERRDOS,ERRnoaccess}, - {EACCES,ERRDOS,ERRnoaccess}, - {ENOENT,ERRDOS,ERRbadfile}, - {ENOTDIR,ERRDOS,ERRbadpath}, - {EIO,ERRHRD,ERRgeneral}, - {EBADF,ERRSRV,ERRsrverror}, - {EINVAL,ERRSRV,ERRsrverror}, - {EEXIST,ERRDOS,ERRfilexists}, - {ENFILE,ERRDOS,ERRnofids}, - {EMFILE,ERRDOS,ERRnofids}, - {ENOSPC,ERRHRD,ERRdiskfull}, -#ifdef EDQUOT - {EDQUOT,ERRHRD,ERRdiskfull}, -#endif -#ifdef ENOTEMPTY - {ENOTEMPTY,ERRDOS,ERRnoaccess}, -#endif -#ifdef EXDEV - {EXDEV,ERRDOS,ERRdiffdevice}, -#endif - {EROFS,ERRHRD,ERRnowrite}, - {0,0,0} -}; - /**************************************************************************** - create an error packet from errno + Create an error packet from errno. ****************************************************************************/ + int unix_error_packet(char *outbuf,int def_class,uint32 def_code, int line, const char *file) { int eclass=def_class; int ecode=def_code; + NTSTATUS ntstatus = NT_STATUS_OK; int i=0; if (unix_ERR_class != SMB_SUCCESS) { @@ -89,23 +63,25 @@ int unix_error_packet(char *outbuf,int def_class,uint32 def_code, unix_ERR_class = SMB_SUCCESS; unix_ERR_code = 0; } else { - while (unix_smb_errmap[i].smbclass != 0) { - if (unix_smb_errmap[i].unixerror == errno) { - eclass = unix_smb_errmap[i].smbclass; - ecode = unix_smb_errmap[i].smbcode; + while (unix_dos_nt_errmap[i].dos_class != 0) { + if (unix_dos_nt_errmap[i].unix_error == errno) { + eclass = unix_dos_nt_errmap[i].dos_class; + ecode = unix_dos_nt_errmap[i].dos_code; + ntstatus = unix_dos_nt_errmap[i].nt_error; break; } i++; } } - return error_packet(outbuf,NT_STATUS_OK,eclass,ecode,line,file); + return error_packet(outbuf,ntstatus,eclass,ecode,line,file); } /**************************************************************************** - create an error packet. Normally called using the ERROR() macro + Create an error packet. Normally called using the ERROR() macro. ****************************************************************************/ + int error_packet(char *outbuf,NTSTATUS ntstatus, uint8 eclass,uint32 ecode,int line, const char *file) { -- cgit