+ 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);
+ }
+ client->flags &= ~(SOCKET_FLAG_READY | SOCKET_FLAG_RECONNECT);
+ client->flags |= SOCKET_FLAG_QUITTED | SOCKET_FLAG_DEAD;
+ 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);
+ }
+ client->flags &= ~(SOCKET_FLAG_READY | SOCKET_FLAG_RECONNECT);
+ client->flags |= SOCKET_FLAG_QUITTED;
+ return 1;
+}
+
+static void destroy_socket(struct ClientSocket *client, int free_socket) {
+ SYNCHRONIZE(synchronized);
+ if((client->flags & SOCKET_FLAG_CONNECTED)) {