* autoload.cc: Add load statement for `NtOpenFile'.

* fhandler.h (fhandler_dev_raw::get_unit): New method.
	(fhandler_dev_tape::norewind): Eliminate.
	(fhandler_dev_tape::is_rewind_device): New method.
	* fhandler_raw.cc (fhandler_dev_raw::open): Open new
	fixed device name devices using NT internal method.
	Keep calling fhandler_base::open() for old mount table
	device mapping compatibility devices.
	(fhandler_dev_raw::fstat): Eliminate.  Settings are done
	by fhandler_base::fstat() already.
	* fhandler_tape.cc: Remove `norewind' usage throughout.
	* ntdll.h: Define FILE_SYNCHRONOUS_IO_NONALERT.
	Define struct _IO_STATUS_BLOCK.
	Declare NtOpenFile().
	* path.cc (get_raw_device_number): Add new approach for
	using fixed device names.
	(win32_device_name): Ditto.
	(get_device_number): Ditto.  Require POSIX path to begin
	with "/dev/".
	(mount_info::conv_to_win32_path): Call win32_device_name()
	instead of get_device_number() after evaluating mount points
	to allow changing the win32 destination path again.
	* security.cc (str2buf2uni): Remove `static' to be able to
	call function from fhandler_dev_raw::open().
	* wincap.cc: Set flag has_raw_devices appropriately.
	* wincap.h: Add flag has_raw_devices.
This commit is contained in:
Corinna Vinschen
2001-10-16 14:53:26 +00:00
parent 2ac3bab68d
commit 990690655c
10 changed files with 253 additions and 60 deletions

View File

@@ -854,31 +854,112 @@ get_devn (const char *name, int &unit)
return devn;
}
/*
major minor POSIX filename NT filename
----- ----- -------------- -------------------------
FH_TAPE 0 /dev/st0 \device\tape0
FH_TAPE 1 /dev/st1 \device\tape1
...
FH_TAPE 128 /dev/nst0 \device\tape0
FH_TAPE 129 /dev/nst1 \device\tape1
...
FH_FLOPPY 0 /dev/fd0 \device\floppy0
FH_FLOPPY 1 /dev/fd1 \device\floppy1
...
FH_FLOPPY 16 /dev/scd0 \device\cdrom0
FH_FLOPPY 17 /dev/scd0 \device\cdrom1
...
FH_FLOPPY 32 /dev/sda \device\harddisk0\partition0
FH_FLOPPY 33 /dev/sda1 \device\harddisk0\partition1
...
FH_FLOPPY 47 /dev/sda15 \device\harddisk0\partition15
FH_FLOPPY 48 /dev/sdb \device\harddisk1\partition0
FH_FLOPPY 33 /dev/sdb1 \device\harddisk1\partition1
...
FH_FLOPPY 208 /dev/sdl \device\harddisk11\partition0
...
FH_FLOPPY 223 /dev/sdl15 \device\harddisk11\partition15
The following are needed to maintain backward compatibility with
the old Win32 partitioning scheme on W2K/XP.
FH_FLOPPY 224 from mount tab \\.\A:
...
FH_FLOPPY 250 from mount tab \\.\Z:
*/
static int
get_raw_device_number (const char *unix_path, const char *w32_path, int &unit)
get_raw_device_number (const char *name, const char *w32_path, int &unit)
{
int devn;
w32_path += 4;
if (wdeveqn ("tape", 4))
DWORD devn = FH_BAD;
if (!w32_path) /* New approach using fixed device names. */
{
unit = digits (w32_path + 4);
// norewind tape devices have leading n in name
if (udeveqn ("/dev/n", 6))
unit += 128;
devn = FH_TAPE;
if (deveqn ("st", 2))
{
unit = digits (name + 2);
if (unit >= 0 && unit < 128)
devn = FH_TAPE;
}
else if (deveqn ("nst", 3))
{
unit = digits (name + 3) + 128;
if (unit >= 128 && unit < 256)
devn = FH_TAPE;
}
else if (deveqn ("fd", 2))
{
unit = digits (name + 2);
if (unit >= 0 && unit < 16)
devn = FH_FLOPPY;
}
else if (deveqn ("scd", 3))
{
unit = digits (name + 3) + 16;
if (unit >= 16 && unit < 32)
devn = FH_FLOPPY;
}
else if (deveqn ("sd", 2) && isalpha (name[2]))
{
unit = (cyg_tolower (name[2]) - 'a') * 16 + 32;
if (unit >= 32 && unit < 224)
if (!name[3])
devn = FH_FLOPPY;
else
{
int d = digits (name + 3);
if (d >= 1 && d < 16)
{
unit += d;
devn = FH_FLOPPY;
}
}
}
}
else if (isdrive (w32_path))
else /* Backward compatible checking of mount table device mapping. */
{
unit = cyg_tolower (w32_path[0]) - 'a';
devn = FH_FLOPPY;
if (wdeveqn ("tape", 4))
{
unit = digits (w32_path + 4);
/* Norewind tape devices have leading n in name. */
if (deveqn ("n", 1))
unit += 128;
devn = FH_TAPE;
}
else if (wdeveqn ("physicaldrive", 13))
{
unit = digits (w32_path + 13) * 16 + 32;
devn = FH_FLOPPY;
}
else if (isdrive (w32_path))
{
unit = cyg_tolower (w32_path[0]) - 'a' + 224;
devn = FH_FLOPPY;
}
}
else if (wdeveqn ("physicaldrive", 13))
{
unit = digits (w32_path + 13) + 128;
devn = FH_FLOPPY;
}
else
devn = FH_BAD;
return devn;
}
@@ -892,15 +973,18 @@ get_device_number (const char *unix_path, const char *w32_path, int &unit)
unit = 0;
if (*unix_path == '/' && udeveqn ("/dev/", 5))
devn = get_devn (unix_path, unit);
if (devn == FH_BAD && *w32_path == '\\' && wdeveqn ("\\dev\\", 5))
devn = get_devn (w32_path, unit);
if (devn == FH_BAD && udeveqn ("com", 3)
&& (unit = digits (unix_path + 3)) >= 0)
devn = FH_SERIAL;
else if (strncmp (w32_path, "\\\\.\\", 4) == 0)
devn = get_raw_device_number (unix_path, w32_path, unit);
{
devn = get_devn (unix_path, unit);
if (devn == FH_BAD && *w32_path == '\\' && wdeveqn ("\\dev\\", 5))
devn = get_devn (w32_path, unit);
if (devn == FH_BAD && udeveqn ("com", 3)
&& (unit = digits (unix_path + 3)) >= 0)
devn = FH_SERIAL;
if (devn == FH_BAD && wdeveqn ("\\\\.\\", 4))
devn = get_raw_device_number (unix_path + 5, w32_path + 4, unit);
if (devn == FH_BAD)
devn = get_raw_device_number (unix_path + 5, NULL, unit);
}
return devn;
}
@@ -913,17 +997,36 @@ win32_device_name (const char *src_path, char *win32_path,
{
const char *devfmt;
devn = get_device_number (src_path, "", unit);
devn = get_device_number (src_path, win32_path, unit);
if (devn == FH_BAD)
return FALSE;
if ((devfmt = windows_device_names[FHDEVN (devn)]) == NULL)
return FALSE;
if (devn == FH_RANDOM)
__small_sprintf (win32_path, devfmt, unit == 8 ? "" : "u");
else
__small_sprintf (win32_path, devfmt, unit);
switch (devn)
{
case FH_RANDOM:
__small_sprintf (win32_path, devfmt, unit == 8 ? "" : "u");
break;
case FH_TAPE:
__small_sprintf (win32_path, "\\device\\tape%d", unit % 128);
break;
case FH_FLOPPY:
if (unit < 16)
__small_sprintf (win32_path, "\\device\\floppy%d", unit);
else if (unit < 32)
__small_sprintf (win32_path, "\\device\\cdrom%d", unit - 16);
else if (unit < 224)
__small_sprintf (win32_path, "\\device\\harddisk%d\\partition%d",
(unit - 32) / 16, unit % 16);
else
__small_sprintf (win32_path, "\\\\.\\%c:", unit - 224 + 'A');
break;
default:
__small_sprintf (win32_path, devfmt, unit);
break;
}
return TRUE;
}
@@ -1335,7 +1438,7 @@ mount_info::conv_to_win32_path (const char *src_path, char *dst,
*flags = mi->flags;
}
devn = get_device_number (src_path, dst, unit);
win32_device_name (src_path, dst, devn, unit);
out:
MALLOC_CHECK;