* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
* USA
- *
- * $Id$
*/
-#include <ratbox_lib.h>
+#include <rb_lib.h>
#include "stdinc.h"
pid_t pid;
rb_dlink_list readq;
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,
static int ssld_wait = 0;
+void
+restart_ssld(void)
+{
+ rb_dlink_node *ptr, *next;
+ ssl_ctl_t *ctl;
+
+ RB_DLINK_FOREACH_SAFE(ptr, next, ssl_daemons.head)
+ {
+ ctl = ptr->data;
+ if(ctl->dead)
+ continue;
+ if(ctl->shutdown)
+ continue;
+ ctl->shutdown = 1;
+ ssld_count--;
+ if(!ctl->cli_count)
+ {
+ rb_kill(ctl->pid, SIGKILL);
+ free_ssl_daemon(ctl);
+ }
+ }
+
+ start_ssldaemon(ServerInfo.ssld_count, ServerInfo.ssl_cert, ServerInfo.ssl_private_key, ServerInfo.ssl_dh_params, ServerInfo.ssl_cipher_list);
+}
+
static void
ssl_killall(void)
{
if(ctl->dead)
continue;
ctl->dead = 1;
- ssld_count--;
+ if(!ctl->shutdown)
+ ssld_count--;
rb_kill(ctl->pid, SIGKILL);
+ if(!ctl->cli_count)
+ free_ssl_daemon(ctl);
}
}
return;
ctl->dead = 1;
- ssld_count--;
rb_kill(ctl->pid, SIGKILL); /* make sure the process is really gone */
- ilog(L_MAIN, "ssld helper died - attempting to restart");
- sendto_realops_snomask(SNO_GENERAL, L_ALL, "ssld helper died - attempting to restart");
- start_ssldaemon(1, ServerInfo.ssl_cert, ServerInfo.ssl_private_key, ServerInfo.ssl_dh_params, ServerInfo.ssl_cipher_list);
+
+ if(!ctl->shutdown)
+ {
+ ssld_count--;
+ ilog(L_MAIN, "ssld helper died - attempting to restart");
+ sendto_realops_snomask(SNO_GENERAL, L_ALL, "ssld helper died - attempting to restart");
+ start_ssldaemon(1, ServerInfo.ssl_cert, ServerInfo.ssl_private_key, ServerInfo.ssl_dh_params, ServerInfo.ssl_cipher_list);
+ }
}
static void
rb_close(F2);
rb_close(P1);
ctl = allocate_ssl_daemon(F1, P2, pid);
- if(ssl_ok)
+ if(ircd_ssl_ok)
{
send_init_prng(ctl, RB_PRNG_DEFAULT, NULL);
send_certfp_method(ctl, ConfigFileEntry.certfp_method);
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;
switch (*ctl_buf->buf)
{
case 'N':
- ssl_ok = 0; /* ssld says it can't do ssl/tls */
+ ircd_ssl_ok = false; /* ssld says it can't do ssl/tls */
break;
case 'D':
ssl_process_dead_fd(ctl, ctl_buf);
ssl_process_zipstats(ctl, ctl_buf);
break;
case 'I':
- ssl_ok = 0;
+ ircd_ssl_ok = false;
ilog(L_MAIN, "%s", cannot_setup_ssl);
sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s", cannot_setup_ssl);
break;
case 'U':
zlib_ok = 0;
- ssl_ok = 0;
+ ircd_ssl_ok = false;
ilog(L_MAIN, "%s", no_ssl_or_zlib);
sendto_realops_snomask(SNO_GENERAL, L_ALL, "%s", no_ssl_or_zlib);
ssl_killall();
- break;
+ return;
+ 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;
ctl = ptr->data;
if(ctl->dead)
continue;
+ if(ctl->shutdown)
+ continue;
if(lowest == NULL)
{
lowest = ctl;
rb_dlink_node *ptr;
if(ssl_cert == NULL || ssl_private_key == NULL || ssl_dh_params == NULL)
{
- ssl_ok = 0;
+ ircd_ssl_ok = false;
return;
}
RB_DLINK_FOREACH(ptr, ssl_daemons.head)
buf[0] = 'A';
uint32_to_buf(&buf[1], id);
ctl = which_ssld();
+ if(!ctl)
+ return NULL;
ctl->cli_count++;
ssl_cmd_write_queue(ctl, F, 2, buf, sizeof(buf));
return ctl;
uint32_to_buf(&buf[1], id);
ctl = which_ssld();
+ if(!ctl)
+ return NULL;
ctl->cli_count++;
ssl_cmd_write_queue(ctl, F, 2, buf, sizeof(buf));
return ctl;
return;
ctl->cli_count--;
+ if(ctl->shutdown && !ctl->cli_count)
+ {
+ ctl->dead = 1;
+ rb_kill(ctl->pid, SIGKILL);
+ }
if(ctl->dead && !ctl->cli_count)
{
free_ssl_daemon(ctl);
F[0] = server->localClient->F;
F[1] = xF1;
- del_from_cli_connid_hash(server);
+ del_from_zconnid_hash(server);
server->localClient->F = xF2;
/* need to redo as what we did before isn't valid now */
- uint32_to_buf(&buf[1], rb_get_fd(server->localClient->F));
- add_to_cli_connid_hash(server);
+ uint32_to_buf(&buf[1], server->localClient->zconnid);
+ add_to_zconnid_hash(server);
server->localClient->z_ctl = which_ssld();
+ if(!server->localClient->z_ctl)
+ {
+ exit_client(server, server, server, "Error finding available ssld");
+ rb_free(buf);
+ return;
+ }
server->localClient->z_ctl->cli_count++;
ssl_cmd_write_queue(server->localClient->z_ctl, F, 2, buf, len);
rb_free(buf);
return ssld_count;
}
+void
+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;
+ RB_DLINK_FOREACH_SAFE(ptr, next, ssl_daemons.head)
+ {
+ ctl = ptr->data;
+ func(data, ctl->pid, ctl->cli_count,
+ ctl->dead ? SSLD_DEAD :
+ (ctl->shutdown ? SSLD_SHUTDOWN : SSLD_ACTIVE),
+ ctl->version);
+ }
+}
+
void
init_ssld(void)
{