s3-net: use new rpccli_spoolss_enumforms wrapper.
[ira/wip.git] / source3 / smbd / error.c
index d00c61487a09c25cd31e92661975df410583a832..ce22f86414b385b7ff6faa0630e04aa21b83f137 100644 (file)
 */
 
 #include "includes.h"
+#include "smbd/globals.h"
 
 /* From lib/error.c */
 extern struct unix_error_map unix_dos_nt_errmap[];
 
-extern uint32 global_client_caps;
-
-/****************************************************************************
- Create an error packet from a cached error.
-****************************************************************************/
-int cached_error_packet(const char *inbuf,char *outbuf,files_struct *fsp,int line,const char *file)
-{
-       write_bmpx_struct *wbmpx = fsp->wbmpx_ptr;
-       int32 eclass = wbmpx->wr_errclass;
-       int32 err = wbmpx->wr_error;
-       NTSTATUS ntstatus = wbmpx->wr_status;
-       /* We can now delete the auxiliary struct */
-       SAFE_FREE(fsp->wbmpx_ptr);
-       return error_packet(inbuf,outbuf,eclass,err,ntstatus,line,file);
-}
-
-/****************************************************************************
- Create an error packet from errno.
-****************************************************************************/
-
-int unix_error_packet(const char *inbuf,char *outbuf,int def_class,uint32 def_code, NTSTATUS def_status, int line, const char *file)
-{
-       int eclass=def_class;
-       int ecode=def_code;
-       NTSTATUS ntstatus = def_status;
-       int i=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++;
-               }
-       }
-
-       return error_packet(inbuf,outbuf,eclass,ecode,ntstatus,line,file);
-}
-
-BOOL use_nt_status(void)
+bool use_nt_status(void)
 {
        return lp_nt_status_support() && (global_client_caps & CAP_STATUS32);
 }
@@ -82,8 +37,8 @@ BOOL use_nt_status(void)
 
 void error_packet_set(char *outbuf, uint8 eclass, uint32 ecode, NTSTATUS ntstatus, int line, const char *file)
 {
-       BOOL force_nt_status = False;
-       BOOL force_dos_status = False;
+       bool force_nt_status = False;
+       bool force_dos_status = False;
 
        if (eclass == (uint8)-1) {
                force_nt_status = True;
@@ -125,9 +80,9 @@ void error_packet_set(char *outbuf, uint8 eclass, uint32 ecode, NTSTATUS ntstatu
        }
 }
 
-int error_packet(const char *inbuf, char *outbuf, uint8 eclass, uint32 ecode, NTSTATUS ntstatus, int line, const char *file)
+int error_packet(char *outbuf, uint8 eclass, uint32 ecode, NTSTATUS ntstatus, int line, const char *file)
 {
-       int outsize = set_message(inbuf,outbuf,0,0,True);
+       int outsize = srv_set_message(outbuf,0,0,True);
        error_packet_set(outbuf, eclass, ecode, ntstatus, line, file);
        return outsize;
 }
@@ -140,6 +95,14 @@ void reply_nt_error(struct smb_request *req, NTSTATUS ntstatus,
        error_packet_set((char *)req->outbuf, 0, 0, ntstatus, line, file);
 }
 
+void reply_force_nt_error(struct smb_request *req, NTSTATUS ntstatus,
+                         int line, const char *file)
+{
+       TALLOC_FREE(req->outbuf);
+       reply_outbuf(req, 0, 0);
+       error_packet_set((char *)req->outbuf, -1, -1, ntstatus, line, file);
+}
+
 void reply_dos_error(struct smb_request *req, uint8 eclass, uint32 ecode,
                    int line, const char *file)
 {
@@ -157,3 +120,49 @@ 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_openerror(struct smb_request *req, NTSTATUS status)
+{
+       if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_COLLISION)) {
+               /*
+                * We hit an existing file, and if we're returning DOS
+                * error codes OBJECT_NAME_COLLISION would map to
+                * ERRDOS/183, we need to return ERRDOS/80, see bug
+                * 4852.
+                */
+               reply_botherror(req, NT_STATUS_OBJECT_NAME_COLLISION,
+                       ERRDOS, ERRfilexists);
+       } else {
+               reply_nterror(req, status);
+       }
+}
+
+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);
+}