diff --git a/include/sslproc.h b/include/sslproc.h index b152d7eb..dbc66d53 100644 --- a/include/sslproc.h +++ b/include/sslproc.h @@ -42,7 +42,7 @@ void start_zlib_session(void *data); void send_new_ssl_certs(const char *ssl_cert, const char *ssl_private_key, const char *ssl_dh_params, const char *ssl_cipher_list); void ssld_decrement_clicount(ssl_ctl_t *ctl); int get_ssld_count(void); -void ssld_foreach_info(void (*func)(void *data, pid_t pid, int cli_count, enum ssld_status status), void *data); +void ssld_foreach_info(void (*func)(void *data, pid_t pid, int cli_count, enum ssld_status status, const char *version), void *data); #endif diff --git a/ircd/sslproc.c b/ircd/sslproc.c index 58f0e66a..0ce5617b 100644 --- a/ircd/sslproc.c +++ b/ircd/sslproc.c @@ -68,6 +68,7 @@ struct _ssl_ctl rb_dlink_list writeq; uint8_t shutdown; uint8_t dead; + char version[256]; }; static void send_new_ssl_certs_one(ssl_ctl_t * ctl, const char *ssl_cert, @@ -479,8 +480,11 @@ ssl_process_cmd_recv(ssl_ctl_t * ctl) static const char *no_ssl_or_zlib = "ssld has neither SSL/TLS or zlib support killing all sslds"; rb_dlink_node *ptr, *next; ssl_ctl_buf_t *ctl_buf; + int len; + if(ctl->dead) return; + RB_DLINK_FOREACH_SAFE(ptr, next, ctl->readq.head) { ctl_buf = ptr->data; @@ -513,6 +517,11 @@ ssl_process_cmd_recv(ssl_ctl_t * ctl) sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s", no_ssl_or_zlib); ssl_killall(); break; + case 'V': + len = ctl_buf->buflen - 1; + if (len > sizeof(ctl->version) - 1) + len = sizeof(ctl->version) - 1; + strncpy(ctl->version, &ctl_buf->buf[1], len); case 'z': zlib_ok = 0; break; @@ -938,7 +947,7 @@ get_ssld_count(void) } void -ssld_foreach_info(void (*func)(void *data, pid_t pid, int cli_count, enum ssld_status status), void *data) +ssld_foreach_info(void (*func)(void *data, pid_t pid, int cli_count, enum ssld_status status, const char *version), void *data) { rb_dlink_node *ptr, *next; ssl_ctl_t *ctl; @@ -947,7 +956,8 @@ ssld_foreach_info(void (*func)(void *data, pid_t pid, int cli_count, enum ssld_s ctl = ptr->data; func(data, ctl->pid, ctl->cli_count, ctl->dead ? SSLD_DEAD : - (ctl->shutdown ? SSLD_SHUTDOWN : SSLD_ACTIVE)); + (ctl->shutdown ? SSLD_SHUTDOWN : SSLD_ACTIVE), + ctl->version); } } diff --git a/modules/m_stats.c b/modules/m_stats.c index a7495225..a41926be 100644 --- a/modules/m_stats.c +++ b/modules/m_stats.c @@ -889,15 +889,16 @@ stats_resv(struct Client *source_p) } static void -stats_ssld_foreach(void *data, pid_t pid, int cli_count, enum ssld_status status) +stats_ssld_foreach(void *data, pid_t pid, int cli_count, enum ssld_status status, const char *version) { struct Client *source_p = data; sendto_one_numeric(source_p, RPL_STATSDEBUG, - "S :%u %c %u", + "S :%u %c %u :%s", pid, status == SSLD_DEAD ? 'D' : (status == SSLD_SHUTDOWN ? 'S' : 'A'), - cli_count); + cli_count, + version); } static void diff --git a/ssld/ssld.c b/ssld/ssld.c index f5634f68..ef673487 100644 --- a/ssld/ssld.c +++ b/ssld/ssld.c @@ -973,6 +973,14 @@ send_i_am_useless(mod_ctl_t * ctl) mod_cmd_write_queue(ctl, useless, strlen(useless)); } +static void +send_version(mod_ctl_t * ctl) +{ + char version[256] = { 'V', 0 }; + strncpy(&version[1], rb_lib_version(), sizeof(version) - 2); + mod_cmd_write_queue(ctl, version, strlen(version)); +} + static void send_nozlib_support(mod_ctl_t * ctl, mod_ctl_buf_t * ctlb) { @@ -1242,6 +1250,7 @@ main(int argc, char **argv) rb_event_add("check_handshake_flood", check_handshake_flood, NULL, 10); read_pipe_ctl(mod_ctl->F_pipe, NULL); mod_read_ctl(mod_ctl->F, mod_ctl); + send_version(mod_ctl); if(!zlib_ok && !ssl_ok) { /* this is really useless... */