summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/fileio.c18
-rw-r--r--src/lisp.h1
-rw-r--r--src/process.c16
3 files changed, 25 insertions, 10 deletions
diff --git a/src/fileio.c b/src/fileio.c
index 39789e55ff5..b92492c93a6 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -196,8 +196,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);
@@ -207,10 +207,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
diff --git a/src/lisp.h b/src/lisp.h
index 731a45da11a..8ddd363d2dd 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4015,6 +4015,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);
diff --git a/src/process.c b/src/process.c
index 06324641346..aafb46c3615 100644
--- a/src/process.c
+++ b/src/process.c
@@ -3587,17 +3587,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;