You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/06/30 11:23:15 UTC

svn commit: r789634 - /commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c

Author: mturk
Date: Tue Jun 30 09:23:14 2009
New Revision: 789634

URL: http://svn.apache.org/viewvc?rev=789634&view=rev
Log:
Implement fileId for Windows

Modified:
    commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c

Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c?rev=789634&r1=789633&r2=789634&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c Tue Jun 30 09:23:14 2009
@@ -781,3 +781,44 @@
     }
 }
 
+ACR_IO_EXPORT_DECLARE(jlong, File, inode0)(ACR_JNISTDARGS, jstring pathname)
+{
+    jlong rv = 0;
+    int   ex = EINVAL;
+
+    UNREFERENCED_O;
+    WITH_WSTR(pathname) {
+        HANDLE fh;
+        FS2BS(J2W(pathname));
+
+        fh = CreateFileW(J2W(pathname),
+                        GENERIC_READ,
+                        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+                        NULL,
+                        OPEN_EXISTING,
+                        0,
+                        NULL);
+        if (fh != INVALID_HANDLE_VALUE) {
+            BY_HANDLE_FILE_INFORMATION fi;
+            if (GetFileInformationByHandle(fh, &fi)) {
+                rv = (((jlong)fi.nFileIndexHigh + (jlong)fi.dwVolumeSerialNumber) << 31) + fi.nFileIndexLow;
+                ex = 0;
+            }
+            else
+                ex = ACR_GET_OS_ERROR();
+            CloseHandle(fh);
+        }
+        else
+            ex = ACR_GET_OS_ERROR();
+    } END_WITH_WSTR(pathname);
+
+    if (ex) {
+        if (ACR_STATUS_IS_EACCES(ex)) {
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
+        }
+        else if (!ACR_STATUS_IS_EEXIST(ex)) {
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, ex);
+        }
+    }
+    return rv;
+}