r24078: Add reply_unixerror
authorVolker Lendecke <vlendec@samba.org>
Mon, 30 Jul 2007 10:23:26 +0000 (10:23 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:29:02 +0000 (12:29 -0500)
source/include/smb_macros.h
source/smbd/error.c

index a47eff2f64ffc8b861be1c33dd15a6ce1d381ba1..15789a938ab10d1385d8c18a8e3b99f364917db4 100644 (file)
 #define reply_nterror(req,status) reply_nt_error(req,status,__LINE__,__FILE__)
 #define reply_doserror(req,eclass,ecode) reply_dos_error(req,eclass,ecode,__LINE__,__FILE__)
 #define reply_botherror(req,status,eclass,ecode) reply_both_error(req,eclass,ecode,status,__LINE__,__FILE__)
+#define reply_unixerror(req,defclass,deferror) reply_unix_error(req,defclass,deferror,NT_STATUS_OK,__LINE__,__FILE__)
 
 /* this is how errors are generated */
 #define UNIXERROR(defclass,deferror) unix_error_packet(inbuf,outbuf,defclass,deferror,NT_STATUS_OK,__LINE__,__FILE__)
index d00c61487a09c25cd31e92661975df410583a832..023e1b7dcc458907a09f69074872a5ed9994b3a3 100644 (file)
@@ -157,3 +157,33 @@ void reply_both_error(struct smb_request *req, uint8 eclass, uint32 ecode,
        error_packet_set((char *)req->outbuf, eclass, ecode, status,
                         line, file);
 }
+
+void reply_unix_error(struct smb_request *req, uint8 defclass, uint32 defcode,
+                     NTSTATUS defstatus, int line, const char *file)
+{
+       int eclass=defclass;
+       int ecode=defcode;
+       NTSTATUS ntstatus = defstatus;
+       int i=0;
+
+       TALLOC_FREE(req->outbuf);
+       reply_outbuf(req, 0, 0);
+
+       if (errno != 0) {
+               DEBUG(3,("unix_error_packet: error string = %s\n",
+                        strerror(errno)));
+
+               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++;
+               }
+       }
+
+       error_packet_set((char *)req->outbuf, eclass, ecode, ntstatus,
+                        line, file);
+}