svn commit: samba r3154 - in branches/SAMBA_4_0/source/ntvfs/posix: .

tridge at samba.org tridge at samba.org
Sun Oct 24 12:53:14 GMT 2004


Author: tridge
Date: 2004-10-24 12:53:13 +0000 (Sun, 24 Oct 2004)
New Revision: 3154

WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source/ntvfs/posix&rev=3154&nolog=1

Log:
pvfs now passes all of BASE-DELETE





Modified:
   branches/SAMBA_4_0/source/ntvfs/posix/pvfs_open.c


Changeset:
Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_open.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/posix/pvfs_open.c	2004-10-24 12:39:15 UTC (rev 3153)
+++ branches/SAMBA_4_0/source/ntvfs/posix/pvfs_open.c	2004-10-24 12:53:13 UTC (rev 3154)
@@ -266,6 +266,12 @@
 	uint32_t create_options = io->generic.in.create_options;
 	uint32_t share_access = io->generic.in.share_access;
 	uint32_t access_mask = io->generic.in.access_mask;
+	mode_t mode;
+
+	if ((io->ntcreatex.in.file_attr & FILE_ATTRIBUTE_READONLY) &&
+	    (create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE)) {
+		return NT_STATUS_CANNOT_DELETE;
+	}
 	
 	flags = O_RDWR;
 
@@ -279,8 +285,14 @@
 		return NT_STATUS_TOO_MANY_OPENED_FILES;
 	}
 
+	if (io->ntcreatex.in.file_attr & FILE_ATTRIBUTE_READONLY) {
+		mode = 0444;
+	} else {
+		mode = 0644;
+	}
+
 	/* create the file */
-	fd = open(name->full_name, flags | O_CREAT | O_EXCL, 0644);
+	fd = open(name->full_name, flags | O_CREAT | O_EXCL, mode);
 	if (fd == -1) {
 		idr_remove(pvfs->idtree_fnum, fnum);
 		return pvfs_map_errno(pvfs, errno);
@@ -407,7 +419,7 @@
 
 	/* certain create options are not allowed */
 	if ((create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE) &&
-	    !(share_access & NTCREATEX_SHARE_ACCESS_DELETE)) {
+	    !(access_mask & STD_RIGHT_DELETE_ACCESS)) {
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
@@ -475,6 +487,11 @@
 		/* fall through to a normal open */
 	}
 
+	if ((name->dos.attrib & FILE_ATTRIBUTE_READONLY) &&
+	    (create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE)) {
+		return NT_STATUS_CANNOT_DELETE;
+	}
+
 	f = talloc_p(req, struct pvfs_file);
 	if (f == NULL) {
 		return NT_STATUS_NO_MEMORY;
@@ -655,6 +672,11 @@
 		return NT_STATUS_OK;
 	}
 
+	if ((f->name->dos.attrib & FILE_ATTRIBUTE_READONLY) &&
+	    (create_options & NTCREATEX_OPTIONS_DELETE_ON_CLOSE)) {
+		return NT_STATUS_CANNOT_DELETE;
+	}
+
 	lck = odb_lock(req, pvfs->odb_context, &f->locking_key);
 	if (lck == NULL) {
 		return NT_STATUS_INTERNAL_DB_CORRUPTION;



More information about the samba-cvs mailing list