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

tridge at samba.org tridge at samba.org
Mon Oct 25 05:27:49 GMT 2004


Author: tridge
Date: 2004-10-25 05:27:49 +0000 (Mon, 25 Oct 2004)
New Revision: 3193

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

Log:
improved the initial permissions choice for file create, based upon dos attribute

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


Changeset:
Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_fileinfo.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/posix/pvfs_fileinfo.c	2004-10-25 05:27:15 UTC (rev 3192)
+++ branches/SAMBA_4_0/source/ntvfs/posix/pvfs_fileinfo.c	2004-10-25 05:27:49 UTC (rev 3193)
@@ -35,58 +35,6 @@
 #define UNIX_TYPE_UNKNOWN 0xFFFFFFFF
 
 
-/*
- Return the major devicenumber for UNIX extensions.
-*/
-static uint32_t unix_dev_major(dev_t dev)
-{
-#if defined(HAVE_DEVICE_MAJOR_FN)
-	return (uint32)major(dev);
-#else
-	return (uint32)(dev >> 8);
-#endif
-}
-
-/*
- Return the minor devicenumber for UNIX extensions.
-*/
-static uint32_t unix_dev_minor(dev_t dev)
-{
-#if defined(HAVE_DEVICE_MINOR_FN)
-	return (uint32)minor(dev);
-#else
-	return (uint32)(dev & 0xff);
-#endif
-}
-
-/*
- Return the filetype for UNIX extensions
-*/
-static uint32_t unix_filetype(mode_t mode)
-{
-	if (S_ISREG(mode)) return UNIX_TYPE_FILE;
-	if (S_ISDIR(mode)) return UNIX_TYPE_DIR;
-#ifdef S_ISLNK
-	if (S_ISLNK(mode)) return UNIX_TYPE_SYMLINK;
-#endif
-#ifdef S_ISCHR
-	if (S_ISCHR(mode)) return UNIX_TYPE_CHARDEV;
-#endif
-#ifdef S_ISBLK
-	if (S_ISBLK(mode)) return UNIX_TYPE_BLKDEV;
-#endif
-#ifdef S_ISFIFO
-	if (S_ISFIFO(mode)) return UNIX_TYPE_FIFO;
-#endif
-#ifdef S_ISSOCK
-	if (S_ISSOCK(mode)) return UNIX_TYPE_SOCKET;
-#endif
-
-	DEBUG(0,("unix_filetype: unknown filetype %u", (unsigned)mode));
-	return UNIX_TYPE_UNKNOWN;
-}
-
-
 /****************************************************************************
  Change a unix mode to a dos mode.
 ****************************************************************************/
@@ -153,3 +101,37 @@
 
 	return NT_STATUS_OK;
 }
+
+
+/*
+  return a set of unix file permissions for a new file or directory
+*/
+mode_t pvfs_fileperms(struct pvfs_state *pvfs, uint32 attrib)
+{
+	mode_t mode = S_IRUSR | S_IRGRP | S_IROTH;
+
+	if (attrib & FILE_ATTRIBUTE_DIRECTORY) {
+		mode |= S_IXUSR | S_IXGRP | S_IXOTH;
+	}
+
+	if (!(attrib & FILE_ATTRIBUTE_READONLY)) {
+		mode |= S_IWUSR;
+	}
+
+	if ((attrib & FILE_ATTRIBUTE_ARCHIVE) &&
+	    (pvfs->flags & PVFS_FLAG_MAP_ARCHIVE)) {
+		mode |= S_IXUSR;
+	}
+
+	if ((attrib & FILE_ATTRIBUTE_SYSTEM) &&
+	    (pvfs->flags & PVFS_FLAG_MAP_SYSTEM)) {
+		mode |= S_IXGRP;
+	}
+
+	if ((attrib & FILE_ATTRIBUTE_HIDDEN) &&
+	    (pvfs->flags & PVFS_FLAG_MAP_HIDDEN)) {
+		mode |= S_IXOTH;
+	}
+
+	return mode;
+}

Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_open.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/posix/pvfs_open.c	2004-10-25 05:27:15 UTC (rev 3192)
+++ branches/SAMBA_4_0/source/ntvfs/posix/pvfs_open.c	2004-10-25 05:27:49 UTC (rev 3193)
@@ -150,7 +150,9 @@
 	talloc_set_destructor(f, pvfs_dir_fd_destructor);
 
 	if (!name->exists) {
-		if (mkdir(name->full_name, 0755) == -1) {
+		uint32_t attrib = io->generic.in.file_attr | FILE_ATTRIBUTE_DIRECTORY;
+		mode_t mode = pvfs_fileperms(pvfs, attrib);
+		if (mkdir(name->full_name, mode) == -1) {
 			return pvfs_map_errno(pvfs,errno);
 		}
 		status = pvfs_resolve_name(pvfs, req, io->ntcreatex.in.fname,
@@ -287,7 +289,17 @@
 		access_mask = GENERIC_RIGHTS_FILE_READ | GENERIC_RIGHTS_FILE_WRITE;
 	}
 
-	flags = O_RDWR;
+	switch (access_mask & (SA_RIGHT_FILE_READ_DATA | SA_RIGHT_FILE_WRITE_DATA)) {
+	case SA_RIGHT_FILE_READ_DATA:
+		flags = O_RDONLY;
+		break;
+	case SA_RIGHT_FILE_WRITE_DATA:
+		flags = O_WRONLY;
+		break;
+	case SA_RIGHT_FILE_WRITE_DATA|SA_RIGHT_FILE_READ_DATA:
+		flags = O_RDWR;
+		break;
+	}
 
 	f = talloc_p(req, struct pvfs_file);
 	if (f == NULL) {
@@ -299,11 +311,7 @@
 		return NT_STATUS_TOO_MANY_OPENED_FILES;
 	}
 
-	if (io->ntcreatex.in.file_attr & FILE_ATTRIBUTE_READONLY) {
-		mode = 0444;
-	} else {
-		mode = 0644;
-	}
+	mode = pvfs_fileperms(pvfs, io->ntcreatex.in.file_attr);
 
 	/* create the file */
 	fd = open(name->full_name, flags | O_CREAT | O_EXCL, mode);
@@ -434,7 +442,7 @@
 	access_mask    = io->generic.in.access_mask;
 
 	if (access_mask & SEC_RIGHT_MAXIMUM_ALLOWED) {
-		if (name->dos.attrib & FILE_ATTRIBUTE_READONLY) {
+		if (name->exists && (name->dos.attrib & FILE_ATTRIBUTE_READONLY)) {
 			access_mask = GENERIC_RIGHTS_FILE_READ;
 		} else {
 			access_mask = GENERIC_RIGHTS_FILE_READ | GENERIC_RIGHTS_FILE_WRITE;
@@ -488,7 +496,17 @@
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
-	flags |= O_RDWR;
+	switch (access_mask & (SA_RIGHT_FILE_READ_DATA | SA_RIGHT_FILE_WRITE_DATA)) {
+	case SA_RIGHT_FILE_READ_DATA:
+		flags |= O_RDONLY;
+		break;
+	case SA_RIGHT_FILE_WRITE_DATA:
+		flags |= O_WRONLY;
+		break;
+	case SA_RIGHT_FILE_WRITE_DATA|SA_RIGHT_FILE_READ_DATA:
+		flags |= O_RDWR;
+		break;
+	}
 
 	/* handle creating a new file separately */
 	if (!name->exists) {



More information about the samba-cvs mailing list