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/08/17 18:31:47 UTC

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

Author: mturk
Date: Mon Aug 17 16:31:46 2009
New Revision: 805031

URL: http://svn.apache.org/viewvc?rev=805031&view=rev
Log:
We'll use inode for readdir as well

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=805031&r1=805030&r2=805031&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 Mon Aug 17 16:31:46 2009
@@ -53,10 +53,10 @@
 
 static __inline void FS2BS(wchar_t *path)
 {
-    size_t i;
-    for (i = 0; i < wcslen(path); i++) {
-        if (path[i] == L'/')
-            path[i] = L'\\';
+    while (*path) {
+        if (*path == L'/')
+            *path = L'\\';
+        path++;
     }
 }
 
@@ -121,6 +121,41 @@
     return -1;
 }
 
+ACR_DECLARE(acr_uint64_t) ACR_FileInodeGet(JNIEnv *_E, const wchar_t *fname)
+{
+    HANDLE fh;
+    acr_uint64_t rv = 0;
+    int ex = 0;
+
+    fh = CreateFileW(fname,
+                     0, /* Query attributes without accessing the file */
+                     FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+                     NULL,
+                     OPEN_EXISTING,
+                     FILE_FLAG_BACKUP_SEMANTICS,
+                     NULL);
+    if (fh != INVALID_HANDLE_VALUE) {
+        BY_HANDLE_FILE_INFORMATION fi;
+        if (GetFileInformationByHandle(fh, &fi)) {
+            rv = (((acr_uint64_t)fi.nFileIndexHigh + (acr_uint64_t)fi.dwVolumeSerialNumber) << 30) + fi.nFileIndexLow;
+            ex = 0;
+        }
+        else
+            ex = ACR_GET_OS_ERROR();
+        CloseHandle(fh);
+    }
+    else
+        ex = ACR_GET_OS_ERROR();
+    if (ex) {
+        rv = 0;
+        ACR_SET_OS_ERROR(ex);
+        if (!IS_INVALID_HANDLE(_E))
+            ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, ex);
+    }
+    return rv;
+}
+
+
 ACR_IO_EXPORT_DECLARE(int, File, ftype0)(ACR_JNISTDARGS, jstring pathname)
 {
     int type = ACR_FT_UNKFILE;
@@ -660,7 +695,7 @@
 ACR_IO_EXPORT_DECLARE(jboolean, File, fprot2)(ACR_JNISTDARGS, jstring pathname,
                                               jobject usr, jobject grp)
 {
-    int rc = EINVAL;
+    int rc = ACR_EINVAL;
 
     UNREFERENCED_O;
 
@@ -711,7 +746,7 @@
 ACR_IO_EXPORT_DECLARE(jboolean, File, attrs0)(ACR_JNISTDARGS, jstring pathname,
                                               jint attr, jint mask)
 {
-    int rc = EINVAL;
+    int rc = ACR_EINVAL;
     DWORD flags;
 
     UNREFERENCED_O;
@@ -784,31 +819,14 @@
 ACR_IO_EXPORT_DECLARE(jlong, File, inode0)(ACR_JNISTDARGS, jstring pathname)
 {
     jlong rv = 0;
-    int   ex = EINVAL;
+    int   ex = ACR_EINVAL;
 
     UNREFERENCED_O;
     WITH_WSTR(pathname) {
-        HANDLE fh;
         FS2BS(J2W(pathname));
 
-        fh = CreateFileW(J2W(pathname),
-                         0, /* Query attributes without accessing the file */
-                         FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
-                         NULL,
-                         OPEN_EXISTING,
-                         FILE_FLAG_BACKUP_SEMANTICS,
-                         NULL);
-        if (fh != INVALID_HANDLE_VALUE) {
-            BY_HANDLE_FILE_INFORMATION fi;
-            if (GetFileInformationByHandle(fh, &fi)) {
-                rv = (((jlong)fi.nFileIndexHigh + (jlong)fi.dwVolumeSerialNumber) << 30) + fi.nFileIndexLow;
-                ex = 0;
-            }
-            else
-                ex = ACR_GET_OS_ERROR();
-            CloseHandle(fh);
-        }
-        else
+        rv = (jlong)ACR_FileInodeGet(NULL, J2W(pathname));
+        if (rv == 0)
             ex = ACR_GET_OS_ERROR();
     } END_WITH_WSTR(pathname);