[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 8832de4 2/2: Merge branch 'master' of git.sv.gnu.or
From: |
Michael Albinus |
Subject: |
[Emacs-diffs] master 8832de4 2/2: Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs |
Date: |
Wed, 16 Jan 2019 07:57:12 -0500 (EST) |
branch: master
commit 8832de4f937aafdc58f5fa5a07b3aca549314901
Merge: b2497ef 655badc
Author: Michael Albinus <address@hidden>
Commit: Michael Albinus <address@hidden>
Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs
---
lib-src/make-fingerprint.c | 4 +-
lisp/loadup.el | 5 ++-
make-dist | 2 +-
src/dmpstruct.awk | 17 ++++++++
src/fingerprint-dummy.c | 3 +-
src/fingerprint.h | 3 +-
src/gnutls.c | 96 ++++++++++++++++++++++++++--------------------
src/pdumper.c | 17 ++++++++
src/pdumper.h | 3 +-
src/process.c | 28 ++++++++++----
10 files changed, 117 insertions(+), 61 deletions(-)
diff --git a/lib-src/make-fingerprint.c b/lib-src/make-fingerprint.c
index 69558a8..d310366 100644
--- a/lib-src/make-fingerprint.c
+++ b/lib-src/make-fingerprint.c
@@ -1,7 +1,7 @@
/* Hash inputs and generate C file with the digest.
-Copyright (C) 1985-1986, 1992-1994, 1997, 1999-2016 Free Software
-Foundation, Inc.
+Copyright (C) 1985-1986, 1992-1994, 1997, 1999-2016, 2018-2019
+Free Software Foundation, Inc.
This file is part of GNU Emacs.
diff --git a/lisp/loadup.el b/lisp/loadup.el
index 0f0ca15..100c3f7 100644
--- a/lisp/loadup.el
+++ b/lisp/loadup.el
@@ -488,8 +488,9 @@ lost after dumping")))
;; same as invocation-directory.
(let (success)
(unwind-protect
- (progn
- (if (member dump-mode '("pdump" "pbootstrap"))
+ (let ((tmp-dump-mode dump-mode)
+ (dump-mode nil))
+ (if (member tmp-dump-mode '("pdump" "pbootstrap"))
(dump-emacs-portable (expand-file-name output
invocation-directory))
(dump-emacs output "temacs")
(message "%d pure bytes used" pure-bytes-used))
diff --git a/make-dist b/make-dist
index dac5f9a..20be62d 100755
--- a/make-dist
+++ b/make-dist
@@ -472,7 +472,7 @@ echo "Making links to 'src'"
(cd src &&
ln [a-zA-Z]*.[chm] ../${tempdir}/src &&
ln [a-zA-Z]*.in ../${tempdir}/src &&
- ln deps.mk ../${tempdir}/src &&
+ ln deps.mk dmpstruct.awk ../${tempdir}/src &&
ln README ChangeLog.*[0-9] ../${tempdir}/src &&
ln .gdbinit .dbxinit ../${tempdir}/src &&
cd ../${tempdir}/src &&
diff --git a/src/dmpstruct.awk b/src/dmpstruct.awk
index d222d11..55626cf 100755
--- a/src/dmpstruct.awk
+++ b/src/dmpstruct.awk
@@ -1,3 +1,20 @@
+# Copyright (C) 2018-2019 Free Software Foundation, Inc.
+#
+# This file is part of GNU Emacs.
+#
+# GNU Emacs is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or (at
+# your option) any later version.
+#
+# GNU Emacs is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
+
BEGIN {
print "/* Generated by dmpstruct.awk */"
print "#ifndef EMACS_DMPSTRUCT_H"
diff --git a/src/fingerprint-dummy.c b/src/fingerprint-dummy.c
index 295654a..1603519 100644
--- a/src/fingerprint-dummy.c
+++ b/src/fingerprint-dummy.c
@@ -1,7 +1,6 @@
/* Dummy fingerprint
-Copyright (C) 2016 Free Software Foundation,
-Inc.
+Copyright (C) 2016, 2018-2019 Free Software Foundation, Inc.
This file is part of GNU Emacs.
diff --git a/src/fingerprint.h b/src/fingerprint.h
index b48d40f..913b668 100644
--- a/src/fingerprint.h
+++ b/src/fingerprint.h
@@ -1,7 +1,6 @@
/* Header file for the Emacs build fingerprint.
-Copyright (C) 2016 Free Software Foundation,
-Inc.
+Copyright (C) 2016, 2018-2019 Free Software Foundation, Inc.
This file is part of GNU Emacs.
diff --git a/src/gnutls.c b/src/gnutls.c
index d0cb28d..63dbcf4 100644
--- a/src/gnutls.c
+++ b/src/gnutls.c
@@ -72,7 +72,7 @@ along with GNU Emacs. If not, see
<https://www.gnu.org/licenses/>. */
# include "w32.h"
# endif
-static bool emacs_gnutls_handle_error (gnutls_session_t, int);
+static int emacs_gnutls_handle_error (gnutls_session_t, int);
static bool gnutls_global_initialized;
@@ -579,15 +579,17 @@ gnutls_try_handshake (struct Lisp_Process *proc)
if (non_blocking)
proc->gnutls_p = true;
- do
+ while ((ret = gnutls_handshake (state)) < 0)
{
- ret = gnutls_handshake (state);
- emacs_gnutls_handle_error (state, ret);
+ do
+ ret = gnutls_handshake (state);
+ while (ret == GNUTLS_E_INTERRUPTED);
+
+ if (0 <= ret || emacs_gnutls_handle_error (state, ret) == 0
+ || non_blocking)
+ break;
maybe_quit ();
}
- while (ret < 0
- && gnutls_error_is_fatal (ret) == 0
- && ! non_blocking);
proc->gnutls_initstage = GNUTLS_STAGE_HANDSHAKE_TRIED;
@@ -682,8 +684,6 @@ emacs_gnutls_transport_set_errno (gnutls_session_t state,
int err)
ptrdiff_t
emacs_gnutls_write (struct Lisp_Process *proc, const char *buf, ptrdiff_t
nbyte)
{
- ssize_t rtnval = 0;
- ptrdiff_t bytes_written;
gnutls_session_t state = proc->gnutls_state;
if (proc->gnutls_initstage != GNUTLS_STAGE_READY)
@@ -692,25 +692,19 @@ emacs_gnutls_write (struct Lisp_Process *proc, const char
*buf, ptrdiff_t nbyte)
return 0;
}
- bytes_written = 0;
+ ptrdiff_t bytes_written = 0;
while (nbyte > 0)
{
- rtnval = gnutls_record_send (state, buf, nbyte);
+ ssize_t rtnval;
+ do
+ rtnval = gnutls_record_send (state, buf, nbyte);
+ while (rtnval == GNUTLS_E_INTERRUPTED);
if (rtnval < 0)
{
- if (rtnval == GNUTLS_E_INTERRUPTED)
- continue;
- else
- {
- /* If we get GNUTLS_E_AGAIN, then set errno
- appropriately so that send_process retries the
- correct way instead of erroring out. */
- if (rtnval == GNUTLS_E_AGAIN)
- errno = EAGAIN;
- break;
- }
+ emacs_gnutls_handle_error (state, rtnval);
+ break;
}
buf += rtnval;
@@ -718,14 +712,12 @@ emacs_gnutls_write (struct Lisp_Process *proc, const char
*buf, ptrdiff_t nbyte)
bytes_written += rtnval;
}
- emacs_gnutls_handle_error (state, rtnval);
return (bytes_written);
}
ptrdiff_t
emacs_gnutls_read (struct Lisp_Process *proc, char *buf, ptrdiff_t nbyte)
{
- ssize_t rtnval;
gnutls_session_t state = proc->gnutls_state;
if (proc->gnutls_initstage != GNUTLS_STAGE_READY)
@@ -734,19 +726,18 @@ emacs_gnutls_read (struct Lisp_Process *proc, char *buf,
ptrdiff_t nbyte)
return -1;
}
- rtnval = gnutls_record_recv (state, buf, nbyte);
+ ssize_t rtnval;
+ do
+ rtnval = gnutls_record_recv (state, buf, nbyte);
+ while (rtnval == GNUTLS_E_INTERRUPTED);
+
if (rtnval >= 0)
return rtnval;
else if (rtnval == GNUTLS_E_UNEXPECTED_PACKET_LENGTH)
/* The peer closed the connection. */
return 0;
- else if (emacs_gnutls_handle_error (state, rtnval))
- /* non-fatal error */
- return -1;
- else {
- /* a fatal error occurred */
- return 0;
- }
+ else
+ return emacs_gnutls_handle_error (state, rtnval);
}
static char const *
@@ -757,25 +748,24 @@ emacs_gnutls_strerror (int err)
}
/* Report a GnuTLS error to the user.
- Return true if the error code was successfully handled. */
-static bool
+ SESSION is the GnuTLS session, ERR is the (negative) GnuTLS error code.
+ Return 0 if the error was fatal, -1 (setting errno) otherwise so
+ that the caller can notice the error and attempt a repair. */
+static int
emacs_gnutls_handle_error (gnutls_session_t session, int err)
{
- int max_log_level = 0;
-
- bool ret;
+ int ret;
/* TODO: use a Lisp_Object generated by gnutls_make_error? */
- if (err >= 0)
- return 1;
check_memory_full (err);
- max_log_level = global_gnutls_log_level;
+ int max_log_level = global_gnutls_log_level;
/* TODO: use gnutls-error-fatalp and gnutls-error-string. */
char const *str = emacs_gnutls_strerror (err);
+ int errnum = EINVAL;
if (gnutls_error_is_fatal (err))
{
@@ -789,11 +779,11 @@ emacs_gnutls_handle_error (gnutls_session_t session, int
err)
# endif
GNUTLS_LOG2 (level, max_log_level, "fatal error:", str);
- ret = false;
+ ret = 0;
}
else
{
- ret = true;
+ ret = -1;
switch (err)
{
@@ -809,6 +799,26 @@ emacs_gnutls_handle_error (gnutls_session_t session, int
err)
"non-fatal error:",
str);
}
+
+ switch (err)
+ {
+ case GNUTLS_E_AGAIN:
+ errnum = EAGAIN;
+ break;
+
+# ifdef EMSGSIZE
+ case GNUTLS_E_LARGE_PACKET:
+ case GNUTLS_E_PUSH_ERROR:
+ errnum = EMSGSIZE;
+ break;
+# endif
+
+# if defined HAVE_GNUTLS3 && defined ECONNRESET
+ case GNUTLS_E_PREMATURE_TERMINATION:
+ errnum = ECONNRESET;
+ break;
+# endif
+ }
}
if (err == GNUTLS_E_WARNING_ALERT_RECEIVED
@@ -822,6 +832,8 @@ emacs_gnutls_handle_error (gnutls_session_t session, int
err)
GNUTLS_LOG2 (level, max_log_level, "Received alert: ", str);
}
+
+ errno = errnum;
return ret;
}
diff --git a/src/pdumper.c b/src/pdumper.c
index cf2aaf4..3787408 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -1,3 +1,20 @@
+/* Copyright (C) 2018-2019 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+GNU Emacs is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
+
#include <config.h>
#include <errno.h>
diff --git a/src/pdumper.h b/src/pdumper.h
index 8ed4fc1..7b52c64 100644
--- a/src/pdumper.h
+++ b/src/pdumper.h
@@ -1,7 +1,6 @@
/* Header file for the portable dumper.
-Copyright (C) 2016 Free Software Foundation,
-Inc.
+Copyright (C) 2016, 2018-2019 Free Software Foundation, Inc.
This file is part of GNU Emacs.
diff --git a/src/process.c b/src/process.c
index 06555ba..c074140 100644
--- a/src/process.c
+++ b/src/process.c
@@ -5840,7 +5840,8 @@ read_and_dispose_of_process_output (struct Lisp_Process
*p, char *chars,
/* Read pending output from the process channel,
starting with our buffered-ahead character if we have one.
- Yield number of decoded characters read.
+ Yield number of decoded characters read,
+ or -1 (setting errno) if there is a read error.
This function reads at most 4096 characters.
If you want to read all available subprocess output,
@@ -5870,8 +5871,10 @@ read_process_output (Lisp_Object proc, int channel)
if (DATAGRAM_CHAN_P (channel))
{
socklen_t len = datagram_address[channel].len;
- nbytes = recvfrom (channel, chars + carryover, readmax,
- 0, datagram_address[channel].sa, &len);
+ do
+ nbytes = recvfrom (channel, chars + carryover, readmax,
+ 0, datagram_address[channel].sa, &len);
+ while (nbytes < 0 && errno == EINTR);
}
else
#endif
@@ -5921,8 +5924,6 @@ read_process_output (Lisp_Object proc, int channel)
p->decoding_carryover = 0;
- /* At this point, NBYTES holds number of bytes just received
- (including the one in proc_buffered_char[channel]). */
if (nbytes <= 0)
{
if (nbytes < 0 || coding->mode & CODING_MODE_LAST_BLOCK)
@@ -5930,6 +5931,9 @@ read_process_output (Lisp_Object proc, int channel)
coding->mode |= CODING_MODE_LAST_BLOCK;
}
+ /* At this point, NBYTES holds number of bytes just received
+ (including the one in proc_buffered_char[channel]). */
+
/* Ignore carryover, it's been added by a previous iteration already. */
p->nbytes_read += nbytes;
@@ -6372,9 +6376,17 @@ send_process (Lisp_Object proc, const char *buf,
ptrdiff_t len,
#ifdef DATAGRAM_SOCKETS
if (DATAGRAM_CHAN_P (outfd))
{
- rv = sendto (outfd, cur_buf, cur_len,
- 0, datagram_address[outfd].sa,
- datagram_address[outfd].len);
+ while (true)
+ {
+ rv = sendto (outfd, cur_buf, cur_len, 0,
+ datagram_address[outfd].sa,
+ datagram_address[outfd].len);
+ if (! (rv < 0 && errno == EINTR))
+ break;
+ if (pending_signals)
+ process_pending_signals ();
+ }
+
if (rv >= 0)
written = rv;
else if (errno == EMSGSIZE)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master 8832de4 2/2: Merge branch 'master' of git.sv.gnu.org:/srv/git/emacs,
Michael Albinus <=