svn commit: samba r24436 - in branches/SAMBA_3_2/source/smbd: .

vlendec at samba.org vlendec at samba.org
Tue Aug 14 20:20:53 GMT 2007


Author: vlendec
Date: 2007-08-14 20:20:51 +0000 (Tue, 14 Aug 2007)
New Revision: 24436

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=24436

Log:
Convert reply_lockread/writeunlock to the new API
Modified:
   branches/SAMBA_3_2/source/smbd/process.c
   branches/SAMBA_3_2/source/smbd/reply.c


Changeset:
Modified: branches/SAMBA_3_2/source/smbd/process.c
===================================================================
--- branches/SAMBA_3_2/source/smbd/process.c	2007-08-14 20:11:47 UTC (rev 24435)
+++ branches/SAMBA_3_2/source/smbd/process.c	2007-08-14 20:20:51 UTC (rev 24436)
@@ -709,8 +709,8 @@
 /* 0x10 */ { "SMBcheckpath",NULL,reply_checkpath,AS_USER},
 /* 0x11 */ { "SMBexit",NULL,reply_exit,DO_CHDIR},
 /* 0x12 */ { "SMBlseek",NULL,reply_lseek,AS_USER},
-/* 0x13 */ { "SMBlockread",reply_lockread,NULL,AS_USER},
-/* 0x14 */ { "SMBwriteunlock",reply_writeunlock,NULL,AS_USER},
+/* 0x13 */ { "SMBlockread",NULL,reply_lockread,AS_USER},
+/* 0x14 */ { "SMBwriteunlock",NULL,reply_writeunlock,AS_USER},
 /* 0x15 */ { NULL, NULL, NULL, 0 },
 /* 0x16 */ { NULL, NULL, NULL, 0 },
 /* 0x17 */ { NULL, NULL, NULL, 0 },

Modified: branches/SAMBA_3_2/source/smbd/reply.c
===================================================================
--- branches/SAMBA_3_2/source/smbd/reply.c	2007-08-14 20:11:47 UTC (rev 24435)
+++ branches/SAMBA_3_2/source/smbd/reply.c	2007-08-14 20:20:51 UTC (rev 24436)
@@ -2741,31 +2741,47 @@
  Reply to a lockread (core+ protocol).
 ****************************************************************************/
 
-int reply_lockread(connection_struct *conn, char *inbuf,char *outbuf, int length, int dum_buffsiz)
+void reply_lockread(connection_struct *conn, struct smb_request *req)
 {
 	ssize_t nread = -1;
 	char *data;
-	int outsize = 0;
 	SMB_OFF_T startpos;
 	size_t numtoread;
 	NTSTATUS status;
-	files_struct *fsp = file_fsp(SVAL(inbuf,smb_vwv0));
+	files_struct *fsp;
 	struct byte_range_lock *br_lck = NULL;
+
 	START_PROFILE(SMBlockread);
 
-	CHECK_FSP(fsp,conn);
-	if (!CHECK_READ(fsp,inbuf)) {
-		return(ERROR_DOS(ERRDOS,ERRbadaccess));
+	if (req->wct < 5) {
+		reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
+		END_PROFILE(SMBlockread);
+		return;
 	}
 
+	fsp = file_fsp(SVAL(req->inbuf,smb_vwv0));
+
+	if (!check_fsp(conn, req, fsp, &current_user)) {
+		END_PROFILE(SMBlockread);
+		return;
+	}
+
+	if (!CHECK_READ(fsp,req->inbuf)) {
+		reply_doserror(req, ERRDOS, ERRbadaccess);
+		END_PROFILE(SMBlockread);
+		return;
+	}
+
 	release_level_2_oplocks_on_change(fsp);
 
-	numtoread = SVAL(inbuf,smb_vwv1);
-	startpos = IVAL_TO_SMB_OFF_T(inbuf,smb_vwv2);
-  
-	outsize = set_message(inbuf,outbuf,5,3,True);
-	numtoread = MIN(BUFFER_SIZE-outsize,numtoread);
-	data = smb_buf(outbuf) + 3;
+	numtoread = SVAL(req->inbuf,smb_vwv1);
+	startpos = IVAL_TO_SMB_OFF_T(req->inbuf,smb_vwv2);
+
+	numtoread = MIN(BUFFER_SIZE - (smb_size + 3*2 + 3), numtoread);
+
+	reply_outbuf(req, 5, numtoread + 3);
+
+	data = smb_buf(req->outbuf) + 3;
 	
 	/*
 	 * NB. Discovered by Menny Hamburger at Mainsoft. This is a core+
@@ -2777,7 +2793,7 @@
 	
 	br_lck = do_lock(smbd_messaging_context(),
 			fsp,
-			(uint32)SVAL(inbuf,smb_pid), 
+			req->smbpid,
 			(SMB_BIG_UINT)numtoread,
 			(SMB_BIG_UINT)startpos,
 			WRITE_LOCK,
@@ -2788,8 +2804,9 @@
 	TALLOC_FREE(br_lck);
 
 	if (NT_STATUS_V(status)) {
+		reply_nterror(req, status);
 		END_PROFILE(SMBlockread);
-		return ERROR_NT(status);
+		return;
 	}
 
 	/*
@@ -2805,20 +2822,22 @@
 	nread = read_file(fsp,data,startpos,numtoread);
 
 	if (nread < 0) {
+		reply_unixerror(req, ERRDOS, ERRnoaccess);
 		END_PROFILE(SMBlockread);
-		return(UNIXERROR(ERRDOS,ERRnoaccess));
+		return;
 	}
 	
-	outsize += nread;
-	SSVAL(outbuf,smb_vwv0,nread);
-	SSVAL(outbuf,smb_vwv5,nread+3);
-	SSVAL(smb_buf(outbuf),1,nread);
+	set_message(NULL, (char *)req->outbuf, 5, nread+3, False);
+
+	SSVAL(req->outbuf,smb_vwv0,nread);
+	SSVAL(req->outbuf,smb_vwv5,nread+3);
+	SSVAL(smb_buf(req->outbuf),1,nread);
 	
 	DEBUG(3,("lockread fnum=%d num=%d nread=%d\n",
 		 fsp->fnum, (int)numtoread, (int)nread));
 
 	END_PROFILE(SMBlockread);
-	return(outsize);
+	return;
 }
 
 #undef DBGC_CLASS
@@ -3341,30 +3360,46 @@
  Reply to a writeunlock (core+).
 ****************************************************************************/
 
-int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, 
-		      int size, int dum_buffsize)
+void reply_writeunlock(connection_struct *conn, struct smb_request *req)
 {
 	ssize_t nwritten = -1;
 	size_t numtowrite;
 	SMB_OFF_T startpos;
 	char *data;
 	NTSTATUS status = NT_STATUS_OK;
-	files_struct *fsp = file_fsp(SVAL(inbuf,smb_vwv0));
-	int outsize = 0;
+	files_struct *fsp;
+
 	START_PROFILE(SMBwriteunlock);
+
+	if (req->wct < 5) {
+		reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
+		END_PROFILE(SMBwriteunlock);
+		return;
+	}
 	
-	CHECK_FSP(fsp,conn);
+	fsp = file_fsp(SVAL(req->inbuf,smb_vwv0));
+
+	if (!check_fsp(conn, req, fsp, &current_user)) {
+		END_PROFILE(SMBwriteunlock);
+		return;
+	}
+
 	if (!CHECK_WRITE(fsp)) {
-		return(ERROR_DOS(ERRDOS,ERRbadaccess));
+		reply_doserror(req, ERRDOS,ERRbadaccess);
+		END_PROFILE(SMBwriteunlock);
+		return;
 	}
 
-	numtowrite = SVAL(inbuf,smb_vwv1);
-	startpos = IVAL_TO_SMB_OFF_T(inbuf,smb_vwv2);
-	data = smb_buf(inbuf) + 3;
+	numtowrite = SVAL(req->inbuf,smb_vwv1);
+	startpos = IVAL_TO_SMB_OFF_T(req->inbuf,smb_vwv2);
+	data = smb_buf(req->inbuf) + 3;
   
-	if (numtowrite && is_locked(fsp,(uint32)SVAL(inbuf,smb_pid),(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) {
+	if (numtowrite
+	    && is_locked(fsp, (uint32)req->smbpid, (SMB_BIG_UINT)numtowrite,
+			 (SMB_BIG_UINT)startpos, WRITE_LOCK)) {
+		reply_doserror(req, ERRDOS, ERRlock);
 		END_PROFILE(SMBwriteunlock);
-		return ERROR_DOS(ERRDOS,ERRlock);
+		return;
 	}
 
 	/* The special X/Open SMB protocol handling of
@@ -3378,40 +3413,43 @@
   
 	status = sync_file(conn, fsp, False /* write through */);
 	if (!NT_STATUS_IS_OK(status)) {
-		END_PROFILE(SMBwriteunlock);
 		DEBUG(5,("reply_writeunlock: sync_file for %s returned %s\n",
 			fsp->fsp_name, nt_errstr(status) ));
-		return ERROR_NT(status);
+		reply_nterror(req, status);
+		END_PROFILE(SMBwriteunlock);
+		return;
 	}
 
 	if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) {
+		reply_unixerror(req, ERRHRD, ERRdiskfull);
 		END_PROFILE(SMBwriteunlock);
-		return(UNIXERROR(ERRHRD,ERRdiskfull));
+		return;
 	}
 
 	if (numtowrite) {
 		status = do_unlock(smbd_messaging_context(),
 				fsp,
-				(uint32)SVAL(inbuf,smb_pid),
+				req->smbpid,
 				(SMB_BIG_UINT)numtowrite, 
 				(SMB_BIG_UINT)startpos,
 				WINDOWS_LOCK);
 
 		if (NT_STATUS_V(status)) {
+			reply_nterror(req, status);
 			END_PROFILE(SMBwriteunlock);
-			return ERROR_NT(status);
+			return;
 		}
 	}
+
+	reply_outbuf(req, 1, 0);
 	
-	outsize = set_message(inbuf,outbuf,1,0,True);
+	SSVAL(req->outbuf,smb_vwv0,nwritten);
 	
-	SSVAL(outbuf,smb_vwv0,nwritten);
-	
 	DEBUG(3,("writeunlock fnum=%d num=%d wrote=%d\n",
 		 fsp->fnum, (int)numtowrite, (int)nwritten));
 	
 	END_PROFILE(SMBwriteunlock);
-	return outsize;
+	return;
 }
 
 #undef DBGC_CLASS



More information about the samba-cvs mailing list