fixed small startup crash in main.c
[NeonServV5.git] / src / ClientSocket.c
index 52316fd3d8f3d7a0a65cb687058b5dc794fe4152..7160014d36c18b089720ddf1e05f74743f4f9724 100644 (file)
@@ -1,4 +1,4 @@
-/* ClientSocket.c - NeonServ v5.5
+/* ClientSocket.c - NeonServ v5.6
  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
@@ -24,6 +24,7 @@
 #include "ConfigParser.h"
 #include "version.h"
 #include "IOHandler.h"
+#include "IRCEvents.h"
 
 struct socket_list {
     struct ClientSocket *data;
@@ -136,6 +137,7 @@ int destroy_socket(struct ClientSocket *client) {
         } else
             last_sock = sock;
     }
+    event_freeclient(client);
     free(client->host);
     if(client->bind)
         free(client->bind);
@@ -224,9 +226,9 @@ static IOHANDLER_CALLBACK(socket_callback) {
     case IOEVENT_CONNECTED:
         client->flags |= SOCKET_FLAG_CONNECTED;
         if(client->pass && strcmp(client->pass, ""))
-            iohandler_printf(event->iofd, "PASS :%s", client->pass);
-        iohandler_printf(event->iofd, "USER %s 0 0 :%s", client->ident, client->realname);
-        iohandler_printf(event->iofd, "NICK %s", client->nick);
+            putsock(client, "PASS :%s", client->pass);
+        putsock(client, "USER %s 0 0 :%s", client->ident, client->realname);
+        putsock(client, "NICK %s", client->nick);
         break;
     case IOEVENT_NOTCONNECTED:
     case IOEVENT_CLOSED:
@@ -283,13 +285,19 @@ struct ClientSocket* getBots(int flags, struct ClientSocket* last_bot) {
     return NULL;
 }
 
-void free_sockets() {
+void free_sockets(int close_only) {
     if(!sockets) return;
     struct ClientSocket *client, *next;
     for (client = sockets->data; client; client = next) {
         next = client->next;
-        destroy_socket(client);
+        if(close_only) {
+            if((client->flags & SOCKET_FLAG_CONNECTED))
+                iohandler_printf(client->iofd, "QUIT :[NeonServ %s.%d] shutdown requested.\n", NEONSERV_VERSION, patchlevel);
+        } else
+            destroy_socket(client);
+    }
+    if(!close_only) {
+        free(sockets);
+        sockets = NULL;
     }
-    free(sockets);
-    sockets = NULL;
 }