svn commit: samba r3531 - in branches/SAMBA_4_0/source: ntvfs smb_server

tridge at samba.org tridge at samba.org
Thu Nov 4 13:15:22 GMT 2004


Author: tridge
Date: 2004-11-04 13:15:22 +0000 (Thu, 04 Nov 2004)
New Revision: 3531

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

Log:
add support for RAW_OPEN_MKNEW, RAW_OPEN_CREATE and RAW_OPEN_CTEMP in pvfs




Modified:
   branches/SAMBA_4_0/source/ntvfs/ntvfs_generic.c
   branches/SAMBA_4_0/source/smb_server/reply.c


Changeset:
Modified: branches/SAMBA_4_0/source/ntvfs/ntvfs_generic.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/ntvfs_generic.c	2004-11-04 12:12:09 UTC (rev 3530)
+++ branches/SAMBA_4_0/source/ntvfs/ntvfs_generic.c	2004-11-04 13:15:22 UTC (rev 3531)
@@ -144,6 +144,11 @@
 				      union smb_open *io2, 
 				      NTSTATUS status)
 {
+	time_t write_time = 0;
+	uint32_t set_size = 0;
+	union smb_setfileinfo *sf;
+	uint_t state;
+
 	if (!NT_STATUS_IS_OK(status)) {
 		return status;
 	}
@@ -171,32 +176,56 @@
 		
 		/* we need to extend the file to the requested size if
 		   it was newly created */
-		if (io2->generic.out.create_action == NTCREATEX_ACTION_CREATED &&
-		    io->openx.in.size != 0) {
-			union smb_setfileinfo *sf;
-			uint_t state;
+		if (io2->generic.out.create_action == NTCREATEX_ACTION_CREATED) {
+			set_size = io->openx.in.size;
+		}
+		break;
 
-			/* doing this secondary request async is more
-			   trouble than its worth */
-			state = req->async_states->state;
-			req->async_states->state &= ~NTVFS_ASYNC_STATE_MAY_ASYNC;
+	case RAW_OPEN_MKNEW:
+	case RAW_OPEN_CREATE:
+		io->mknew.out.fnum = io2->generic.out.fnum;
+		write_time = io->mknew.in.write_time;
+		break;
 
-			sf = talloc_p(req, union smb_setfileinfo);			
-			sf->generic.level            = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
-			sf->generic.file.fnum        = io2->generic.out.fnum;
-			sf->end_of_file_info.in.size = io->openx.in.size;
-			status = ntvfs->ops->setfileinfo(ntvfs, req, sf);
-			if (NT_STATUS_IS_OK(status)) {
-				io->openx.out.size = io->openx.in.size;
-			}
-			req->async_states->state = state;
-		}
+	case RAW_OPEN_CTEMP:
+		io->ctemp.out.fnum  = io2->generic.out.fnum;
+		io->ctemp.out.name = talloc_strdup(req, io2->generic.in.fname + 
+						   strlen(io->ctemp.in.directory) + 1);
+		write_time = io->ctemp.in.write_time;
 		break;
 
 	default:
 		return NT_STATUS_INVALID_LEVEL;
 	}
 
+	/* doing a secondary request async is more trouble than its
+	   worth */
+	state = req->async_states->state;
+	req->async_states->state &= ~NTVFS_ASYNC_STATE_MAY_ASYNC;
+
+	if (write_time != 0) {
+		sf = talloc_p(req, union smb_setfileinfo);			
+		sf->generic.level            = RAW_SFILEINFO_STANDARD;
+		sf->generic.file.fnum        = io2->generic.out.fnum;
+		sf->standard.in.create_time = 0;
+		sf->standard.in.write_time  = write_time;
+		sf->standard.in.access_time = 0;
+		status = ntvfs->ops->setfileinfo(ntvfs, req, sf);
+	}
+
+	if (set_size != 0) {
+		sf = talloc_p(req, union smb_setfileinfo);			
+		sf->generic.level            = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
+		sf->generic.file.fnum        = io2->generic.out.fnum;
+		sf->end_of_file_info.in.size = io->openx.in.size;
+		status = ntvfs->ops->setfileinfo(ntvfs, req, sf);
+		if (NT_STATUS_IS_OK(status)) {
+			io->openx.out.size = io->openx.in.size;
+		}
+	}
+
+	req->async_states->state = state;
+
 	return NT_STATUS_OK;
 }
 
@@ -386,6 +415,50 @@
 		status = ntvfs->ops->openfile(ntvfs, req, io2);
 		break;
 
+
+	case RAW_OPEN_MKNEW:
+		io2->generic.in.file_attr = io->mknew.in.attrib;
+		io2->generic.in.fname = io->mknew.in.fname;
+		io2->generic.in.open_disposition = NTCREATEX_DISP_CREATE;
+		io2->generic.in.access_mask = 
+			GENERIC_RIGHTS_FILE_READ |
+			GENERIC_RIGHTS_FILE_WRITE;
+		io2->generic.in.share_access = 
+			NTCREATEX_SHARE_ACCESS_READ | 
+			NTCREATEX_SHARE_ACCESS_WRITE;
+		status = ntvfs->ops->openfile(ntvfs, req, io2);
+		break;
+
+	case RAW_OPEN_CREATE:
+		io2->generic.in.file_attr = io->mknew.in.attrib;
+		io2->generic.in.fname = io->mknew.in.fname;
+		io2->generic.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
+		io2->generic.in.access_mask = 
+			GENERIC_RIGHTS_FILE_READ |
+			GENERIC_RIGHTS_FILE_WRITE;
+		io2->generic.in.share_access = 
+			NTCREATEX_SHARE_ACCESS_READ | 
+			NTCREATEX_SHARE_ACCESS_WRITE;
+		status = ntvfs->ops->openfile(ntvfs, req, io2);
+		break;
+
+	case RAW_OPEN_CTEMP:
+		io2->generic.in.file_attr = io->ctemp.in.attrib;
+		io2->generic.in.file_attr = 0;
+		io2->generic.in.fname = 
+			talloc_asprintf(io2, "%s\\SRV%s", 
+					io->ctemp.in.directory,
+					generate_random_str_list(io2, 5, "0123456789"));
+		io2->generic.in.open_disposition = NTCREATEX_DISP_CREATE;
+		io2->generic.in.access_mask = 
+			GENERIC_RIGHTS_FILE_READ |
+			GENERIC_RIGHTS_FILE_WRITE;
+		io2->generic.in.share_access = 
+			NTCREATEX_SHARE_ACCESS_READ | 
+			NTCREATEX_SHARE_ACCESS_WRITE;
+		status = ntvfs->ops->openfile(ntvfs, req, io2);
+		break;
+
 	default:
 		status = NT_STATUS_INVALID_LEVEL;
 		break;

Modified: branches/SAMBA_4_0/source/smb_server/reply.c
===================================================================
--- branches/SAMBA_4_0/source/smb_server/reply.c	2004-11-04 12:12:09 UTC (rev 3530)
+++ branches/SAMBA_4_0/source/smb_server/reply.c	2004-11-04 13:15:22 UTC (rev 3531)
@@ -556,7 +556,11 @@
 	REQ_CHECK_WCT(req, 3);
 	REQ_TALLOC(oi, sizeof(*oi));
 
-	oi->mknew.level = RAW_OPEN_MKNEW;
+	if (CVAL(req->in.hdr, HDR_COM) == SMBmknew) {
+		oi->mknew.level = RAW_OPEN_MKNEW;
+	} else {
+		oi->mknew.level = RAW_OPEN_CREATE;
+	}
 	oi->mknew.in.attrib  = SVAL(req->in.vwv, VWV(0));
 	oi->mknew.in.write_time  = srv_pull_dos_date3(req->smb_conn, req->in.vwv + VWV(1));
 



More information about the samba-cvs mailing list