mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2025-01-15 21:41:56 +00:00
Flock: storing and passing telnet info
This commit is contained in:
parent
4fa615de22
commit
5e3d8ab971
@ -133,6 +133,15 @@ static struct hypervisor_exposed {
|
|||||||
/**
|
/**
|
||||||
* Exposed process' parent side (requestor)
|
* Exposed process' parent side (requestor)
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
static void hexp_received_telnet(void *);
|
||||||
|
struct hexp_received_telnet {
|
||||||
|
event e;
|
||||||
|
struct hexp_telnet_port *p;
|
||||||
|
int fd;
|
||||||
|
u16 port;
|
||||||
|
};
|
||||||
|
|
||||||
static int
|
static int
|
||||||
hypervisor_telnet_connected(sock *sk, uint size UNUSED)
|
hypervisor_telnet_connected(sock *sk, uint size UNUSED)
|
||||||
{
|
{
|
||||||
@ -205,7 +214,18 @@ hypervisor_exposed_parent_rx(sock *sk, uint size UNUSED)
|
|||||||
skl->fd = sfd;
|
skl->fd = sfd;
|
||||||
if (sk_open(skl, sk->loop) < 0)
|
if (sk_open(skl, sk->loop) < 0)
|
||||||
bug("Telnet listener: sk_open failed");
|
bug("Telnet listener: sk_open failed");
|
||||||
// hexp_received_telnet(port, sfd);
|
|
||||||
|
struct hexp_received_telnet *hrt = mb_allocz(he.p, sizeof *hrt);
|
||||||
|
*hrt = (struct hexp_received_telnet) {
|
||||||
|
.e = {
|
||||||
|
.hook = hexp_received_telnet,
|
||||||
|
.data = hrt,
|
||||||
|
},
|
||||||
|
.p = sk->data,
|
||||||
|
.port = port,
|
||||||
|
.fd = sfd,
|
||||||
|
};
|
||||||
|
ev_send_loop(hcs_loop, &hrt->e);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -390,11 +410,36 @@ hypervisor_exposed_fork(void)
|
|||||||
#define HEXP_TELNET_EQ(a,h,b,i) ((h) == (i)) && (!(a) && !(b) || !strcmp(a,b))
|
#define HEXP_TELNET_EQ(a,h,b,i) ((h) == (i)) && (!(a) && !(b) || !strcmp(a,b))
|
||||||
#define HEXP_TELNET_FN(a,h) h
|
#define HEXP_TELNET_FN(a,h) h
|
||||||
|
|
||||||
|
#define TLIST_PREFIX hexp_telnet_requestor
|
||||||
|
#define TLIST_TYPE struct hexp_telnet_requestor
|
||||||
|
#define TLIST_ITEM n
|
||||||
|
struct hexp_telnet_requestor {
|
||||||
|
TLIST_DEFAULT_NODE;
|
||||||
|
sock *s;
|
||||||
|
struct cbor_parser_context *ctx;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define TLIST_WANT_ADD_TAIL
|
||||||
|
#include "lib/tlists.h"
|
||||||
|
|
||||||
|
static void
|
||||||
|
hexp_sock_err(sock *s, int err)
|
||||||
|
{
|
||||||
|
struct hexp_telnet_requestor *req = s->data;
|
||||||
|
s->data = req->ctx;
|
||||||
|
|
||||||
|
hexp_telnet_requestor_rem_node(hexp_telnet_requestor_enlisted(req), req);
|
||||||
|
mb_free(req);
|
||||||
|
hcs_err(s, err);
|
||||||
|
}
|
||||||
|
|
||||||
struct hexp_telnet_port {
|
struct hexp_telnet_port {
|
||||||
struct hexp_telnet_port *next;
|
struct hexp_telnet_port *next;
|
||||||
const char *name;
|
const char *name;
|
||||||
uint hash;
|
uint hash;
|
||||||
uint port;
|
uint port;
|
||||||
|
|
||||||
|
TLIST_LIST(hexp_telnet_requestor) requestors;
|
||||||
int fd;
|
int fd;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -431,11 +476,17 @@ hexp_get_telnet(sock *s, const char *name)
|
|||||||
|
|
||||||
uint h = name ? mem_hash(name, strlen(name)) : 0;
|
uint h = name ? mem_hash(name, strlen(name)) : 0;
|
||||||
struct hexp_telnet_port *p = HASH_FIND(hexp_telnet.port_hash, HEXP_TELNET, name, h);
|
struct hexp_telnet_port *p = HASH_FIND(hexp_telnet.port_hash, HEXP_TELNET, name, h);
|
||||||
if (p)
|
if (p && p->port)
|
||||||
if (p->port)
|
|
||||||
return hexp_have_telnet(s, p);
|
return hexp_have_telnet(s, p);
|
||||||
else
|
else if (!p)
|
||||||
return; /* Waiting for the exposed part */
|
{
|
||||||
|
he.s->data = p = mb_alloc(hcs_pool, sizeof *p);
|
||||||
|
*p = (struct hexp_telnet_port) {
|
||||||
|
.name = name,
|
||||||
|
.hash = h,
|
||||||
|
.fd = -1,
|
||||||
|
};
|
||||||
|
HASH_INSERT(hexp_telnet.port_hash, HEXP_TELNET, p);
|
||||||
|
|
||||||
uint8_t buf[64];
|
uint8_t buf[64];
|
||||||
linpool *lp = lp_new(s->pool);
|
linpool *lp = lp_new(s->pool);
|
||||||
@ -459,3 +510,42 @@ hexp_get_telnet(sock *s, const char *name)
|
|||||||
|
|
||||||
rfree(lp);
|
rfree(lp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s->rx_hook = NULL;
|
||||||
|
s->err_hook = hexp_sock_err;
|
||||||
|
|
||||||
|
struct hexp_telnet_requestor *req = mb_allocz(hcs_pool, sizeof *req);
|
||||||
|
req->s = s;
|
||||||
|
req->ctx = s->data;
|
||||||
|
s->data = req;
|
||||||
|
hexp_telnet_requestor_add_tail(&p->requestors, req);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hexp_received_telnet(void *_data)
|
||||||
|
{
|
||||||
|
struct hexp_received_telnet *hrt = _data;
|
||||||
|
|
||||||
|
ASSERT_DIE(!hrt->p->port);
|
||||||
|
hrt->p->port = hrt->port;
|
||||||
|
hrt->p->fd = hrt->fd;
|
||||||
|
|
||||||
|
byte outbuf[128];
|
||||||
|
linpool *lp = lp_new(hcs_pool);
|
||||||
|
struct cbor_writer *cw = cbor_init(outbuf, sizeof outbuf, lp);
|
||||||
|
cbor_open_block_with_length(cw, 1);
|
||||||
|
cbor_add_int(cw, -2);
|
||||||
|
cbor_add_int(cw, hrt->port);
|
||||||
|
|
||||||
|
WALK_TLIST_DELSAFE(hexp_telnet_requestor, r, &hrt->p->requestors)
|
||||||
|
{
|
||||||
|
r->s->rx_hook = hcs_rx;
|
||||||
|
r->s->err_hook = hcs_err;
|
||||||
|
memcpy(r->s->tbuf, outbuf, cw->pt);
|
||||||
|
sk_send(r->s, cw->pt);
|
||||||
|
hexp_telnet_requestor_rem_node(&hrt->p->requestors, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
birdloop_enter(he.loop);
|
||||||
|
mb_free(hrt);
|
||||||
|
birdloop_leave(he.loop);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user