[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#62990: 30.0.50; UDP server closes connection upon receiving an empty
From: |
Robert Pluim |
Subject: |
bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet |
Date: |
Wed, 26 Apr 2023 11:14:42 +0200 |
So allowing emacs to send 0-length UDP packets turned out to be not
too hard. Patch for both below. Eli, is this OK for master? It does
change 2 behaviours:
1. Receiving a 0-length UDP packet will no longer cause an error
2. Calling (process-send-string proc "") now actually sends out a
packet for a UDP process (an empty one).
Robert
--
>From 4bb6dec25ad3c3b548e18e82b2129b53c1ee1b69 Mon Sep 17 00:00:00 2001
From: Robert Pluim <rpluim@gmail.com>
Date: Tue, 25 Apr 2023 12:48:26 +0200
Subject: [PATCH] Allow zero-length UDP send/receive
To: emacs-devel@gnu.org
* src/process.c (wait_reading_process_output) [DATAGRAM_SOCKETS]:
Don't close the network connection if we receive a zero-length UDP
packet.
(send_process) [DATAGRAM_SOCKETS]: Allow sending a zero-length UDP
packet.
* etc/NEWS: Announce the change.
---
etc/NEWS | 8 ++++++++
src/process.c | 16 ++++++++++++++--
2 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/etc/NEWS b/etc/NEWS
index ea233865f5a..4cc02d76b8f 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -82,6 +82,14 @@ The ':keepalive-idle', ':keepalive-interval', and
':keepalive-count'
options can now be used to set the various timers and counters used
when TCP keepalive is enabled for a connection.
+** Emacs can now send zero-length UDP packets.
+Previously 'process-send-string' of an empty string to a UDP process
+did nothing, now it sends out a zero-length UDP packet.
+
+** Emacs can now receive zero-length UDP packets.
+Previously, receiving a zero-length UDP packet closed the receiving
+network process. They are now silently ignored.
+
* Editing Changes in Emacs 30.1
diff --git a/src/process.c b/src/process.c
index 8e467ff7511..e3233f5ad89 100644
--- a/src/process.c
+++ b/src/process.c
@@ -5947,6 +5947,11 @@ wait_reading_process_output (intmax_t time_limit, int
nsecs, int read_kbd,
#endif /* HAVE_PTYS */
/* If we can detect process termination, don't consider the
process gone just because its pipe is closed. */
+#ifdef DATAGRAM_SOCKETS
+ /* A zero byte read on a UDP socket is not an error. */
+ else if (nread == 0 && DATAGRAM_CHAN_P (channel))
+ got_some_output = 1;
+#endif
else if (nread == 0 && !NETCONN_P (proc) && !SERIALCONN_P (proc)
&& !PIPECONN_P (proc))
;
@@ -6616,9 +6621,16 @@ send_process (Lisp_Object proc, const char *buf,
ptrdiff_t len,
cur_buf = buf;
cur_object = object;
}
-
- while (cur_len > 0)
+ /* UDP allows zero-length writes. */
+ bool zero_length = false;
+#ifdef DATAGRAM_SOCKETS
+ if (cur_len == 0 && NETCONN_P (proc) && 0 <= p->outfd
+ && DATAGRAM_CHAN_P (p->outfd))
+ zero_length = true;
+#endif
+ while (cur_len > 0 || zero_length)
{
+ zero_length = false;
/* Send this batch, using one or more write calls. */
ptrdiff_t written = 0;
int outfd = p->outfd;
--
2.38.1.420.g319605f8f0
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Vasilij Schneidermann, 2023/04/21
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Robert Pluim, 2023/04/24
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Vasilij Schneidermann, 2023/04/24
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Robert Pluim, 2023/04/25
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet,
Robert Pluim <=
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Eli Zaretskii, 2023/04/26
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Robert Pluim, 2023/04/26
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Eli Zaretskii, 2023/04/26
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Robert Pluim, 2023/04/26
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Eli Zaretskii, 2023/04/26
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Robert Pluim, 2023/04/26
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Vasilij Schneidermann, 2023/04/26
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Vasilij Schneidermann, 2023/04/26
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Robert Pluim, 2023/04/26
- bug#62990: 30.0.50; UDP server closes connection upon receiving an empty packet, Robert Pluim, 2023/04/26