1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-25 06:50:46 -08:00

Update Android port

* java/org/gnu/emacs/EmacsNative.java: Declare ftruncate.

* java/org/gnu/emacs/EmacsSafThread.java (openDocument1): If
initially opening with rwt, verify the file descriptor is really
writable; if not, resort to rw and truncating the file descriptor
by hand instead.

* src/androidvfs.c (NATIVE_NAME (ftruncate)): New function.
Truncate file descriptor and return whether that was successful.
This commit is contained in:
Po Lu 2023-08-06 21:45:29 +08:00
parent 669a4b96c3
commit 7873369338
4 changed files with 57 additions and 1 deletions

View file

@ -24,6 +24,7 @@ import java.util.HashMap;
import java.util.Iterator;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.content.ContentResolver;
import android.database.Cursor;
@ -1597,6 +1598,42 @@ public final class EmacsSafThread extends HandlerThread
= resolver.openFileDescriptor (documentUri, mode,
signal);
/* If a writable file descriptor is requested and TRUNCATE is set,
then probe the file descriptor to detect if it is actually
readable. If not, close this file descriptor and reopen it
with MODE set to rw; some document providers granting access to
Samba shares don't implement rwt, but these document providers
invariably truncate the file opened even when the mode is
merely rw.
This may be ascribed to a mix-up in Android's documentation
regardin DocumentsProvider: the `openDocument' function is only
documented to accept r or rw, whereas the default
implementation of the `openFile' function (which documents rwt)
delegates to `openDocument'. */
if (write && truncate && fileDescriptor != null
&& !EmacsNative.ftruncate (fileDescriptor.getFd ()))
{
try
{
fileDescriptor.closeWithError ("File descriptor requested"
+ " is not writable");
}
catch (IOException e)
{
Log.w (TAG, "Leaking unclosed file descriptor " + e);
}
fileDescriptor
= resolver.openFileDescriptor (documentUri, "rw", signal);
/* Try to truncate fileDescriptor just to stay on the safe
side. */
if (fileDescriptor != null)
EmacsNative.ftruncate (fileDescriptor.getFd ());
}
/* Every time a document is opened, remove it from the file status
cache. */
toplevel = getCache (treeUri);