wsockd: various updates
This commit is contained in:
parent
0ed0a9fe0a
commit
1c8c63cbe2
1 changed files with 56 additions and 11 deletions
|
@ -70,8 +70,12 @@ typedef struct _conn
|
||||||
{
|
{
|
||||||
rb_dlink_node node;
|
rb_dlink_node node;
|
||||||
mod_ctl_t *ctl;
|
mod_ctl_t *ctl;
|
||||||
rawbuf_head_t *modbuf_out;
|
|
||||||
rawbuf_head_t *plainbuf_out;
|
buf_head_t modbuf_out;
|
||||||
|
buf_head_t modbuf_in;
|
||||||
|
|
||||||
|
buf_head_t plainbuf_out;
|
||||||
|
buf_head_t plainbuf_in;
|
||||||
|
|
||||||
uint32_t id;
|
uint32_t id;
|
||||||
|
|
||||||
|
@ -189,8 +193,12 @@ conn_add_id_hash(conn_t * conn, uint32_t id)
|
||||||
static void
|
static void
|
||||||
free_conn(conn_t * conn)
|
free_conn(conn_t * conn)
|
||||||
{
|
{
|
||||||
rb_free_rawbuffer(conn->modbuf_out);
|
rb_linebuf_donebuf(&conn->plainbuf_in);
|
||||||
rb_free_rawbuffer(conn->plainbuf_out);
|
rb_linebuf_donebuf(&conn->plainbuf_out);
|
||||||
|
|
||||||
|
rb_linebuf_donebuf(&conn->modbuf_in);
|
||||||
|
rb_linebuf_donebuf(&conn->modbuf_out);
|
||||||
|
|
||||||
rb_free(conn);
|
rb_free(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,8 +270,8 @@ close_conn(conn_t * conn, int wait_plain, const char *fmt, ...)
|
||||||
if(IsDead(conn))
|
if(IsDead(conn))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rb_rawbuf_flush(conn->modbuf_out, conn->mod_fd);
|
rb_linebuf_flush(conn->mod_fd, &conn->modbuf_out);
|
||||||
rb_rawbuf_flush(conn->plainbuf_out, conn->plain_fd);
|
rb_linebuf_flush(conn->plain_fd, &conn->plainbuf_out);
|
||||||
rb_close(conn->mod_fd);
|
rb_close(conn->mod_fd);
|
||||||
SetDead(conn);
|
SetDead(conn);
|
||||||
|
|
||||||
|
@ -295,13 +303,18 @@ make_conn(mod_ctl_t * ctl, rb_fde_t *mod_fd, rb_fde_t *plain_fd)
|
||||||
{
|
{
|
||||||
conn_t *conn = rb_malloc(sizeof(conn_t));
|
conn_t *conn = rb_malloc(sizeof(conn_t));
|
||||||
conn->ctl = ctl;
|
conn->ctl = ctl;
|
||||||
conn->modbuf_out = rb_new_rawbuffer();
|
|
||||||
conn->plainbuf_out = rb_new_rawbuffer();
|
|
||||||
conn->mod_fd = mod_fd;
|
conn->mod_fd = mod_fd;
|
||||||
conn->plain_fd = plain_fd;
|
conn->plain_fd = plain_fd;
|
||||||
conn->id = -1;
|
conn->id = -1;
|
||||||
rb_set_nb(mod_fd);
|
rb_set_nb(mod_fd);
|
||||||
rb_set_nb(plain_fd);
|
rb_set_nb(plain_fd);
|
||||||
|
|
||||||
|
rb_linebuf_newbuf(&conn->plainbuf_in);
|
||||||
|
rb_linebuf_newbuf(&conn->plainbuf_out);
|
||||||
|
|
||||||
|
rb_linebuf_newbuf(&conn->modbuf_in);
|
||||||
|
rb_linebuf_newbuf(&conn->modbuf_out);
|
||||||
|
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,6 +328,19 @@ cleanup_bad_message(mod_ctl_t * ctl, mod_ctl_buf_t * ctlb)
|
||||||
rb_close(ctlb->F[i]);
|
rb_close(ctlb->F[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
conn_mod_handshake_process(conn_t *conn)
|
||||||
|
{
|
||||||
|
char inbuf[READBUF_SIZE];
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
size_t dolen = rb_linebuf_get(&conn->modbuf_in, inbuf, READBUF_SIZE, LINEBUF_COMPLETE, LINEBUF_PARSED);
|
||||||
|
if (!dolen)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
conn_mod_handshake_cb(rb_fde_t *fd, void *data)
|
conn_mod_handshake_cb(rb_fde_t *fd, void *data)
|
||||||
{
|
{
|
||||||
|
@ -332,12 +358,31 @@ conn_mod_handshake_cb(rb_fde_t *fd, void *data)
|
||||||
if (IsDead(conn))
|
if (IsDead(conn))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
length = rb_read(conn->plain_fd, inbuf, sizeof(inbuf));
|
length = rb_read(fd, inbuf, sizeof(inbuf));
|
||||||
if (length == 0 || (length < 0 && !rb_ignore_errno(errno)))
|
|
||||||
|
if (length < 0)
|
||||||
|
{
|
||||||
|
if (rb_ignore_errno(errno))
|
||||||
|
rb_setselect(fd, RB_SELECT_READ, conn_mod_handshake_cb, conn);
|
||||||
|
else
|
||||||
|
close_conn(conn, NO_WAIT, "Connection closed");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (length == 0)
|
||||||
{
|
{
|
||||||
close_conn(conn, NO_WAIT, "Connection closed");
|
close_conn(conn, NO_WAIT, "Connection closed");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int res = rb_linebuf_parse(&conn->modbuf_in, inbuf, length, 0);
|
||||||
|
conn_mod_handshake_process(conn);
|
||||||
|
|
||||||
|
if (length < sizeof(inbuf))
|
||||||
|
{
|
||||||
|
rb_setselect(fd, RB_SELECT_READ, conn_mod_handshake_cb, conn);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -532,7 +577,7 @@ main(int argc, char **argv)
|
||||||
#endif
|
#endif
|
||||||
setup_signals();
|
setup_signals();
|
||||||
rb_lib_init(NULL, NULL, NULL, 0, maxfd, 1024, 4096);
|
rb_lib_init(NULL, NULL, NULL, 0, maxfd, 1024, 4096);
|
||||||
rb_init_rawbuffers(1024);
|
rb_linebuf_init(4096);
|
||||||
|
|
||||||
mod_ctl = rb_malloc(sizeof(mod_ctl_t));
|
mod_ctl = rb_malloc(sizeof(mod_ctl_t));
|
||||||
mod_ctl->F = rb_open(ctlfd, RB_FD_SOCKET, "ircd control socket");
|
mod_ctl->F = rb_open(ctlfd, RB_FD_SOCKET, "ircd control socket");
|
||||||
|
|
Loading…
Reference in a new issue