mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-20 07:34:24 +01:00
subdaemon: always set incoming fds to blocking.
The gossip daemon didn't, but we shouldn't rely on it doing so anyway. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
@@ -45,6 +45,19 @@ static bool move_fd(int from, int to)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FIXME: Expose the ccan/io version? */
|
||||||
|
static void set_blocking(int fd, bool block)
|
||||||
|
{
|
||||||
|
int flags = fcntl(fd, F_GETFL);
|
||||||
|
|
||||||
|
if (block)
|
||||||
|
flags &= ~O_NONBLOCK;
|
||||||
|
else
|
||||||
|
flags |= O_NONBLOCK;
|
||||||
|
|
||||||
|
fcntl(fd, F_SETFL, flags);
|
||||||
|
}
|
||||||
|
|
||||||
/* We use sockets, not pipes, because fds are bidir. */
|
/* We use sockets, not pipes, because fds are bidir. */
|
||||||
static int subdaemon(const char *dir, const char *name, bool debug,
|
static int subdaemon(const char *dir, const char *name, bool debug,
|
||||||
int *statusfd, int *reqfd, va_list ap)
|
int *statusfd, int *reqfd, va_list ap)
|
||||||
@@ -166,6 +179,9 @@ static struct io_plan *status_process_fd(struct io_conn *conn,
|
|||||||
{
|
{
|
||||||
const tal_t *tmpctx = tal_tmpctx(sd);
|
const tal_t *tmpctx = tal_tmpctx(sd);
|
||||||
|
|
||||||
|
/* Don't trust subdaemon to set it blocking. */
|
||||||
|
set_blocking(sd->status_fd_in, true);
|
||||||
|
|
||||||
/* Ensure we free it iff callback doesn't tal_steal it. */
|
/* Ensure we free it iff callback doesn't tal_steal it. */
|
||||||
tal_steal(tmpctx, sd->status_in);
|
tal_steal(tmpctx, sd->status_in);
|
||||||
sd->statuscb(sd, sd->status_in, sd->status_fd_in);
|
sd->statuscb(sd, sd->status_in, sd->status_fd_in);
|
||||||
@@ -303,6 +319,11 @@ static struct io_plan *req_finished_reply(struct io_conn *conn,
|
|||||||
struct subdaemon_req *sr)
|
struct subdaemon_req *sr)
|
||||||
{
|
{
|
||||||
struct subdaemon *sd = sr->sd;
|
struct subdaemon *sd = sr->sd;
|
||||||
|
|
||||||
|
/* Don't trust subdaemon to set it blocking. */
|
||||||
|
if (sr->fd_in)
|
||||||
|
set_blocking(*sr->fd_in, true);
|
||||||
|
|
||||||
sr->req(sd, sr->req_in, sr->req_data);
|
sr->req(sd, sr->req_in, sr->req_data);
|
||||||
tal_free(sr);
|
tal_free(sr);
|
||||||
return req_next(conn, sd);
|
return req_next(conn, sd);
|
||||||
@@ -317,8 +338,9 @@ static struct io_plan *req_process_replymsg(struct io_conn *conn,
|
|||||||
log_unusual(sr->sd->log, "ERROR: Invalid request output");
|
log_unusual(sr->sd->log, "ERROR: Invalid request output");
|
||||||
return io_close(conn);
|
return io_close(conn);
|
||||||
}
|
}
|
||||||
log_debug(sr->sd->log, "Received req response %s len %zu",
|
log_debug(sr->sd->log, "Received req response %s len %zu%s",
|
||||||
sr->sd->reqname(type), tal_count(sr->req_in));
|
sr->sd->reqname(type), tal_count(sr->req_in),
|
||||||
|
sr->fd_in ? " (now getting fd)" : "");
|
||||||
|
|
||||||
/* If we're supposed to recv an fd, do it now. */
|
/* If we're supposed to recv an fd, do it now. */
|
||||||
if (sr->fd_in)
|
if (sr->fd_in)
|
||||||
|
|||||||
Reference in New Issue
Block a user