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

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


Author: vlendec
Date: 2007-08-14 21:21:52 +0000 (Tue, 14 Aug 2007)
New Revision: 24442

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

Log:
Convert reply_copy 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 21:13:05 UTC (rev 24441)
+++ branches/SAMBA_3_2/source/smbd/process.c	2007-08-14 21:21:52 UTC (rev 24442)
@@ -731,7 +731,7 @@
 /* 0x26 */ { "SMBtranss",NULL,reply_transs,AS_USER | CAN_IPC},
 /* 0x27 */ { "SMBioctl",NULL,reply_ioctl,0},
 /* 0x28 */ { "SMBioctls",NULL, NULL,AS_USER},
-/* 0x29 */ { "SMBcopy",reply_copy,NULL,AS_USER | NEED_WRITE },
+/* 0x29 */ { "SMBcopy",NULL,reply_copy,AS_USER | NEED_WRITE },
 /* 0x2a */ { "SMBmove",NULL, NULL,AS_USER | NEED_WRITE },
 /* 0x2b */ { "SMBecho",NULL,reply_echo,0},
 /* 0x2c */ { "SMBwriteclose",NULL,reply_writeclose,AS_USER},

Modified: branches/SAMBA_3_2/source/smbd/reply.c
===================================================================
--- branches/SAMBA_3_2/source/smbd/reply.c	2007-08-14 21:13:05 UTC (rev 24441)
+++ branches/SAMBA_3_2/source/smbd/reply.c	2007-08-14 21:21:52 UTC (rev 24442)
@@ -5640,9 +5640,8 @@
  Reply to a file copy.
 ****************************************************************************/
 
-int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
+void reply_copy(connection_struct *conn, struct smb_request *req)
 {
-	int outsize = 0;
 	pstring name;
 	pstring directory;
 	pstring mask,newname;
@@ -5650,32 +5649,45 @@
 	int count=0;
 	int error = ERRnoaccess;
 	int err = 0;
-	int tid2 = SVAL(inbuf,smb_vwv0);
-	int ofun = SVAL(inbuf,smb_vwv1);
-	int flags = SVAL(inbuf,smb_vwv2);
+	int tid2;
+	int ofun;
+	int flags;
 	BOOL target_is_directory=False;
 	BOOL source_has_wild = False;
 	BOOL dest_has_wild = False;
 	SMB_STRUCT_STAT sbuf1, sbuf2;
 	NTSTATUS status;
+
 	START_PROFILE(SMBcopy);
 
+	if (req->wct < 3) {
+		reply_nterror(req, NT_STATUS_INVALID_PARAMETER);
+		END_PROFILE(SMBcopy);
+		return;
+	}
+
+	tid2 = SVAL(req->inbuf,smb_vwv0);
+	ofun = SVAL(req->inbuf,smb_vwv1);
+	flags = SVAL(req->inbuf,smb_vwv2);
+
 	*directory = *mask = 0;
 
-	p = smb_buf(inbuf);
-	p += srvstr_get_path_wcard(inbuf, SVAL(inbuf,smb_flg2), name, p,
+	p = smb_buf(req->inbuf);
+	p += srvstr_get_path_wcard((char *)req->inbuf, req->flags2, name, p,
 				   sizeof(name), 0, STR_TERMINATE, &status,
 				   &source_has_wild);
 	if (!NT_STATUS_IS_OK(status)) {
+		reply_nterror(req, status);
 		END_PROFILE(SMBcopy);
-		return ERROR_NT(status);
+		return;
 	}
-	p += srvstr_get_path_wcard(inbuf, SVAL(inbuf,smb_flg2), newname, p,
+	p += srvstr_get_path_wcard((char *)req->inbuf, req->flags2, newname, p,
 				   sizeof(newname), 0, STR_TERMINATE, &status,
 				   &dest_has_wild);
 	if (!NT_STATUS_IS_OK(status)) {
+		reply_nterror(req, status);
 		END_PROFILE(SMBcopy);
-		return ERROR_NT(status);
+		return;
 	}
    
 	DEBUG(3,("reply_copy : %s -> %s\n",name,newname));
@@ -5683,57 +5695,75 @@
 	if (tid2 != conn->cnum) {
 		/* can't currently handle inter share copies XXXX */
 		DEBUG(3,("Rejecting inter-share copy\n"));
+		reply_doserror(req, ERRSRV, ERRinvdevice);
 		END_PROFILE(SMBcopy);
-		return ERROR_DOS(ERRSRV,ERRinvdevice);
+		return;
 	}
 
-	status = resolve_dfspath_wcard(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, name, &source_has_wild);
+	status = resolve_dfspath_wcard(conn,
+				       req->flags2 & FLAGS2_DFS_PATHNAMES,
+				       name, &source_has_wild);
 	if (!NT_STATUS_IS_OK(status)) {
-		END_PROFILE(SMBcopy);
 		if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
-			return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+			reply_botherror(req, NT_STATUS_PATH_NOT_COVERED,
+					ERRSRV, ERRbadpath);
+			END_PROFILE(SMBcopy);
+			return;
 		}
-		return ERROR_NT(status);
+		reply_nterror(req, status);
+		END_PROFILE(SMBcopy);
+		return;
 	}
 
-	status = resolve_dfspath_wcard(conn, SVAL(inbuf,smb_flg2) & FLAGS2_DFS_PATHNAMES, newname, &dest_has_wild);
+	status = resolve_dfspath_wcard(conn,
+				       req->flags2 & FLAGS2_DFS_PATHNAMES,
+				       newname, &dest_has_wild);
 	if (!NT_STATUS_IS_OK(status)) {
-		END_PROFILE(SMBcopy);
 		if (NT_STATUS_EQUAL(status,NT_STATUS_PATH_NOT_COVERED)) {
-			return ERROR_BOTH(NT_STATUS_PATH_NOT_COVERED, ERRSRV, ERRbadpath);
+			reply_botherror(req, NT_STATUS_PATH_NOT_COVERED,
+					ERRSRV, ERRbadpath);
+			END_PROFILE(SMBcopy);
+			return;
 		}
-		return ERROR_NT(status);
+		reply_nterror(req, status);
+		END_PROFILE(SMBcopy);
+		return;
 	}
 
 	status = unix_convert(conn, name, source_has_wild, NULL, &sbuf1);
 	if (!NT_STATUS_IS_OK(status)) {
+		reply_nterror(req, status);
 		END_PROFILE(SMBcopy);
-		return ERROR_NT(status);
+		return;
 	}
 
 	status = unix_convert(conn, newname, dest_has_wild, NULL, &sbuf2);
 	if (!NT_STATUS_IS_OK(status)) {
+		reply_nterror(req, status);
 		END_PROFILE(SMBcopy);
-		return ERROR_NT(status);
+		return;
 	}
 
 	target_is_directory = VALID_STAT_OF_DIR(sbuf2);
 
 	if ((flags&1) && target_is_directory) {
+		reply_doserror(req, ERRDOS, ERRbadfile);
 		END_PROFILE(SMBcopy);
-		return ERROR_DOS(ERRDOS,ERRbadfile);
+		return;
 	}
 
 	if ((flags&2) && !target_is_directory) {
+		reply_doserror(req, ERRDOS, ERRbadpath);
 		END_PROFILE(SMBcopy);
-		return ERROR_DOS(ERRDOS,ERRbadpath);
+		return;
 	}
 
 	if ((flags&(1<<5)) && VALID_STAT_OF_DIR(sbuf1)) {
 		/* wants a tree copy! XXXX */
 		DEBUG(3,("Rejecting tree copy\n"));
+		reply_doserror(req, ERRSRV, ERRerror);
 		END_PROFILE(SMBcopy);
-		return ERROR_DOS(ERRSRV,ERRerror);
+		return;
 	}
 
 	p = strrchr_m(name,'/');
@@ -5764,27 +5794,33 @@
 		pstrcat(directory,mask);
 		if (dest_has_wild) {
 			if (!resolve_wildcards(directory,newname)) {
+				reply_nterror(req, NT_STATUS_NO_MEMORY);
 				END_PROFILE(SMBcopy);
-				return ERROR_NT(NT_STATUS_NO_MEMORY);
+				return;
 			}
 		}
 
 		status = check_name(conn, directory);
 		if (!NT_STATUS_IS_OK(status)) {
-			return ERROR_NT(status);
+			reply_nterror(req, status);
+			END_PROFILE(SMBcopy);
+			return;
 		}
 		
 		status = check_name(conn, newname);
 		if (!NT_STATUS_IS_OK(status)) {
-			return ERROR_NT(status);
+			reply_nterror(req, status);
+			END_PROFILE(SMBcopy);
+			return;
 		}
 		
 		status = copy_file(conn,directory,newname,ofun,
 					count,target_is_directory);
 
 		if(!NT_STATUS_IS_OK(status)) {
+			reply_nterror(req, status);
 			END_PROFILE(SMBcopy);
-			return ERROR_NT(status);
+			return;
 		} else {
 			count++;
 		}
@@ -5799,13 +5835,17 @@
 
 		status = check_name(conn, directory);
 		if (!NT_STATUS_IS_OK(status)) {
-			return ERROR_NT(status);
+			reply_nterror(req, status);
+			END_PROFILE(SMBcopy);
+			return;
 		}
 		
 		dir_hnd = OpenDir(conn, directory, mask, 0);
 		if (dir_hnd == NULL) {
 			status = map_nt_error_from_unix(errno);
-			return ERROR_NT(status);
+			reply_nterror(req, status);
+			END_PROFILE(SMBcopy);
+			return;
 		}
 
 		error = ERRbadfile;
@@ -5831,12 +5871,16 @@
 
 			status = check_name(conn, fname);
 			if (!NT_STATUS_IS_OK(status)) {
-				return ERROR_NT(status);
+				reply_nterror(req, status);
+				END_PROFILE(SMBcopy);
+				return;
 			}
 		
 			status = check_name(conn, destname);
 			if (!NT_STATUS_IS_OK(status)) {
-				return ERROR_NT(status);
+				reply_nterror(req, status);
+				END_PROFILE(SMBcopy);
+				return;
 			}
 		
 			DEBUG(3,("reply_copy : doing copy on %s -> %s\n",fname, destname));
@@ -5854,19 +5898,21 @@
 		if(err) {
 			/* Error on close... */
 			errno = err;
+			reply_unixerror(req, ERRHRD, ERRgeneral);
 			END_PROFILE(SMBcopy);
-			return(UNIXERROR(ERRHRD,ERRgeneral));
+			return;
 		}
 
+		reply_doserror(req, ERRDOS, error);
 		END_PROFILE(SMBcopy);
-		return ERROR_DOS(ERRDOS,error);
+		return;
 	}
-  
-	outsize = set_message(inbuf,outbuf,1,0,True);
-	SSVAL(outbuf,smb_vwv0,count);
 
+	reply_outbuf(req, 1, 0);
+	SSVAL(req->outbuf,smb_vwv0,count);
+
 	END_PROFILE(SMBcopy);
-	return(outsize);
+	return;
 }
 
 #undef DBGC_CLASS



More information about the samba-cvs mailing list