From f368eec16e2c47896e2b9e94f78bd1b77991774b Mon Sep 17 00:00:00 2001 From: Siep Kroonenberg Date: Wed, 26 Apr 2017 11:27:52 +0000 Subject: Windows only new filetypes: take other read failures into account git-svn-id: svn://tug.org/texlive/trunk@44058 c570f23f-e606-0410-a88d-b1316a301751 --- Master/tlpkg/TeXLive/TLWinGoo.pm | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/Master/tlpkg/TeXLive/TLWinGoo.pm b/Master/tlpkg/TeXLive/TLWinGoo.pm index 36ae998c70c..53946538912 100644 --- a/Master/tlpkg/TeXLive/TLWinGoo.pm +++ b/Master/tlpkg/TeXLive/TLWinGoo.pm @@ -798,20 +798,50 @@ sub do_remove_regkey { return 1; } +############################# +# not overwriting an existing file association + +# read error is sometimes access_denied, +# therefore we ONLY decide that a value does not exist if +# an attempt to read it errors out with file_not_found. + +# windows error codes +my $file_not_found = 2; # ERROR_FILE_NOT_FOUND +my $reg_ok = 0; # ERROR_SUCCESS + +# inaccessible value (note. actual filetypes shound not have spaces) +my $reg_unknown = 'not accessible'; + # Effective default value of any key under Classes. # admin: HKLM; user: HKCU or otherwise HKLM -# Reject if there is no corresponding key under classes sub current_filetype { my $extension = shift; my $filetype; + my $regerror; + if ($is_admin) { - $filetype = lm_root()->{"Software/Classes/$extension//"}; # REG_SZ + $regerror = $reg_ok; + $filetype = lm_root()->{"Software/Classes/$extension//"} # REG_SZ + or $regerror = Win32API::Registry::regLastError(); + if ($regerror != $reg_ok and $regerror != $file_not_found) { + return $reg_unknown; + } } else { # Mysterious failures on w7_64 => merge HKLM/HKCU info explicitly # rather than checking HKCR - $filetype = cu_root()->{"Software/Classes/$extension//"}; + $regerror = $reg_ok; + $filetype = cu_root()->{"Software/Classes/$extension//"} or + $regerror = Win32API::Registry::regLastError(); + if ($regerror != $reg_ok and $regerror != $file_not_found) { + return $reg_unknown; + } if (!defined($filetype) or ($filetype eq "")) { - $filetype = lm_root()->{"Software/Classes/$extension//"} + $regerror = $reg_ok; + $filetype = lm_root()->{"Software/Classes/$extension//"} or + $regerror = Win32API::Registry::regLastError(); + if ($regerror != $reg_ok and $regerror != $file_not_found) { + return $reg_unknown; + } }; } $filetype = "" unless defined($filetype); -- cgit v1.2.3