]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix truncation for the Android internal storage provider
authorPo Lu <luangruo@yahoo.com>
Tue, 8 Aug 2023 06:04:36 +0000 (14:04 +0800)
committerPo Lu <luangruo@yahoo.com>
Tue, 8 Aug 2023 06:04:36 +0000 (14:04 +0800)
* java/org/gnu/emacs/EmacsSafThread.java (openDocument1): If
truncate is specified while resorting to `w', try truncating the
file by hand.

java/org/gnu/emacs/EmacsSafThread.java

index 9f5d7f3d0cfb70b6fbc96e4924bb4bf7875c1587..421e82c5759e64672164e88fa62d7fb8f5045db6 100644 (file)
@@ -1598,7 +1598,7 @@ public final class EmacsSafThread extends HandlerThread
          /* Set mode to w when WRITE && !READ, disregarding TRUNCATE.
             In contradiction with the ContentResolver documentation,
             document providers seem to truncate files whenever w is
-            specified, at least superficially.  */
+            specified, at least superficially.  (But see below.)  */
          mode = "w";
       }
     else
@@ -1607,7 +1607,6 @@ public final class EmacsSafThread extends HandlerThread
     fileDescriptor
       = resolver.openFileDescriptor (documentUri, mode,
                                     signal);
-    Log.d (TAG, "openDocument1: " + mode + " " + fileDescriptor);
 
     /* If a writable on-disk file descriptor is requested and TRUNCATE
        is set, then probe the file descriptor to detect if it is
@@ -1644,6 +1643,12 @@ public final class EmacsSafThread extends HandlerThread
        if (fileDescriptor != null)
          EmacsNative.ftruncate (fileDescriptor.getFd ());
       }
+    else if (!read && write && truncate && fileDescriptor != null)
+      /* Moreover, document providers that return actual seekable
+        files characteristically neglect to truncate the file
+        returned when the access mode is merely w, so attempt to
+        truncate it by hand.  */
+      EmacsNative.ftruncate (fileDescriptor.getFd ());
 
     /* Every time a document is opened, remove it from the file status
        cache.  */