* fhandler_disk_file.cc (fhandler_disk_file::mkdir): Create directories
on NFS shares with correct mode bits.
This commit is contained in:
parent
316d9cabfe
commit
ec0165f29c
|
@ -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>
|
||||
|
||||
* winsup.h (cygwin_inet_addr): Fix type of declaration.
|
||||
|
|
|
@ -1438,12 +1438,33 @@ fhandler_disk_file::mkdir (mode_t mode)
|
|||
OBJECT_ATTRIBUTES attr;
|
||||
IO_STATUS_BLOCK io;
|
||||
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,
|
||||
pc.get_object_attr (attr, sa), &io, NULL,
|
||||
fattr, FILE_SHARE_VALID_FLAGS, FILE_CREATE,
|
||||
FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT
|
||||
| FILE_OPEN_FOR_BACKUP_INTENT,
|
||||
NULL, 0);
|
||||
p, plen);
|
||||
if (NT_SUCCESS (status))
|
||||
{
|
||||
NtClose (dir);
|
||||
|
|
Loading…
Reference in New Issue