summaryrefslogtreecommitdiff
path: root/source3/smbd/error.c
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 /source3/smbd/error.c
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)
Diffstat (limited to 'source3/smbd/error.c')
-rw-r--r--source3/smbd/error.c52
1 files changed, 14 insertions, 38 deletions
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)
{