From 6927fcd82e211ff0561ae50e0b9acebedbbe789a Mon Sep 17 00:00:00 2001 From: pk910 Date: Thu, 22 Dec 2011 11:19:55 +0100 Subject: [PATCH] added cmd_reconnect --- Makefile.am | 1 + src/ClientSocket.c | 40 +++++++++++++++++++++++++++---- src/ClientSocket.h | 1 + src/HandleInfoHandler.c | 1 + src/WHOHandler.c | 1 + src/bot_NeonServ.c | 1 + src/cmd_global.h | 1 + src/cmd_global_reconnect.c | 49 ++++++++++++++++++++++++++++++++++++++ src/commands.c | 1 + 9 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 src/cmd_global_reconnect.c diff --git a/Makefile.am b/Makefile.am index 40af57e..88f7c77 100644 --- a/Makefile.am +++ b/Makefile.am @@ -123,6 +123,7 @@ neonserv_SOURCES = src/version.c \ src/cmd_global_setbot.c \ src/cmd_global_addbot.c \ src/cmd_global_delbot.c \ + src/cmd_global_reconnect.c \ src/cmd_funcmds.c \ src/ConfigParser.c diff --git a/src/ClientSocket.c b/src/ClientSocket.c index 2e2eb1c..9b44e20 100644 --- a/src/ClientSocket.c +++ b/src/ClientSocket.c @@ -23,6 +23,7 @@ #include "HandleInfoHandler.h" #include "ssl.h" #include "ConfigParser.h" +#include "version.h" struct socket_list { struct ClientSocket *data; @@ -186,7 +187,8 @@ int connect_socket(struct ClientSocket *client) { if(client->flags & SOCKET_FLAG_SSL) { ssl_connect(client); client->flags |= SOCKET_FLAG_HAVE_SSL; - } + } else + client->flags &= ~SOCKET_FLAG_HAVE_SSL; //send the IRC Headers char sendBuf[512]; @@ -241,8 +243,8 @@ int connect_socket(struct ClientSocket *client) { if(client->flags & SOCKET_FLAG_SSL) { ssl_connect(client); client->flags |= SOCKET_FLAG_HAVE_SSL; - } - + } else + client->flags &= ~SOCKET_FLAG_HAVE_SSL; //send the IRC Headers char sendBuf[512]; @@ -263,8 +265,13 @@ int connect_socket(struct ClientSocket *client) { int close_socket(struct ClientSocket *client) { if(client == NULL) return 0; - if((client->flags & SOCKET_FLAG_CONNECTED)) + if((client->flags & SOCKET_FLAG_CONNECTED)) { + char quitbuf[MAXLEN]; + int quitlen = sprintf(quitbuf, "QUIT :[NeonServ %s.%d] disconnect requested.\n", NEONSERV_VERSION, patchlevel); + write_socket_force(client, quitbuf, quitlen); close(client->sock); + bot_disconnect(client); + } if(client->flags & SOCKET_FLAG_HAVE_SSL) ssl_disconnect(client); struct ClientSocket *sock, *last_sock = NULL; @@ -293,6 +300,27 @@ int close_socket(struct ClientSocket *client) { return 1; } +int disconnect_socket(struct ClientSocket *client) { + if(client == NULL) return 0; + if((client->flags & SOCKET_FLAG_CONNECTED)) { + char quitbuf[MAXLEN]; + int quitlen = sprintf(quitbuf, "QUIT :[NeonServ %s.%d] disconnect requested.\n", NEONSERV_VERSION, patchlevel); + write_socket_force(client, quitbuf, quitlen); + close(client->sock); + bot_disconnect(client); + } + if(client->flags & SOCKET_FLAG_HAVE_SSL) + ssl_disconnect(client); + if(client->queue) + queue_destroy(client); + if(client->whoqueue_first) + clear_whoqueue(client); + if(client->handleinfo_first) + clear_handleinfoqueue(client); + client->flags &= ~(SOCKET_FLAG_CONNECTED | SOCKET_FLAG_READY | SOCKET_FLAG_RECONNECT); + return 1; +} + int write_socket_force(struct ClientSocket *client, char* msg, int len) { printf("[send %d] %s", len, msg); if(!(client->flags & SOCKET_FLAG_HAVE_SSL) || ssl_write(client, msg, len) == -2) { @@ -369,6 +397,10 @@ void socket_loop(int timeout_seconds) { close(sock->sock); if(sock->flags & SOCKET_FLAG_HAVE_SSL) ssl_disconnect(sock); + if(sock->whoqueue_first) + clear_whoqueue(sock); + if(sock->handleinfo_first) + clear_handleinfoqueue(sock); } else { sock->traffic_in += bytes; int used = parse_lines(sock, sock->buffer, sock->bufferpos); diff --git a/src/ClientSocket.h b/src/ClientSocket.h index 7ede0c3..13e499c 100644 --- a/src/ClientSocket.h +++ b/src/ClientSocket.h @@ -69,6 +69,7 @@ struct ClientSocket { struct ClientSocket* create_socket(char *host, int port, char *bindto, char *pass, char *nick, char *ident, char *realname); int connect_socket(struct ClientSocket *client); int close_socket(struct ClientSocket *client); +int disconnect_socket(struct ClientSocket *client); int write_socket_force(struct ClientSocket *client, char* msg, int len); int write_socket(struct ClientSocket *client, char* msg, int len); void socket_loop(int timeout_seconds); diff --git a/src/HandleInfoHandler.c b/src/HandleInfoHandler.c index 8a135cd..040c9e5 100644 --- a/src/HandleInfoHandler.c +++ b/src/HandleInfoHandler.c @@ -69,6 +69,7 @@ void clear_handleinfoqueue(struct ClientSocket *client) { free(entry); } client->handleinfo_last = NULL; + client->handleinfo_first = NULL; } void lookup_authname(char *auth, authlookup_callback_t callback, void *data) { diff --git a/src/WHOHandler.c b/src/WHOHandler.c index a21f560..b0c3513 100644 --- a/src/WHOHandler.c +++ b/src/WHOHandler.c @@ -75,6 +75,7 @@ void clear_whoqueue(struct ClientSocket *client) { free(entry); } client->whoqueue_last = NULL; + client->whoqueue_first = NULL; } void get_userlist(struct ChanNode *chan, userlist_callback_t callback, void *data) { diff --git a/src/bot_NeonServ.c b/src/bot_NeonServ.c index 0421fdd..2dacd9c 100644 --- a/src/bot_NeonServ.c +++ b/src/bot_NeonServ.c @@ -360,6 +360,7 @@ static const struct default_language_entry msgtab[] = { {"NS_ADDBOT_DONE", "Added %s with BotID $b%d$b."}, /* {ARGS: "NeonServ", 2} */ {"NS_DELBOT_NOT_FOUND", "Bot with BotID / nick $b%s$b not found."}, /* {ARGS: "NeonServ"} */ {"NS_DELBOT_DONE", "Bot deleted."}, + {"NS_RECONNECT_DONE", "Reconnected bot."}, {NULL, NULL} }; diff --git a/src/cmd_global.h b/src/cmd_global.h index 98dc94e..30e39e3 100644 --- a/src/cmd_global.h +++ b/src/cmd_global.h @@ -50,6 +50,7 @@ CMD_BIND(global_cmd_motd); CMD_BIND(global_cmd_netinfo); CMD_BIND(global_cmd_notice); CMD_BIND(global_cmd_raw); +CMD_BIND(global_cmd_reconnect); CMD_BIND(global_cmd_register); CMD_BIND(global_cmd_reload); CMD_BIND(global_cmd_restart); diff --git a/src/cmd_global_reconnect.c b/src/cmd_global_reconnect.c new file mode 100644 index 0000000..6313ff7 --- /dev/null +++ b/src/cmd_global_reconnect.c @@ -0,0 +1,49 @@ +/* cmd_global_reconnect.c - NeonServ v5.2 + * Copyright (C) 2011 Philipp Kreil (pk910) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "cmd_global.h" + +/* +* argv[0] nick/botid +*/ + +CMD_BIND(global_cmd_reconnect) { + int botid; + if(argc) { + MYSQL_RES *res; + MYSQL_ROW row; + printf_mysql_query("SELECT `id` FROM `bots` WHERE `nick` = '%s' OR `id` = '%s'", escape_string(argv[0]), escape_string(argv[0])); + res = mysql_use(); + if((row = mysql_fetch_row(res)) == NULL) { + reply(getTextBot(), user, "NS_DELBOT_NOT_FOUND", argv[0]); + return; + } + botid = atoi(row[0]); + for(client = getBots(0, NULL); client; client = getBots(0, client)) { + if(client->clientid == botid) { + disconnect_socket(client); + connect_socket(client); + break; + } + } + } else { + disconnect_socket(client); + connect_socket(client); + } + reply(getTextBot(), user, "NS_RECONNECT_DONE"); + logEvent(event); +} diff --git a/src/commands.c b/src/commands.c index 7963b07..cfa0f38 100644 --- a/src/commands.c +++ b/src/commands.c @@ -54,6 +54,7 @@ void register_commands() { OPER_COMMAND("setbot", global_cmd_setbot, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); OPER_COMMAND("addbot", global_cmd_addbot, 2, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); OPER_COMMAND("delbot", global_cmd_delbot, 1, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG | CMDFLAG_REQUIRED); + OPER_COMMAND("reconnect", global_cmd_reconnect, 0, 1000, CMDFLAG_REQUIRE_AUTH | CMDFLAG_CHECK_AUTH | CMDFLAG_OPLOG); #undef OPER_COMMAND //NeonServ Commands -- 2.20.1