* fhandler.h (class fhandler_registry): Declare dup method.
* fhandler_registry.cc (fhandler_registry::exists): Fix missing parenthesis. (fhandler_registry::dup): New method.
This commit is contained in:
parent
12406f25fb
commit
305b19d738
@ -1,3 +1,10 @@
|
||||
2008-12-15 Corinna Vinschen <corinna@vinschen.de>
|
||||
|
||||
* fhandler.h (class fhandler_registry): Declare dup method.
|
||||
* fhandler_registry.cc (fhandler_registry::exists): Fix missing
|
||||
parenthesis.
|
||||
(fhandler_registry::dup): New method.
|
||||
|
||||
2008-12-14 Christopher Faylor <me+cygwin@cgf.cx>
|
||||
|
||||
* fhandler_disk_file.cc (readdir_get_ino): Don't complain about MS-DOS
|
||||
|
@ -1299,6 +1299,7 @@ class fhandler_registry: public fhandler_proc
|
||||
int __stdcall fstat (struct __stat64 *buf) __attribute__ ((regparm (2)));
|
||||
bool fill_filebuf ();
|
||||
int close ();
|
||||
int dup (fhandler_base *child);
|
||||
};
|
||||
|
||||
class pinfo;
|
||||
|
@ -237,13 +237,15 @@ fhandler_registry::exists ()
|
||||
file++;
|
||||
|
||||
if (file == path)
|
||||
for (int i = 0; registry_listing[i]; i++)
|
||||
if (path_prefix_p (registry_listing[i], path,
|
||||
strlen (registry_listing[i]), true))
|
||||
{
|
||||
file_type = 1;
|
||||
break;
|
||||
}
|
||||
{
|
||||
for (int i = 0; registry_listing[i]; i++)
|
||||
if (path_prefix_p (registry_listing[i], path,
|
||||
strlen (registry_listing[i]), true))
|
||||
{
|
||||
file_type = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
char dec_file[NAME_MAX + 1];
|
||||
@ -640,6 +642,9 @@ fhandler_registry::open (int flags, mode_t mode)
|
||||
else
|
||||
{
|
||||
set_io_handle (registry_keys[i]);
|
||||
/* Marking as nohandle allows to call dup on pseudo registry
|
||||
handles. */
|
||||
nohandle (true);
|
||||
flags |= O_DIROPEN;
|
||||
goto success;
|
||||
}
|
||||
@ -724,7 +729,7 @@ fhandler_registry::close ()
|
||||
if (res != 0)
|
||||
return res;
|
||||
HKEY handle = (HKEY) get_handle ();
|
||||
if (handle != (HKEY) INVALID_HANDLE_VALUE)
|
||||
if (handle != (HKEY) INVALID_HANDLE_VALUE && handle < HKEY_CLASSES_ROOT)
|
||||
{
|
||||
if (RegCloseKey (handle) != ERROR_SUCCESS)
|
||||
{
|
||||
@ -891,3 +896,16 @@ open_key (const char *name, REGSAM access, DWORD wow64, bool isValue)
|
||||
out:
|
||||
return hKey;
|
||||
}
|
||||
|
||||
int
|
||||
fhandler_registry::dup (fhandler_base *child)
|
||||
{
|
||||
int ret = fhandler_virtual::dup (child);
|
||||
/* Pseudo registry handles can't be duplicated using DuplicateHandle.
|
||||
Therefore those fhandlers are marked with the nohandle flag. This
|
||||
allows fhandler_base::dup to succeed as usual for nohandle fhandlers.
|
||||
Here we just have to fix up by copying the pseudo handle value. */
|
||||
if ((HKEY) get_handle () >= HKEY_CLASSES_ROOT)
|
||||
child->set_io_handle (get_handle ());
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user