]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix visiting and saving writable content provider files
authorPo Lu <luangruo@yahoo.com>
Fri, 3 Mar 2023 08:00:27 +0000 (16:00 +0800)
committerPo Lu <luangruo@yahoo.com>
Fri, 3 Mar 2023 08:00:27 +0000 (16:00 +0800)
* java/org/gnu/emacs/EmacsService.java (checkContentUri):
Improve debug output.
* lisp/files.el (basic-save-buffer): Check whether or not file
itself exists before checking for the existence of the directory
containing it.
* src/android.c (android_open): Don't forget to set errno after
open_content_uri fails.

java/org/gnu/emacs/EmacsService.java
lisp/files.el
src/android.c

index 67de5d26f53c3df91c9da2065f8760f4c04b9588..d9cb25f3e9c039fb68887934929a364cbaa24279 100644 (file)
@@ -752,6 +752,8 @@ public final class EmacsService extends Service
     if (writable)
       mode += "w";
 
+    Log.d (TAG, "checkContentUri: checking against mode " + mode);
+
     try
       {
        fd = resolver.openFileDescriptor (Uri.parse (name), mode);
index 387a3b5dc66614ec772409c4908d40802196b03f..35f317110650f1513bba03c6caa917ae1b057766 100644 (file)
@@ -5726,9 +5726,14 @@ Before and after saving the buffer, this function runs
                  (run-hook-with-args-until-success 'write-file-functions)
                  ;; If a hook returned t, file is already "written".
                  ;; Otherwise, write it the usual way now.
-                 (let ((dir (file-name-directory
+                 (let ((file (buffer-file-name))
+                        (dir (file-name-directory
                              (expand-file-name buffer-file-name))))
-                   (unless (file-exists-p dir)
+                    ;; Some systems have directories (like /content on
+                    ;; Android) in which files can exist without a
+                    ;; corresponding parent directory.
+                   (unless (or (file-exists-p file)
+                                (file-exists-p dir))
                      (if (y-or-n-p
                           (format-message
                             "Directory `%s' does not exist; create? " dir))
index 1e91abffa6ff7bf6adfb1ab1b2ef7eaa0f3e5f4b..656971e154fd89164196fbd194ddceccf0e900a4 100644 (file)
@@ -1715,9 +1715,19 @@ android_open (const char *filename, int oflag, int mode)
          return -1;
        }
 
+      /* If fd is -1, just assume that the file does not exist,
+        and return -1 with errno set to ENOENT.  */
+
+      if (fd == -1)
+       {
+         errno = ENOENT;
+         goto skip;
+       }
+
       if (mode & O_CLOEXEC)
        android_close_on_exec (fd);
 
+    skip:
       ANDROID_DELETE_LOCAL_REF (string);
       return fd;
     }