* autoload.cc (NetUseGetInfo): Define.
* fhandler_disk_file.cc (fhandler_cygdrive::opendir): Rename flptst to drive. Call new get_disk_type function rather than is_floppy and check SMB drives with the NetUseGetInfo function. Explain why. * mount.cc (get_disk_type): New function to evaluate disk type from native NT device name. (is_floppy): Remove. * mount.h (enum disk_type): Define. (get_disk_type): Declare. * path.h (is_floppy): Drop declaration.
This commit is contained in:
parent
fb97e87479
commit
9de0461985
|
@ -1,3 +1,16 @@
|
||||||
|
2012-02-16 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* autoload.cc (NetUseGetInfo): Define.
|
||||||
|
* fhandler_disk_file.cc (fhandler_cygdrive::opendir): Rename flptst
|
||||||
|
to drive. Call new get_disk_type function rather than is_floppy and
|
||||||
|
check SMB drives with the NetUseGetInfo function. Explain why.
|
||||||
|
* mount.cc (get_disk_type): New function to evaluate disk type from
|
||||||
|
native NT device name.
|
||||||
|
(is_floppy): Remove.
|
||||||
|
* mount.h (enum disk_type): Define.
|
||||||
|
(get_disk_type): Declare.
|
||||||
|
* path.h (is_floppy): Drop declaration.
|
||||||
|
|
||||||
2012-02-15 Corinna Vinschen <corinna@vinschen.de>
|
2012-02-15 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* miscfuncs.cc: Revert change from 2012-02-13 which used the
|
* miscfuncs.cc: Revert change from 2012-02-13 which used the
|
||||||
|
|
|
@ -406,6 +406,7 @@ LoadDLLfunc (WNetOpenEnumA, 20, mpr)
|
||||||
|
|
||||||
LoadDLLfunc (DsGetDcNameW, 24, netapi32)
|
LoadDLLfunc (DsGetDcNameW, 24, netapi32)
|
||||||
LoadDLLfunc (NetApiBufferFree, 4, netapi32)
|
LoadDLLfunc (NetApiBufferFree, 4, netapi32)
|
||||||
|
LoadDLLfunc (NetUseGetInfo, 16, netapi32)
|
||||||
LoadDLLfunc (NetUserGetGroups, 28, netapi32)
|
LoadDLLfunc (NetUserGetGroups, 28, netapi32)
|
||||||
LoadDLLfunc (NetUserGetInfo, 16, netapi32)
|
LoadDLLfunc (NetUserGetInfo, 16, netapi32)
|
||||||
LoadDLLfunc (NetUserGetLocalGroups, 32, netapi32)
|
LoadDLLfunc (NetUserGetLocalGroups, 32, netapi32)
|
||||||
|
|
|
@ -25,6 +25,7 @@ details. */
|
||||||
#include "tls_pbuf.h"
|
#include "tls_pbuf.h"
|
||||||
#include "pwdgrp.h"
|
#include "pwdgrp.h"
|
||||||
#include <winioctl.h>
|
#include <winioctl.h>
|
||||||
|
#include <lm.h>
|
||||||
|
|
||||||
#define _COMPILING_NEWLIB
|
#define _COMPILING_NEWLIB
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
@ -2412,7 +2413,7 @@ fhandler_cygdrive::opendir (int fd)
|
||||||
int
|
int
|
||||||
fhandler_cygdrive::readdir (DIR *dir, dirent *de)
|
fhandler_cygdrive::readdir (DIR *dir, dirent *de)
|
||||||
{
|
{
|
||||||
char flptst[] = "X:";
|
WCHAR drive[] = L"X:";
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
@ -2426,8 +2427,29 @@ fhandler_cygdrive::readdir (DIR *dir, dirent *de)
|
||||||
}
|
}
|
||||||
return ENMFILE;
|
return ENMFILE;
|
||||||
}
|
}
|
||||||
if (!is_floppy ((flptst[0] = *pdrive, flptst))
|
disk_type dt = get_disk_type ((drive[0] = *pdrive, drive));
|
||||||
&& GetFileAttributes (pdrive) != INVALID_FILE_ATTRIBUTES)
|
if (dt == DT_SHARE_SMB)
|
||||||
|
{
|
||||||
|
/* Calling NetUseGetInfo on SMB drives allows to fetch the
|
||||||
|
current state of the drive without trying to open a file
|
||||||
|
descriptor on the share (GetFileAttributes). This avoids
|
||||||
|
waiting for SMB timeouts. Of course, there's a downside:
|
||||||
|
If a drive becomes availabe again, it can take a couple of
|
||||||
|
minutes to recognize it. As long as this didn't happen,
|
||||||
|
the drive will not show up in the cygdrive dir. */
|
||||||
|
PUSE_INFO_1 pui1;
|
||||||
|
DWORD status;
|
||||||
|
|
||||||
|
if (NetUseGetInfo (NULL, drive, 1, (PBYTE *) &pui1) == NERR_Success)
|
||||||
|
{
|
||||||
|
status = pui1->ui1_status;
|
||||||
|
NetApiBufferFree (pui1);
|
||||||
|
if (status == USE_OK)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (dt != DT_FLOPPY
|
||||||
|
&& GetFileAttributes (pdrive) != INVALID_FILE_ATTRIBUTES)
|
||||||
break;
|
break;
|
||||||
pdrive = strchr (pdrive, '\0') + 1;
|
pdrive = strchr (pdrive, '\0') + 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1840,13 +1840,42 @@ cygwin_umount (const char *path, unsigned flags)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
#define is_dev(d,s) wcsncmp((d),(s),sizeof(s) - 1)
|
||||||
is_floppy (const char *dos)
|
|
||||||
|
disk_type
|
||||||
|
get_disk_type (LPCWSTR dos)
|
||||||
{
|
{
|
||||||
char dev[256];
|
WCHAR dev[MAX_PATH], *d = dev;
|
||||||
if (!QueryDosDevice (dos, dev, 256))
|
if (!QueryDosDeviceW (dos, dev, MAX_PATH))
|
||||||
return false;
|
return DT_NODISK;
|
||||||
return ascii_strncasematch (dev, "\\Device\\Floppy", 14);
|
if (is_dev (dev, L"\\Device\\"))
|
||||||
|
{
|
||||||
|
d += 8;
|
||||||
|
switch (toupper (*d))
|
||||||
|
{
|
||||||
|
case 'C':
|
||||||
|
if (is_dev (d, L"CdRom"))
|
||||||
|
return DT_CDROM;
|
||||||
|
break;
|
||||||
|
case 'F':
|
||||||
|
if (is_dev (d, L"Floppy"))
|
||||||
|
return DT_FLOPPY;
|
||||||
|
break;
|
||||||
|
case 'H':
|
||||||
|
if (is_dev (d, L"Harddisk"))
|
||||||
|
return DT_HARDDISK;
|
||||||
|
break;
|
||||||
|
case 'L':
|
||||||
|
if (is_dev (d, L"LanmanRedirector\\"))
|
||||||
|
return DT_SHARE_SMB;
|
||||||
|
break;
|
||||||
|
case 'M':
|
||||||
|
if (is_dev (d, L"MRxNfs\\"))
|
||||||
|
return DT_SHARE_NFS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DT_NODISK;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" FILE *
|
extern "C" FILE *
|
||||||
|
@ -1855,9 +1884,11 @@ setmntent (const char *filep, const char *)
|
||||||
_my_tls.locals.iteration = 0;
|
_my_tls.locals.iteration = 0;
|
||||||
_my_tls.locals.available_drives = GetLogicalDrives ();
|
_my_tls.locals.available_drives = GetLogicalDrives ();
|
||||||
/* Filter floppy drives on A: and B: */
|
/* Filter floppy drives on A: and B: */
|
||||||
if ((_my_tls.locals.available_drives & 1) && is_floppy ("A:"))
|
if ((_my_tls.locals.available_drives & 1)
|
||||||
|
&& get_disk_type (L"A:") == DT_FLOPPY)
|
||||||
_my_tls.locals.available_drives &= ~1;
|
_my_tls.locals.available_drives &= ~1;
|
||||||
if ((_my_tls.locals.available_drives & 2) && is_floppy ("B:"))
|
if ((_my_tls.locals.available_drives & 2)
|
||||||
|
&& get_disk_type (L"B:") == DT_FLOPPY)
|
||||||
_my_tls.locals.available_drives &= ~2;
|
_my_tls.locals.available_drives &= ~2;
|
||||||
return (FILE *) filep;
|
return (FILE *) filep;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* mount.h: mount definitions.
|
/* mount.h: mount definitions.
|
||||||
|
|
||||||
Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005,
|
Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005,
|
||||||
2006, 2007, 2008, 2009, 2010, 2011 Red Hat, Inc.
|
2006, 2007, 2008, 2009, 2010, 2011, 2012 Red Hat, Inc.
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
|
@ -12,6 +12,18 @@ details. */
|
||||||
#ifndef _MOUNT_H
|
#ifndef _MOUNT_H
|
||||||
#define _MOUNT_H
|
#define _MOUNT_H
|
||||||
|
|
||||||
|
enum disk_type
|
||||||
|
{
|
||||||
|
DT_NODISK,
|
||||||
|
DT_CDROM,
|
||||||
|
DT_FLOPPY,
|
||||||
|
DT_HARDDISK,
|
||||||
|
DT_SHARE_SMB,
|
||||||
|
DT_SHARE_NFS
|
||||||
|
};
|
||||||
|
|
||||||
|
disk_type get_disk_type (LPCWSTR);
|
||||||
|
|
||||||
enum fs_info_type
|
enum fs_info_type
|
||||||
{
|
{
|
||||||
none = 0,
|
none = 0,
|
||||||
|
|
|
@ -424,7 +424,6 @@ bool has_dot_last_component (const char *dir, bool test_dot_dot) __attribute__ (
|
||||||
int path_prefix_p (const char *path1, const char *path2, int len1,
|
int path_prefix_p (const char *path1, const char *path2, int len1,
|
||||||
bool caseinsensitive) __attribute__ ((regparm (3)));
|
bool caseinsensitive) __attribute__ ((regparm (3)));
|
||||||
|
|
||||||
bool is_floppy (const char *);
|
|
||||||
NTSTATUS file_get_fnoi (HANDLE, bool, struct _FILE_NETWORK_OPEN_INFORMATION *);
|
NTSTATUS file_get_fnoi (HANDLE, bool, struct _FILE_NETWORK_OPEN_INFORMATION *);
|
||||||
int normalize_win32_path (const char *, char *, char *&);
|
int normalize_win32_path (const char *, char *, char *&);
|
||||||
int normalize_posix_path (const char *, char *, char *&);
|
int normalize_posix_path (const char *, char *, char *&);
|
||||||
|
|
Loading…
Reference in New Issue