From 669eedb75c3ac988c75cc77b9703ac88de2eba24 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 10 Aug 2012 05:20:19 +0400 Subject: [PATCH] IdeaWin32: fix hardlink attributes reading --- bin/win/IdeaWin32.dll | Bin 35840 -> 35840 bytes bin/win/IdeaWin64.dll | Bin 41984 -> 41984 bytes native/IdeaWin32/IdeaWin32.cpp | 50 ++++++++++++++------------------- 3 files changed, 21 insertions(+), 29 deletions(-) diff --git a/bin/win/IdeaWin32.dll b/bin/win/IdeaWin32.dll index 62fc0d58ab9b716090a7bde7199c3406ae31d259..bb9c214e8025bf8c5e5dd8506fd8b3a2e557135d 100644 GIT binary patch delta 1484 zcmdti|4$ob90%~vb5Nv!(6GYFEOTTJ%BI08WGTlK8cQ~o&fMCDFRmLfh5?oqEoDM< zw6K!U97y3X!MPz$qn&ffvNMwrGYMIuCNn{Tk?0ba1(M2U!VlB1_`~^b9sh)vyz+Uz zKhHgP&l8#wLQ_I?Kie38`PGJF8J)AHRP%<-|HEm8?*27$7>yh&)OQ z+pXtmM3xpJ^LUY2xx|`SK+y|tvjufP=wjDWhZ)4~G^vwD9lTopB|iO+rpY5FzKS)Uy_JqFz`I{e*?M>7cKTb)puD1=V`k-%z6~4R zl;LMaBi4q&hK^$}?1#aLz9Q z-?mj98oCOuGp=Op7-LrT+>RUgimKauAw6xTj|?|wl)_?jhOE`i#uC|>T3GyRDr;6Y z_dH}F<?f$)ZA5!v$md90J)kLm7^e)i^e5MR|pAOp35J}(xKMcYo#NZoP zfxjW6pU4EyKsi){1aH7;7=$QHLk#9&5#q1`LXc=LSm6+yfZiazMiWTHU;*yH0}w(u z5>O5f@IX8Gp&z0!4PU@@Sb}@7sr==vdJ-p2B0Ts*=%i|M{l2{_ip|BxCa25pT8%a= zeBxcGzEX7O!K0sJ>o|gB7d?`{tFx^&(Cw+U*VszC+uQt})-JEN$JY_)Q>0TCHF)Yr z#=^>B@3a5!E$r}BDqs0R*@AGOE#PSB4%GPlU4HeYuB8;)*48%T7Q-c$xB-%^$RC6T zXx>J2HJ4~6AAf+6$cM5kunwhaP4{Kt+UeA6W>R$F$|o+Am6X?(zpvDWm(;?c-%@se rU$I&duSge5#Bxy*Jz}poDNc#A;)?iC+!Rff*2)I;smPizZb|(YCcnm3 delta 1496 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 MDapYb&rXQ>4|;GN0{{R3 delta 3558 zcmeH~e^8V69mhXU2pIWMf*L@j7;B1Y6^Tc>fz=jEw2v;jOi?*O8Wk;0SJ4KW?z$xk zSoM(_`e2K_c6HuXJ+ED9)9ZQbv^n539Sn76cQ{##H@C~KTyNWT8?EcI_b1N>{@EY< zcYiE*Z(i@`^Zot(e!fpaIBp8ZO_8O_Xy>x((E7Tb&VnVM^iC+~ZRst>bI=>;b);C; zn+Fy@wx)MRs@|u)>r(N3z4C~!IL>m;;*Pm6+Dkr0JO`j^AF3Y>-aYga!U#3@^s3H1DMunoh zp+7U_MkrdPa#j2LEqCBQ*AFJ9> zGU7zotKEagovlIB60e4mq1>*%<;hMLirQ|qZ1~RxYDbO3uWE5s8&2BXb&FG7c(p#G zQ&k(6)@o}qncIE{%T3x!>UjM0z?AaXpU&%}7Mp&+k{hxiis8N56{D>-EKS>Q1wPO` z4%d}7N1JTdQ4bI5ad=d?0E`a{4Wkg&i_mkQO;xq4N!vS{c{eiD4%-tg?1qv)m)ai7 zZF@4AOnN)K4*%r(OSvn1BJou+scOfKT`M0<)S9{7tBwTk;=z92-X|Ki^yvdrUr+|3 zn=_{?%2oZTtWC-@(aTxKlxZUyi7-HW4F*_+@oatiwwyeSbiS}bRc!0G6g(oeFK+xpTRbhiLD2xct2`>oy zg+s#MGVh1RB=D6m0~ek@`ND;#^xLKq-R}3~OuR3UgS0-n&p&^rqjcN#U3)wGt6#dC zx%z{(^L=S3s$Np>+rRg_JGKX&uHV(TW2-*!tT$Tt{Xw&BEJ8HbVj{~I#T2m;eF%-| zU;ePn=ITUAx{1==79vDTAeX)@G%v46JGqXkB3m;U2W znc~*3hvv+6zi70&W+TeUCz^O>uR%q6UbtXp5!bSs$=dibS=_JDWNm$U_}+pol&jQ| zrFn`!!$&k;O~kLVh~5%j@c*>NiQx0Unbr=>?7yb9e(F$luEq5Dj(~UT(}5NH_wU_L z`mI9;qkCEtY0D>4J%U?+Z$H9YIHe{$2caWS)eIuvbV}tPXU>lhy9rHyg|ElS=Xaa* zm|}hRn8h06^yZX402RSAk3-q;lNTXkT!@ZoM8ojRmFPYW&%-Ria29wTb^ybvNZ!eW zg`Z4qcuw)VkQp8fQ5NpV7Z{9L0^Q*Wf!Cpac;+zlCj8`mf}gx~@O=9|oQaM5;9LN0yzXy3Dc+WM%l*}fYffYExx1g~XaHYW6MTRc|pSl;jg2v6D zR!p=I{y6v%#BB$`d^=Gs;(jm;6`nBo8}Y;7-^GuEi$i#U@L+CmwfIKxtoU=_Ey#~f zM?l+s##R@CSH#D`O~|Z0s1pERfw<2&c>jE&R}puDyCI%X06YtEolpvh1em~?*ZMV#zdL55D&)G79meM zuyf!q7vcQ5U=R;$%8W`ra0m*Z(lv0s%kVYeP4Oe(&&tsW>hyr~+{O_&z?z4QNi*kt zljs+y;{az>AdldSKx-uy0B^0t`Kx%~>}7_1LC&)Jz(?5@qxq8IO5FFl{j8_=G%`O^#{RFwrVu6gPE(a0t{vc zJ&+UL2R1=2_-1e)>J&=K%!XesK@8XOnIJIZ|S+vx8E z&Y#UUd{`k0D!`i%Hy#1^d!S{n>5bqH4@J3^Yj(~NWj0x3) z7a{I520mPie28FSV5Ao3&y7#x;YJ-MfC6Sty%8@0GyPZr;@Myj^1w3>Z8hR;;Mzu< zF?S075emR3z?D1k-vPV|UWVR;9|adZiOIlMgyPzX6U+DrEow diff --git a/native/IdeaWin32/IdeaWin32.cpp b/native/IdeaWin32/IdeaWin32.cpp index f6648cc04978..838bc76460a0 100644 --- a/native/IdeaWin32/IdeaWin32.cpp +++ b/native/IdeaWin32/IdeaWin32.cpp @@ -142,42 +142,34 @@ JNIEXPORT void JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_initIDs JNIEXPORT jobject JNICALL Java_com_intellij_openapi_util_io_win32_IdeaWin32_getInfo0(JNIEnv *env, jobject method, jstring path) { - bool isDrive = false; - if (env->GetStringLength(path) == 2) { - const jchar* str = env->GetStringChars(path, NULL); - isDrive = (str[1] == ':'); - env->ReleaseStringChars(path, str); + WIN32_FILE_ATTRIBUTE_DATA attrData; + const jchar* str = env->GetStringChars(path, 0); + BOOL res = GetFileAttributesEx((LPCWSTR)str, GetFileExInfoStandard, &attrData); + env->ReleaseStringChars(path, str); + if (!res) { + return NULL; } WIN32_FIND_DATA data; - HANDLE h = INVALID_HANDLE_VALUE; + data.dwFileAttributes = attrData.dwFileAttributes; + data.dwReserved0 = 0; + data.ftLastWriteTime = attrData.ftLastWriteTime; + data.nFileSizeLow = attrData.nFileSizeLow; + data.nFileSizeHigh = attrData.nFileSizeHigh; - if (!isDrive) { - h = FindFileInner(env, path, &data); - if (h == INVALID_HANDLE_VALUE && GetLastError() != ERROR_ACCESS_DENIED) { - return NULL; + if (IS_SET(attrData.dwFileAttributes, FILE_ATTRIBUTE_REPARSE_POINT)) { + WIN32_FIND_DATA findData; + HANDLE h = FindFileInner(env, path, &findData); + if (h != INVALID_HANDLE_VALUE) { + FindClose(h); + data.dwFileAttributes = findData.dwFileAttributes; + data.dwReserved0 = findData.dwReserved0; + data.ftLastWriteTime = findData.ftLastWriteTime; + data.nFileSizeLow = findData.nFileSizeLow; + data.nFileSizeHigh = findData.nFileSizeHigh; } } - if (h == INVALID_HANDLE_VALUE) { - WIN32_FILE_ATTRIBUTE_DATA attrData; - const jchar* str = env->GetStringChars(path, 0); - BOOL res = GetFileAttributesEx((LPCWSTR)str, GetFileExInfoStandard, &attrData); - env->ReleaseStringChars(path, str); - if (!res) { - return NULL; - } - - data.dwFileAttributes = attrData.dwFileAttributes; - data.dwReserved0 = 0; - data.ftLastWriteTime = attrData.ftLastWriteTime; - data.nFileSizeLow = attrData.nFileSizeLow; - data.nFileSizeHigh = attrData.nFileSizeHigh; - } - else { - FindClose(h); - } - jclass fileInfoClass = getFileInfoClass(env); if (fileInfoClass == NULL) { return NULL;