emacs-diffs
[Top][All Lists]
Advanced

[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)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]