Importing r25217, r25219 and r25221 from ratbox3
This commit is contained in:
parent
8d107fdcce
commit
73d6283cfc
2 changed files with 57 additions and 26 deletions
|
@ -69,9 +69,10 @@ rb_ssl_shutdown(rb_fde_t * F)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
rb_ssl_timeout(rb_fde_t * fd, void *notused)
|
rb_ssl_timeout(rb_fde_t * F, void *notused)
|
||||||
{
|
{
|
||||||
rb_close(fd);
|
lrb_assert(F->accept != NULL);
|
||||||
|
F->accept->callback(F, RB_ERR_TIMEOUT, NULL, 0, F->accept->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -80,7 +81,7 @@ rb_ssl_tryaccept(rb_fde_t * F, void *data)
|
||||||
{
|
{
|
||||||
int ssl_err;
|
int ssl_err;
|
||||||
lrb_assert(F->accept != NULL);
|
lrb_assert(F->accept != NULL);
|
||||||
int flags = RB_SELECT_READ;
|
int flags;
|
||||||
|
|
||||||
if(!SSL_is_init_finished((SSL *) F->ssl))
|
if(!SSL_is_init_finished((SSL *) F->ssl))
|
||||||
{
|
{
|
||||||
|
@ -88,18 +89,18 @@ rb_ssl_tryaccept(rb_fde_t * F, void *data)
|
||||||
{
|
{
|
||||||
switch (ssl_err = SSL_get_error((SSL *) F->ssl, ssl_err))
|
switch (ssl_err = SSL_get_error((SSL *) F->ssl, ssl_err))
|
||||||
{
|
{
|
||||||
case SSL_ERROR_SYSCALL:
|
|
||||||
if(rb_ignore_errno(errno))
|
|
||||||
case SSL_ERROR_WANT_READ:
|
case SSL_ERROR_WANT_READ:
|
||||||
case SSL_ERROR_WANT_WRITE:
|
case SSL_ERROR_WANT_WRITE:
|
||||||
{
|
if(ssl_err == SSL_ERROR_WANT_WRITE)
|
||||||
if(ssl_err == SSL_ERROR_WANT_WRITE)
|
flags = RB_SELECT_WRITE;
|
||||||
flags |= RB_SELECT_WRITE;
|
else
|
||||||
F->ssl_errno = get_last_err();
|
flags = RB_SELECT_READ;
|
||||||
rb_setselect(F, flags,
|
F->ssl_errno = get_last_err();
|
||||||
rb_ssl_tryaccept, NULL);
|
rb_setselect(F, flags, rb_ssl_tryaccept, NULL);
|
||||||
return;
|
break;
|
||||||
}
|
case SSL_ERROR_SYSCALL:
|
||||||
|
F->accept->callback(F, RB_ERROR, NULL, 0, F->accept->data);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
F->ssl_errno = get_last_err();
|
F->ssl_errno = get_last_err();
|
||||||
F->accept->callback(F, RB_ERROR_SSL, NULL, 0, F->accept->data);
|
F->accept->callback(F, RB_ERROR_SSL, NULL, 0, F->accept->data);
|
||||||
|
|
56
ssld/ssld.c
56
ssld/ssld.c
|
@ -18,7 +18,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
* USA
|
* USA
|
||||||
*
|
*
|
||||||
* $Id: ssld.c 25179 2008-03-30 16:34:57Z androsyn $
|
* $Id: ssld.c 25221 2008-04-09 22:12:16Z jilles $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -127,22 +127,29 @@ typedef struct _conn
|
||||||
#define FLAG_ZIP 0x02
|
#define FLAG_ZIP 0x02
|
||||||
#define FLAG_CORK 0x04
|
#define FLAG_CORK 0x04
|
||||||
#define FLAG_DEAD 0x08
|
#define FLAG_DEAD 0x08
|
||||||
|
#define FLAG_SSL_W_WANTS_R 0x10 /* output needs to wait until input possible */
|
||||||
|
#define FLAG_SSL_R_WANTS_W 0x20 /* input needs to wait until output possible */
|
||||||
|
|
||||||
#define IsSSL(x) ((x)->flags & FLAG_SSL)
|
#define IsSSL(x) ((x)->flags & FLAG_SSL)
|
||||||
#define IsZip(x) ((x)->flags & FLAG_ZIP)
|
#define IsZip(x) ((x)->flags & FLAG_ZIP)
|
||||||
#define IsCork(x) ((x)->flags & FLAG_CORK)
|
#define IsCork(x) ((x)->flags & FLAG_CORK)
|
||||||
#define IsDead(x) ((x)->flags & FLAG_DEAD)
|
#define IsDead(x) ((x)->flags & FLAG_DEAD)
|
||||||
|
#define IsSSLWWantsR(x) ((x)->flags & FLAG_SSL_W_WANTS_R)
|
||||||
|
#define IsSSLRWantsW(x) ((x)->flags & FLAG_SSL_R_WANTS_W)
|
||||||
|
|
||||||
#define SetSSL(x) ((x)->flags |= FLAG_SSL)
|
#define SetSSL(x) ((x)->flags |= FLAG_SSL)
|
||||||
#define SetZip(x) ((x)->flags |= FLAG_ZIP)
|
#define SetZip(x) ((x)->flags |= FLAG_ZIP)
|
||||||
#define SetCork(x) ((x)->flags |= FLAG_CORK)
|
#define SetCork(x) ((x)->flags |= FLAG_CORK)
|
||||||
#define SetDead(x) ((x)->flags |= FLAG_DEAD)
|
#define SetDead(x) ((x)->flags |= FLAG_DEAD)
|
||||||
|
#define SetSSLWWantsR(x) ((x)->flags |= FLAG_SSL_W_WANTS_R)
|
||||||
|
#define SetSSLRWantsW(x) ((x)->flags |= FLAG_SSL_R_WANTS_W)
|
||||||
|
|
||||||
#define ClearSSL(x) ((x)->flags &= ~FLAG_SSL)
|
#define ClearSSL(x) ((x)->flags &= ~FLAG_SSL)
|
||||||
#define ClearZip(x) ((x)->flags &= ~FLAG_ZIP)
|
#define ClearZip(x) ((x)->flags &= ~FLAG_ZIP)
|
||||||
#define ClearCork(x) ((x)->flags &= ~FLAG_CORK)
|
#define ClearCork(x) ((x)->flags &= ~FLAG_CORK)
|
||||||
#define ClearDead(x) ((x)->flags &= ~FLAG_DEAD)
|
#define ClearDead(x) ((x)->flags &= ~FLAG_DEAD)
|
||||||
|
#define ClearSSLWWantsR(x) ((x)->flags &= ~FLAG_SSL_W_WANTS_R)
|
||||||
|
#define ClearSSLRWantsW(x) ((x)->flags &= ~FLAG_SSL_R_WANTS_W)
|
||||||
|
|
||||||
#define NO_WAIT 0x0
|
#define NO_WAIT 0x0
|
||||||
#define WAIT_PLAIN 0x1
|
#define WAIT_PLAIN 0x1
|
||||||
|
@ -153,6 +160,7 @@ typedef struct _conn
|
||||||
static rb_dlink_list connid_hash_table[CONN_HASH_SIZE];
|
static rb_dlink_list connid_hash_table[CONN_HASH_SIZE];
|
||||||
static rb_dlink_list dead_list;
|
static rb_dlink_list dead_list;
|
||||||
|
|
||||||
|
static void conn_mod_read_cb(rb_fde_t * fd, void *data);
|
||||||
static void conn_mod_write_sendq(rb_fde_t *, void *data);
|
static void conn_mod_write_sendq(rb_fde_t *, void *data);
|
||||||
static void conn_plain_write_sendq(rb_fde_t *, void *data);
|
static void conn_plain_write_sendq(rb_fde_t *, void *data);
|
||||||
static void mod_write_ctl(rb_fde_t *, void *data);
|
static void mod_write_ctl(rb_fde_t *, void *data);
|
||||||
|
@ -288,6 +296,14 @@ conn_mod_write_sendq(rb_fde_t * fd, void *data)
|
||||||
if(IsDead(conn))
|
if(IsDead(conn))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if(IsSSLWWantsR(conn))
|
||||||
|
{
|
||||||
|
ClearSSLWWantsR(conn);
|
||||||
|
conn_mod_read_cb(conn->mod_fd, conn);
|
||||||
|
if(IsDead(conn))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
while ((retlen = rb_rawbuf_flush(conn->modbuf_out, fd)) > 0)
|
while ((retlen = rb_rawbuf_flush(conn->modbuf_out, fd)) > 0)
|
||||||
conn->mod_out += retlen;
|
conn->mod_out += retlen;
|
||||||
|
|
||||||
|
@ -304,11 +320,14 @@ conn_mod_write_sendq(rb_fde_t * fd, void *data)
|
||||||
}
|
}
|
||||||
if(rb_rawbuf_length(conn->modbuf_out) > 0)
|
if(rb_rawbuf_length(conn->modbuf_out) > 0)
|
||||||
{
|
{
|
||||||
int flags = RB_SELECT_WRITE;
|
if(retlen != RB_RW_SSL_NEED_READ)
|
||||||
if(retlen == RB_RW_SSL_NEED_READ)
|
rb_setselect(conn->mod_fd, RB_SELECT_WRITE, conn_mod_write_sendq, conn);
|
||||||
flags |= RB_SELECT_READ;
|
else
|
||||||
|
{
|
||||||
rb_setselect(conn->mod_fd, flags, conn_mod_write_sendq, conn);
|
rb_setselect(conn->mod_fd, RB_SELECT_READ, conn_mod_write_sendq, conn);
|
||||||
|
rb_setselect(conn->mod_fd, RB_SELECT_WRITE, NULL, NULL);
|
||||||
|
SetSSLWWantsR(conn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
rb_setselect(conn->mod_fd, RB_SELECT_WRITE, NULL, NULL);
|
rb_setselect(conn->mod_fd, RB_SELECT_WRITE, NULL, NULL);
|
||||||
|
@ -499,6 +518,14 @@ conn_mod_read_cb(rb_fde_t * fd, void *data)
|
||||||
if(IsDead(conn))
|
if(IsDead(conn))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if(IsSSLRWantsW(conn))
|
||||||
|
{
|
||||||
|
ClearSSLRWantsW(conn);
|
||||||
|
conn_mod_write_sendq(conn->mod_fd, conn);
|
||||||
|
if(IsDead(conn))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if(IsDead(conn))
|
if(IsDead(conn))
|
||||||
|
@ -522,11 +549,14 @@ conn_mod_read_cb(rb_fde_t * fd, void *data)
|
||||||
}
|
}
|
||||||
if(length < 0)
|
if(length < 0)
|
||||||
{
|
{
|
||||||
int flags = RB_SELECT_READ;
|
if(length != RB_RW_SSL_NEED_WRITE)
|
||||||
if(length == RB_RW_SSL_NEED_WRITE)
|
rb_setselect(conn->mod_fd, RB_SELECT_READ, conn_mod_read_cb, conn);
|
||||||
flags |= RB_SELECT_WRITE;
|
else
|
||||||
|
{
|
||||||
rb_setselect(conn->mod_fd, flags, conn_mod_read_cb, conn);
|
rb_setselect(conn->mod_fd, RB_SELECT_READ, NULL, NULL);
|
||||||
|
rb_setselect(conn->mod_fd, RB_SELECT_WRITE, conn_mod_read_cb, conn);
|
||||||
|
SetSSLRWantsW(conn);
|
||||||
|
}
|
||||||
conn_plain_write_sendq(conn->plain_fd, conn);
|
conn_plain_write_sendq(conn->plain_fd, conn);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1001,7 +1031,7 @@ main(int argc, char **argv)
|
||||||
if(s_ctlfd == NULL || s_pipe == NULL)
|
if(s_ctlfd == NULL || s_pipe == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "This is ircd-ratbox ssld. You know you aren't supposed to run me directly?\n");
|
fprintf(stderr, "This is ircd-ratbox ssld. You know you aren't supposed to run me directly?\n");
|
||||||
fprintf(stderr, "You get an Id tag for this: $Id: ssld.c 25179 2008-03-30 16:34:57Z androsyn $\n");
|
fprintf(stderr, "You get an Id tag for this: $Id: ssld.c 25221 2008-04-09 22:12:16Z jilles $\n");
|
||||||
fprintf(stderr, "Have a nice life\n");
|
fprintf(stderr, "Have a nice life\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue