#include "HandleInfoHandler.h"
#include "ssl.h"
#include "ConfigParser.h"
+#include "version.h"
struct socket_list {
struct ClientSocket *data;
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];
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];
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;
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) {
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);