summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2002-01-16 21:27:57 +0000
committerJeremy Allison <jra@samba.org>2002-01-16 21:27:57 +0000
commit04ec469c72c6a220108312cdec3d30081cfe938a (patch)
tree18e07e97f75c619012b77db2b2679112a9808f78
parent1cd8c9c41f05402f3da5c36d8a8333db0078198e (diff)
downloadsamba-04ec469c72c6a220108312cdec3d30081cfe938a.tar.gz
samba-04ec469c72c6a220108312cdec3d30081cfe938a.tar.bz2
samba-04ec469c72c6a220108312cdec3d30081cfe938a.zip
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)
-rw-r--r--source3/include/smb.h7
-rw-r--r--source3/lib/error.c54
-rw-r--r--source3/libsmb/errormap.c1
-rw-r--r--source3/smbd/error.c52
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)
{