From 305b19d738088b1a95b6a2082f756b3117da81b7 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Mon, 15 Dec 2008 12:33:27 +0000 Subject: [PATCH] * fhandler.h (class fhandler_registry): Declare dup method. * fhandler_registry.cc (fhandler_registry::exists): Fix missing parenthesis. (fhandler_registry::dup): New method. --- winsup/cygwin/ChangeLog | 7 ++++++ winsup/cygwin/fhandler.h | 1 + winsup/cygwin/fhandler_registry.cc | 34 +++++++++++++++++++++++------- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 007b29470..243407416 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2008-12-15 Corinna Vinschen + + * 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 * fhandler_disk_file.cc (readdir_get_ino): Don't complain about MS-DOS diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h index dd8821327..fdaf7d577 100644 --- a/winsup/cygwin/fhandler.h +++ b/winsup/cygwin/fhandler.h @@ -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; diff --git a/winsup/cygwin/fhandler_registry.cc b/winsup/cygwin/fhandler_registry.cc index 63da374c8..c45dc1c71 100644 --- a/winsup/cygwin/fhandler_registry.cc +++ b/winsup/cygwin/fhandler_registry.cc @@ -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; +}