* Makefile.in (DLL_OFILES): Add fhandler_procsys.o.
* devices.h (enum fh_devices): Add FH_PROCSYS. * devices.in (dev_procsys_storage): New device. * devices.cc: Regenerate. * dtable.cc (build_fh_pc): Add code to allocate fhandler_procsys. * fhandler.h (proc_len): Convert to size_t. (procsys): Declare. (procsys_len): Declare. (enum virtual_ftype_t): Move here from fhandler_virtual.h. Add members supported by fhandler_procsys. (fhandler_virtual::exists): Return virtual_ftype_t. Change in all derived classes. (class fhandler_procsys): New class. (fhandler_union): Add fhandler_procnet and fhandler_procsys members. * fhandler_disk_file.cc (__DIR_mounts::check_missing_mount): Use ro_u_proc. (fhandler_base::fstat_by_handle): Don't copy attributes if file is an NT device. (fhandler_base::fstat_by_name): Ditto. * fhandler_netdrive.cc (fhandler_netdrive::exists): Return virtual_ftype_t. * fhandler_proc.cc (proc_tab): Sort alphabetically. Use _VN macro to store length. (proc_len): Change to size_t. (proc_tab_cmp): New static function. (virt_tab_search): New function to search entry in virt_tab_t arrays. Use throughout in /proc and sibling classes instead of loop. (fhandler_proc::exists): Return virtual_ftype_t. * fhandler_process.cc (process_tab): Sort alphabetically. Use _VN macro to store length. (fhandler_process::exists): Return virtual_ftype_t. (fhandler_process::open): Simplify code. * fhandler_procnet.cc (procnet_tab): Sort alphabetically. Use _VN macro to store length. (fhandler_procnet::exists): Return virtual_ftype_t. (fhandler_procnet::open): Simplify. * fhandler_procsys.cc: New file. * fhandler_registry.cc (fhandler_registry::exists): Return virtual_ftype_t. * fhandler_virtual.cc (fhandler_virtual::exists): Ditto. * fhandler_virtual.h (enum virtual_ftype_t): Move to fhandler.h. (virt_tab_t): Add name_len member. (_VN): New macro. (virt_tab_search): Declare. * mount.cc (mount_info::conv_to_win32_path): Fix comment. Backslashify isprocsys_dev paths. * ntdll.h (STATUS_OBJECT_TYPE_MISMATCH): Define (STATUS_INSTANCE_NOT_AVAILABLE): Define. (STATUS_PIPE_NOT_AVAILABLE): Define. (STATUS_INVALID_PIPE_STATE): Define. (STATUS_PIPE_BUSY): Define. (SYMBOLIC_LINK_QUERY): Define. (NtOpenSymbolicLinkObject): Declare. (NtQuerySymbolicLinkObject): Declare. * path.cc (path_conv::check): Accommodate fact that exists method returns virtual_ftype_t now. Add cases for new virtual_ftype_t types. (cygwin_conv_path): Add GLOBALROOT prefix to native device paths. Make sure to strip \\?\ prefix only for actual filesystem-based paths, not for all paths. * path.h (isproc_dev): Add FH_PROCSYS. (isprocsys_dev): Define.
This commit is contained in:
@ -39,10 +39,10 @@ static _off64_t format_procnet_ifinet6 (void *, char *&);
|
||||
|
||||
static const virt_tab_t procnet_tab[] =
|
||||
{
|
||||
{ ".", FH_PROCNET, virt_directory, NULL },
|
||||
{ "..", FH_PROCNET, virt_directory, NULL },
|
||||
{ "if_inet6", FH_PROCNET, virt_file, format_procnet_ifinet6 },
|
||||
{ NULL, 0, virt_none, NULL }
|
||||
{ _VN ("."), FH_PROCNET, virt_directory, NULL },
|
||||
{ _VN (".."), FH_PROCNET, virt_directory, NULL },
|
||||
{ _VN ("if_inet6"), FH_PROCNET, virt_file, format_procnet_ifinet6 },
|
||||
{ NULL, 0, 0, virt_none, NULL }
|
||||
};
|
||||
|
||||
static const int PROCNET_LINK_COUNT =
|
||||
@ -52,7 +52,7 @@ static const int PROCNET_LINK_COUNT =
|
||||
* -1 if path is a file, -2 if path is a symlink, -3 if path is a pipe,
|
||||
* -4 if path is a socket.
|
||||
*/
|
||||
int
|
||||
virtual_ftype_t
|
||||
fhandler_procnet::exists ()
|
||||
{
|
||||
const char *path = get_name ();
|
||||
@ -61,20 +61,21 @@ fhandler_procnet::exists ()
|
||||
while (*path != 0 && !isdirsep (*path))
|
||||
path++;
|
||||
if (*path == 0)
|
||||
return 1;
|
||||
return virt_rootdir;
|
||||
|
||||
for (int i = 0; procnet_tab[i].name; i++)
|
||||
if (!strcmp (path + 1, procnet_tab[i].name))
|
||||
{
|
||||
if (procnet_tab[i].type == virt_file)
|
||||
{
|
||||
if (!wincap.has_gaa_prefixes ()
|
||||
|| !get_adapters_addresses (NULL, AF_INET6))
|
||||
return virt_none;
|
||||
}
|
||||
fileid = i;
|
||||
return procnet_tab[i].type;
|
||||
}
|
||||
virt_tab_t *entry = virt_tab_search (path + 1, false, procnet_tab,
|
||||
PROCNET_LINK_COUNT);
|
||||
if (entry)
|
||||
{
|
||||
if (entry->type == virt_file)
|
||||
{
|
||||
if (!wincap.has_gaa_prefixes ()
|
||||
|| !get_adapters_addresses (NULL, AF_INET6))
|
||||
return virt_none;
|
||||
}
|
||||
fileid = entry - procnet_tab;
|
||||
return entry->type;
|
||||
}
|
||||
return virt_none;
|
||||
}
|
||||
|
||||
@ -129,8 +130,6 @@ out:
|
||||
int
|
||||
fhandler_procnet::open (int flags, mode_t mode)
|
||||
{
|
||||
int process_file_no = -1;
|
||||
|
||||
int res = fhandler_virtual::open (flags, mode);
|
||||
if (!res)
|
||||
goto out;
|
||||
@ -163,27 +162,13 @@ fhandler_procnet::open (int flags, mode_t mode)
|
||||
}
|
||||
}
|
||||
|
||||
process_file_no = -1;
|
||||
for (int i = 0; procnet_tab[i].name; i++)
|
||||
virt_tab_t *entry;
|
||||
entry = virt_tab_search (path + 1, true, procnet_tab, PROCNET_LINK_COUNT);
|
||||
if (!entry)
|
||||
{
|
||||
if (path_prefix_p (procnet_tab[i].name, path + 1,
|
||||
strlen (procnet_tab[i].name), false))
|
||||
process_file_no = i;
|
||||
}
|
||||
if (process_file_no == -1)
|
||||
{
|
||||
if (flags & O_CREAT)
|
||||
{
|
||||
set_errno (EROFS);
|
||||
res = 0;
|
||||
goto out;
|
||||
}
|
||||
else
|
||||
{
|
||||
set_errno (ENOENT);
|
||||
res = 0;
|
||||
goto out;
|
||||
}
|
||||
set_errno ((flags & O_CREAT) ? EROFS : ENOENT);
|
||||
res = 0;
|
||||
goto out;
|
||||
}
|
||||
if (flags & O_WRONLY)
|
||||
{
|
||||
@ -192,7 +177,7 @@ fhandler_procnet::open (int flags, mode_t mode)
|
||||
goto out;
|
||||
}
|
||||
|
||||
fileid = process_file_no;
|
||||
fileid = entry - procnet_tab;
|
||||
if (!fill_filebuf ())
|
||||
{
|
||||
res = 0;
|
||||
|
Reference in New Issue
Block a user