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 unix_error_packet(char *outbuf,int def_class,uint32 def_code, NTSTATUS def_status, int line, const char *file)
{
int eclass=def_class;
int ecode=def_code;
}
}
- return error_packet(inbuf,outbuf,eclass,ecode,ntstatus,line,file);
+ return error_packet(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);
}
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;
}
}
-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 = set_message(outbuf,0,0,True);
error_packet_set(outbuf, eclass, ecode, ntstatus, line, file);
return outsize;
}
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)
{
error_packet_set((char *)req->outbuf, eclass, ecode, ntstatus,
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);
+ }
+}
+