]> git.eshelyaron.com Git - emacs.git/commitdiff
Make async :family 'local failures fail correctly again
authorLars Ingebrigtsen <larsi@gnus.org>
Sun, 22 Jul 2018 11:39:10 +0000 (13:39 +0200)
committerNoam Postavsky <npostavs@gmail.com>
Wed, 8 Aug 2018 23:30:50 +0000 (19:30 -0400)
* src/fileio.c (get_file_errno_data): Refactor out into its own
function so that we can reuse the error handling from an async
context (bug#31901).

* src/process.c (connect_network_socket): When an async :family
'local client fails (with a file error, for instance), mark the
process as failed.

(cherry picked from commit 92ba34d89ac4f5b5bbb818e1c39a3cc12a405790)

src/fileio.c
src/lisp.h
src/process.c

index 9dbe3ad788ef5502b4c162844f3e89cc9cc3020c..e2be7fe2c691cf4ed36f070ac8d7f37f1f1db90f 100644 (file)
@@ -195,8 +195,8 @@ check_writable (const char *filename, int amode)
    list before reporting it; this saves report_file_errno's caller the
    trouble of preserving errno before calling list1.  */
 
-void
-report_file_errno (char const *string, Lisp_Object name, int errorno)
+Lisp_Object
+get_file_errno_data (char const *string, Lisp_Object name, int errorno)
 {
   Lisp_Object data = CONSP (name) || NILP (name) ? name : list1 (name);
   char *str = emacs_strerror (errorno);
@@ -206,10 +206,18 @@ report_file_errno (char const *string, Lisp_Object name, int errorno)
   Lisp_Object errdata = Fcons (errstring, data);
 
   if (errorno == EEXIST)
-    xsignal (Qfile_already_exists, errdata);
+    return Fcons (Qfile_already_exists, errdata);
   else
-    xsignal (errorno == ENOENT ? Qfile_missing : Qfile_error,
-            Fcons (build_string (string), errdata));
+    return Fcons (errorno == ENOENT ? Qfile_missing : Qfile_error,
+                 Fcons (build_string (string), errdata));
+}
+
+void
+report_file_errno (char const *string, Lisp_Object name, int errorno)
+{
+  Lisp_Object data = get_file_errno_data (string, name, errorno);
+
+  xsignal (Fcar (data), Fcdr (data));
 }
 
 /* Signal a file-access failure that set errno.  STRING describes the
index b2449cb87d3ae9189a93bfbdc665d8052c915951..05d1cd8201a5edbd19c1205e9ec93da63b65c234 100644 (file)
@@ -4031,6 +4031,7 @@ extern Lisp_Object write_region (Lisp_Object, Lisp_Object, Lisp_Object,
 extern void close_file_unwind (int);
 extern void fclose_unwind (void *);
 extern void restore_point_unwind (Lisp_Object);
+extern Lisp_Object get_file_errno_data (const char *, Lisp_Object, int);
 extern _Noreturn void report_file_errno (const char *, Lisp_Object, int);
 extern _Noreturn void report_file_error (const char *, Lisp_Object);
 extern _Noreturn void report_file_notify_error (const char *, Lisp_Object);
index 8629f834e7945e3032f7a0938e2c46eef48334d3..676f38446e4f0518a865102ace9f9718834aaf09 100644 (file)
@@ -3578,17 +3578,23 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos,
 
   if (s < 0)
     {
+      const char *err = (p->is_server
+                        ? "make server process failed"
+                        : "make client process failed");
+
       /* If non-blocking got this far - and failed - assume non-blocking is
         not supported after all.  This is probably a wrong assumption, but
         the normal blocking calls to open-network-stream handles this error
         better.  */
       if (p->is_non_blocking_client)
-       return;
+       {
+         Lisp_Object data = get_file_errno_data (err, contact, xerrno);
+
+         pset_status (p, list2 (Fcar (data), Fcdr (data)));
+         return;
+       }
 
-      report_file_errno ((p->is_server
-                         ? "make server process failed"
-                         : "make client process failed"),
-                        contact, xerrno);
+      report_file_errno (err, contact, xerrno);
     }
 
   inch = s;