common/socket_close: remove now only connectd talks to peer.

connectd does this internally now using ccan/io, with appropriate
credit for ZmnSCPxj who wrote this code in the first place.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2022-01-20 15:27:06 +10:30
parent 3281d72169
commit be299c0d59
5 changed files with 1 additions and 78 deletions

View file

@ -50,7 +50,6 @@ CLOSINGD_COMMON_OBJS := \
common/status_wiregen.o \ common/status_wiregen.o \
common/read_peer_msg.o \ common/read_peer_msg.o \
common/setup.o \ common/setup.o \
common/socket_close.o \
common/status.o \ common/status.o \
common/status_wire.o \ common/status_wire.o \
common/subdaemon.o \ common/subdaemon.o \

View file

@ -14,7 +14,6 @@
#include <common/peer_io.h> #include <common/peer_io.h>
#include <common/per_peer_state.h> #include <common/per_peer_state.h>
#include <common/read_peer_msg.h> #include <common/read_peer_msg.h>
#include <common/socket_close.h>
#include <common/status.h> #include <common/status.h>
#include <common/subdaemon.h> #include <common/subdaemon.h>
#include <common/type_to_string.h> #include <common/type_to_string.h>
@ -1097,10 +1096,7 @@ exit_thru_the_giftshop:
#endif #endif
/* We're done! */ /* We're done! */
/* Properly close the channel first. */
if (!socket_close(pps->peer_fd))
status_unusual("Closing and draining peerfd gave error: %s",
strerror(errno));
/* Sending the below will kill us! */ /* Sending the below will kill us! */
wire_sync_write(REQ_FD, take(towire_closingd_complete(NULL))); wire_sync_write(REQ_FD, take(towire_closingd_complete(NULL)));
tal_free(ctx); tal_free(ctx);

View file

@ -76,7 +76,6 @@ COMMON_SRC_NOGEN := \
common/route.c \ common/route.c \
common/setup.c \ common/setup.c \
common/shutdown_scriptpubkey.c \ common/shutdown_scriptpubkey.c \
common/socket_close.c \
common/sphinx.c \ common/sphinx.c \
common/status.c \ common/status.c \
common/status_levels.c \ common/status_levels.c \

View file

@ -1,48 +0,0 @@
#include "config.h"
#include <ccan/noerr/noerr.h>
#include <common/socket_close.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
/* makes read() return EINTR after 5 seconds */
static void break_read(int signum)
{
}
bool socket_close(int fd)
{
char unused[64];
struct sigaction act, old_act;
int sys_res, saved_errno;
/* We shutdown. Usually they then shutdown too, and read() gives 0 */
sys_res = shutdown(fd, SHUT_WR);
if (sys_res < 0) {
close_noerr(fd);
return false;
}
/* Let's not get too enthusiastic about waiting. */
memset(&act, 0, sizeof(act));
act.sa_handler = break_read;
sigaction(SIGALRM, &act, &old_act);
alarm(5);
while ((sys_res = read(fd, unused, sizeof(unused))) > 0);
saved_errno = errno;
alarm(0);
sigaction(SIGALRM, &old_act, NULL);
if (sys_res < 0) {
close(fd);
errno = saved_errno;
return false;
}
return close(fd) == 0;
}

View file

@ -1,23 +0,0 @@
/* common/socket_close - Properly close a socket,
* ensuring that any data we write just before
* the close has been transmitted to the other
* side, and ignoring any data the other side
* has sent at the time the close was started.
*
* Reference:
*
* http://ia800504.us.archive.org/3/items/TheUltimateSo_lingerPageOrWhyIsMyTcpNotReliable/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable.html
*/
#ifndef LIGHTNING_COMMON_SOCKET_CLOSE_H
#define LIGHTNING_COMMON_SOCKET_CLOSE_H
#include "config.h"
#include <stdbool.h>
/* Return false if something failed, true if
* nothing failed.
* If something failed, error is stored in
* `errno.
*/
bool socket_close(int fd);
#endif /* LIGHTNING_COMMON_SOCKET_CLOSE_H */