* fhandler_disk_file.cc (fhandler_disk_file::mkdir): Create directories
on NFS shares with correct mode bits.
This commit is contained in:
		| @@ -1,3 +1,8 @@ | |||||||
|  | 2008-05-20  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
|  | 	* fhandler_disk_file.cc (fhandler_disk_file::mkdir): Create directories | ||||||
|  | 	on NFS shares with correct mode bits. | ||||||
|  |  | ||||||
| 2008-05-20  Corinna Vinschen  <corinna@vinschen.de> | 2008-05-20  Corinna Vinschen  <corinna@vinschen.de> | ||||||
|  |  | ||||||
| 	* winsup.h (cygwin_inet_addr): Fix type of declaration. | 	* winsup.h (cygwin_inet_addr): Fix type of declaration. | ||||||
|   | |||||||
| @@ -1438,12 +1438,33 @@ fhandler_disk_file::mkdir (mode_t mode) | |||||||
|   OBJECT_ATTRIBUTES attr; |   OBJECT_ATTRIBUTES attr; | ||||||
|   IO_STATUS_BLOCK io; |   IO_STATUS_BLOCK io; | ||||||
|   ULONG fattr = FILE_ATTRIBUTE_DIRECTORY; |   ULONG fattr = FILE_ATTRIBUTE_DIRECTORY; | ||||||
|  |   PFILE_FULL_EA_INFORMATION p = NULL; | ||||||
|  |   ULONG plen = 0; | ||||||
|  |  | ||||||
|  |   if (pc.fs_is_nfs ()) | ||||||
|  |     { | ||||||
|  |       /* When creating a dir on an NFS share, we have to set the | ||||||
|  | 	 file mode by writing a NFS fattr3 structure with the | ||||||
|  | 	 correct mode bits set. */ | ||||||
|  |       plen = sizeof (FILE_FULL_EA_INFORMATION) + sizeof (NFS_V3_ATTR) | ||||||
|  | 	     + sizeof (fattr3); | ||||||
|  |       p = (PFILE_FULL_EA_INFORMATION) alloca (plen); | ||||||
|  |       p->NextEntryOffset = 0; | ||||||
|  |       p->Flags = 0; | ||||||
|  |       p->EaNameLength = sizeof (NFS_V3_ATTR) - 1; | ||||||
|  |       p->EaValueLength = sizeof (fattr3); | ||||||
|  |       strcpy (p->EaName, NFS_V3_ATTR); | ||||||
|  |       fattr3 *nfs_attr = (fattr3 *) (p->EaName + p->EaNameLength + 1); | ||||||
|  |       memset (nfs_attr, 0, sizeof (fattr3)); | ||||||
|  |       nfs_attr->type = NF3DIR; | ||||||
|  |       nfs_attr->mode = (mode & 07777) & ~cygheap->umask; | ||||||
|  |     } | ||||||
|   status = NtCreateFile (&dir, FILE_LIST_DIRECTORY | SYNCHRONIZE, |   status = NtCreateFile (&dir, FILE_LIST_DIRECTORY | SYNCHRONIZE, | ||||||
| 			 pc.get_object_attr (attr, sa), &io, NULL, | 			 pc.get_object_attr (attr, sa), &io, NULL, | ||||||
| 			 fattr, FILE_SHARE_VALID_FLAGS, FILE_CREATE, | 			 fattr, FILE_SHARE_VALID_FLAGS, FILE_CREATE, | ||||||
| 			 FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT | 			 FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT | ||||||
| 			 | FILE_OPEN_FOR_BACKUP_INTENT, | 			 | FILE_OPEN_FOR_BACKUP_INTENT, | ||||||
| 			 NULL, 0); | 			 p, plen); | ||||||
|   if (NT_SUCCESS (status)) |   if (NT_SUCCESS (status)) | ||||||
|     { |     { | ||||||
|       NtClose (dir); |       NtClose (dir); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user