From 40ce29beacd5c8ec5816176ee5de3273da86126b Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Fri, 23 Jun 2017 16:03:20 +0930 Subject: [PATCH] wire_sync_write: support take() We often want it to free the message after writing. Signed-off-by: Rusty Russell --- lightningd/daemon_conn.c | 2 +- lightningd/opening/opening.c | 2 +- lightningd/status.c | 3 +-- wire/wire_sync.c | 9 +++++++-- wire/wire_sync.h | 2 +- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/lightningd/daemon_conn.c b/lightningd/daemon_conn.c index d9f417126..a66f69a23 100644 --- a/lightningd/daemon_conn.c +++ b/lightningd/daemon_conn.c @@ -46,7 +46,7 @@ bool daemon_conn_sync_flush(struct daemon_conn *dc) if (fd >= 0) { if (!fdpass_send(io_conn_fd(dc->conn), fd)) return false; - } else if (!wire_sync_write(io_conn_fd(dc->conn), msg)) + } else if (!wire_sync_write(io_conn_fd(dc->conn), take(msg))) return false; } return true; diff --git a/lightningd/opening/opening.c b/lightningd/opening/opening.c index a0feebd3d..a7af50c70 100644 --- a/lightningd/opening/opening.c +++ b/lightningd/opening/opening.c @@ -187,7 +187,7 @@ static u8 *read_next_peer_msg(struct state *state, const tal_t *ctx) tal_free(pong); } else if (gossip_msg(msg)) { /* We relay gossip to gossipd, but don't relay from */ - if (!wire_sync_write(GOSSIP_FD, msg)) + if (!wire_sync_write(GOSSIP_FD, take(msg))) peer_failed(PEER_FD, &state->cs, NULL, WIRE_OPENING_PEER_WRITE_FAILED, "Relaying gossip message"); diff --git a/lightningd/status.c b/lightningd/status.c index 453cbbbb9..a4ccbe446 100644 --- a/lightningd/status.c +++ b/lightningd/status.c @@ -65,9 +65,8 @@ static void status_send_with_hdr(u16 type, const void *p, size_t len) tal_resize(&msg, 65535); if (status_fd >= 0) { - if (!wire_sync_write(status_fd, msg)) + if (!wire_sync_write(status_fd, take(msg))) err(1, "Writing out status %u len %zu", type, len); - tal_free(msg); } else { daemon_conn_send(status_conn, take(msg)); } diff --git a/wire/wire_sync.c b/wire/wire_sync.c index 7222e66e8..da8ed6834 100644 --- a/wire/wire_sync.c +++ b/wire/wire_sync.c @@ -3,13 +3,18 @@ #include #include -bool wire_sync_write(int fd, const void *msg) +bool wire_sync_write(int fd, const void *msg TAKES) { be16 be_len = cpu_to_be16(tal_count(msg)); + bool ret; assert(be16_to_cpu(be_len) == tal_count(msg)); - return write_all(fd, &be_len, sizeof(be_len)) + ret = write_all(fd, &be_len, sizeof(be_len)) && write_all(fd, msg, tal_count(msg)); + + if (taken(msg)) + tal_free(msg); + return ret; } u8 *wire_sync_read(const tal_t *ctx, int fd) diff --git a/wire/wire_sync.h b/wire/wire_sync.h index e96ab9188..33b0ee73d 100644 --- a/wire/wire_sync.h +++ b/wire/wire_sync.h @@ -4,7 +4,7 @@ #include #include -bool wire_sync_write(int fd, const void *msg); +bool wire_sync_write(int fd, const void *msg TAKES); u8 *wire_sync_read(const tal_t *ctx, int fd); #endif /* LIGHTNING_WIRE_WIRE_SYNC_H */