-/* ClientSocket.c - NeonServ v5.2
+/* ClientSocket.c - NeonServ v5.3
* Copyright (C) 2011 Philipp Kreil (pk910)
*
* This program is free software: you can redistribute it and/or modify
#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);
- if(client->flags & SOCKET_FLAG_SSL)
+ bot_disconnect(client);
+ }
+ if(client->flags & SOCKET_FLAG_HAVE_SSL)
ssl_disconnect(client);
struct ClientSocket *sock, *last_sock = NULL;
for (sock = sockets->data; sock; sock = sock->next) {
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_SSL) || ssl_write(client, msg, len) == -2) {
+ if(!(client->flags & SOCKET_FLAG_HAVE_SSL) || ssl_write(client, msg, len) == -2) {
#ifdef WIN32
send(client->sock, msg, len, 0);
#else
for (sock = sockets->data; sock; sock = sock->next) {
if((sock->flags & SOCKET_FLAG_CONNECTED) && FD_ISSET(sock->sock, &fds)) {
if(sock->bufferpos != 0) {
- if(!(sock->flags & SOCKET_FLAG_SSL) || (bytes = ssl_read(sock, buffer, sizeof(buffer))) == -2) {
+ if(!(sock->flags & SOCKET_FLAG_HAVE_SSL) || (bytes = ssl_read(sock, buffer, sizeof(buffer))) == -2) {
#ifdef WIN32
bytes = recv(sock->sock, buffer, sizeof(buffer), 0);
#else
sock->bufferpos += i;
}
} else {
- if(!(sock->flags & SOCKET_FLAG_SSL) || (bytes = ssl_read(sock, sock->buffer, sizeof(sock->buffer))) == -2) {
+ if(!(sock->flags & SOCKET_FLAG_HAVE_SSL) || (bytes = ssl_read(sock, sock->buffer, sizeof(sock->buffer))) == -2) {
#ifdef WIN32
bytes = recv(sock->sock, sock->buffer, sizeof(sock->buffer), 0);
#else
if(sock->queue)
queue_destroy(sock);
close(sock->sock);
- if(sock->flags & SOCKET_FLAG_SSL)
+ 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);
next = client->next;
if((client->flags & SOCKET_FLAG_CONNECTED))
close(client->sock);
- if(client->flags & SOCKET_FLAG_SSL)
+ if(client->flags & SOCKET_FLAG_HAVE_SSL)
ssl_disconnect(client);
if(client->queue)
queue_destroy(client);