mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 21:35:11 +01:00
lightningd/msg_queue: support queueing/dequeueing of fds.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
83466b2b32
commit
bde872d34c
@ -1,4 +1,7 @@
|
||||
#include <assert.h>
|
||||
#include <ccan/take/take.h>
|
||||
#include <lightningd/msg_queue.h>
|
||||
#include <wire/wire.h>
|
||||
|
||||
void msg_queue_init(struct msg_queue *q, const tal_t *ctx)
|
||||
{
|
||||
@ -6,7 +9,7 @@ void msg_queue_init(struct msg_queue *q, const tal_t *ctx)
|
||||
q->ctx = ctx;
|
||||
}
|
||||
|
||||
void msg_enqueue(struct msg_queue *q, const u8 *add)
|
||||
static void do_enqueue(struct msg_queue *q, const u8 *add)
|
||||
{
|
||||
size_t n = tal_count(q->q);
|
||||
tal_resize(&q->q, n+1);
|
||||
@ -16,6 +19,20 @@ void msg_enqueue(struct msg_queue *q, const u8 *add)
|
||||
io_wake(q);
|
||||
}
|
||||
|
||||
void msg_enqueue(struct msg_queue *q, const u8 *add)
|
||||
{
|
||||
assert(fromwire_peektype(add) != MSG_PASS_FD);
|
||||
do_enqueue(q, add);
|
||||
}
|
||||
|
||||
void msg_enqueue_fd(struct msg_queue *q, int fd)
|
||||
{
|
||||
u8 *fdmsg = tal_arr(q->ctx, u8, 0);
|
||||
towire_u16(&fdmsg, MSG_PASS_FD);
|
||||
towire_u32(&fdmsg, fd);
|
||||
do_enqueue(q, take(fdmsg));
|
||||
}
|
||||
|
||||
const u8 *msg_dequeue(struct msg_queue *q)
|
||||
{
|
||||
size_t n = tal_count(q->q);
|
||||
@ -29,3 +46,14 @@ const u8 *msg_dequeue(struct msg_queue *q)
|
||||
tal_resize(&q->q, n-1);
|
||||
return msg;
|
||||
}
|
||||
|
||||
int msg_is_fd(const u8 *msg)
|
||||
{
|
||||
const u8 *p = msg + sizeof(u16);
|
||||
size_t len = tal_count(msg) - sizeof(u16);
|
||||
|
||||
if (fromwire_peektype(msg) != MSG_PASS_FD)
|
||||
return -1;
|
||||
|
||||
return fromwire_u32(&p, &len);
|
||||
}
|
||||
|
@ -5,6 +5,9 @@
|
||||
#include <ccan/io/io.h>
|
||||
#include <ccan/short_types/short_types.h>
|
||||
|
||||
/* Reserved type used to indicate we're actually passing an fd. */
|
||||
#define MSG_PASS_FD 0xFFFF
|
||||
|
||||
struct msg_queue {
|
||||
const u8 **q;
|
||||
const tal_t *ctx;
|
||||
@ -12,10 +15,18 @@ struct msg_queue {
|
||||
|
||||
void msg_queue_init(struct msg_queue *q, const tal_t *ctx);
|
||||
|
||||
/* If add is taken(), freed after sending. */
|
||||
void msg_enqueue(struct msg_queue *q, const u8 *add);
|
||||
|
||||
/* Fd is closed after sending. */
|
||||
void msg_enqueue_fd(struct msg_queue *q, int fd);
|
||||
|
||||
/* Returns NULL if nothing to do. */
|
||||
const u8 *msg_dequeue(struct msg_queue *q);
|
||||
|
||||
/* Returns -1 if not an fd: close after sending. */
|
||||
int msg_is_fd(const u8 *msg);
|
||||
|
||||
#define msg_queue_wait(conn, q, next, arg) \
|
||||
io_out_wait((conn), (q), (next), (arg))
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user