* devices.cc: Regenerate.
* devices.h (device::exists_func): New member function pointer, replacing noexpose. (device::expose): Remove. (device::exists_never): Declare. (device::exists_ptys): Declare. (device::exists_cons): Declare. (device::exists_console): Declare. (device::exists_nt_dev): Declare. (device::exists): Declare. * devices.in (dev_storage): Replace former noexpose values with pointers to matching exists_XXX method. (device::exists_never): New method. (device::exists_ptys): New method. (device::exists_cons): New method. (device::exists_console): New method. (device::exists_nt_dev): New method. (device::exists): New method. * fhandler_dev.cc (fhandler_dev::readdir): Replace call to device::expose with call to device::exists and drop all further existence filtering since it's done in device::exists now. * path.cc (path_conv::check): Replace call to device::expose with call to device::exists.
This commit is contained in:
@ -12,8 +12,6 @@ details. */
|
||||
#include <stdlib.h>
|
||||
#include "path.h"
|
||||
#include "fhandler.h"
|
||||
#include "shared_info.h"
|
||||
#include "ntdll.h"
|
||||
#include "dtable.h"
|
||||
#include "cygheap.h"
|
||||
#include "devices.h"
|
||||
@ -121,79 +119,8 @@ fhandler_dev::readdir (DIR *dir, dirent *de)
|
||||
while (devidx < dev_storage_end)
|
||||
{
|
||||
const device& thisdev = *devidx++;
|
||||
if (!thisdev.expose ())
|
||||
if (!thisdev.exists ())
|
||||
continue;
|
||||
int devn = *const_cast<device *> (&thisdev);
|
||||
/* Exclude devices which are only available for internal purposes
|
||||
and devices which are not really existing at this time. */
|
||||
switch (thisdev.get_major ())
|
||||
{
|
||||
case DEV_PTYS_MAJOR:
|
||||
/* Show only existing slave ptys. */
|
||||
if (cygwin_shared->tty.connect (thisdev.get_minor ()) == -1)
|
||||
continue;
|
||||
break;
|
||||
case DEV_CONS_MAJOR:
|
||||
/* Show only the one console which is our controlling tty
|
||||
right now. */
|
||||
if (!iscons_dev (myself->ctty)
|
||||
|| myself->ctty != devn)
|
||||
continue;
|
||||
break;
|
||||
case DEV_TTY_MAJOR:
|
||||
/* Show con{in,out,sole} only if we're running in a console. */
|
||||
switch (devn)
|
||||
{
|
||||
case FH_CONIN:
|
||||
case FH_CONOUT:
|
||||
case FH_CONSOLE:
|
||||
if (!iscons_dev (myself->ctty))
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
case DEV_SERIAL_MAJOR:
|
||||
case DEV_FLOPPY_MAJOR:
|
||||
case DEV_TAPE_MAJOR:
|
||||
case DEV_CDROM_MAJOR:
|
||||
case DEV_SD_MAJOR:
|
||||
case DEV_SD1_MAJOR:
|
||||
case DEV_SD2_MAJOR:
|
||||
case DEV_SD3_MAJOR:
|
||||
case DEV_SD4_MAJOR:
|
||||
case DEV_SD5_MAJOR:
|
||||
case DEV_SD6_MAJOR:
|
||||
case DEV_SD7_MAJOR:
|
||||
/* Check existence of POSIX devices backed by real NT devices. */
|
||||
{
|
||||
WCHAR wpath[MAX_PATH];
|
||||
UNICODE_STRING upath;
|
||||
OBJECT_ATTRIBUTES attr;
|
||||
HANDLE h;
|
||||
NTSTATUS status;
|
||||
|
||||
sys_mbstowcs (wpath, MAX_PATH, thisdev.native);
|
||||
RtlInitUnicodeString (&upath, wpath);
|
||||
InitializeObjectAttributes (&attr, &upath,
|
||||
OBJ_CASE_INSENSITIVE, NULL, NULL);
|
||||
/* Except for the serial IO devices, the native paths are
|
||||
direct device paths, not symlinks, so every status code
|
||||
except for "NOT_FOUND" means the device exists. */
|
||||
status = NtOpenSymbolicLinkObject (&h, SYMBOLIC_LINK_QUERY,
|
||||
&attr);
|
||||
switch (status)
|
||||
{
|
||||
case STATUS_OBJECT_NAME_NOT_FOUND:
|
||||
case STATUS_OBJECT_PATH_NOT_FOUND:
|
||||
continue;
|
||||
case STATUS_SUCCESS:
|
||||
NtClose (h);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
++dir->__d_position;
|
||||
strcpy (de->d_name, thisdev.name + dev_prefix_len);
|
||||
de->d_ino = hash_path_name (0, thisdev.native);
|
||||
@ -213,15 +140,18 @@ fhandler_dev::readdir (DIR *dir, dirent *de)
|
||||
de->d_type = DT_BLK;
|
||||
break;
|
||||
case DEV_TTY_MAJOR:
|
||||
switch (devn)
|
||||
{
|
||||
case FH_CONIN:
|
||||
case FH_CONOUT:
|
||||
case FH_CONSOLE:
|
||||
dev.parse (myself->ctty);
|
||||
de->d_ino = hash_path_name (0, dev.native);
|
||||
break;
|
||||
}
|
||||
{
|
||||
int devn = *const_cast<device *> (&thisdev);
|
||||
switch (devn)
|
||||
{
|
||||
case FH_CONIN:
|
||||
case FH_CONOUT:
|
||||
case FH_CONSOLE:
|
||||
dev.parse (myself->ctty);
|
||||
de->d_ino = hash_path_name (0, dev.native);
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*FALLTHRU*/
|
||||
default:
|
||||
de->d_type = DT_CHR;
|
||||
|
Reference in New Issue
Block a user