Add fake host support (assuming your ircd supports it)
[srvx.git] / src / hash.c
index 98705bac8fbf8fc5abe789687df0786ac3cafa06..439b68d9d8c4cfbb82692941820e2c2619278966 100644 (file)
@@ -238,6 +238,14 @@ StampUser(struct userNode *user, const char *stamp)
     user->modes |= FLAGS_STAMPED;
 }
 
+void
+assign_fakehost(struct userNode *user, const char *host, int announce)
+{
+    safestrncpy(user->fakehost, host, sizeof(user->fakehost));
+    if (announce)
+        irc_fakehost(user, host);
+}
+
 static new_channel_func_t *ncf_list;
 static unsigned int ncf_size = 0, ncf_used = 0;
 
@@ -532,9 +540,8 @@ DelChannelUser(struct userNode* user, struct chanNode* channel, const char *reas
     struct modeNode* mNode;
     unsigned int n;
 
-    if (reason) {
+    if (reason)
         irc_part(user, channel, reason);
-    }
 
     mNode = GetUserMode(channel, user);
 
@@ -547,12 +554,15 @@ DelChannelUser(struct userNode* user, struct chanNode* channel, const char *reas
     /* remove modeNode from channel and user */
     modeList_remove(&channel->members, mNode);
     modeList_remove(&user->channels, mNode);
-    free(mNode);
 
+    /* make callbacks */
     for (n=0; n<pf_used; n++)
-        pf_list[n](user, channel, reason);
+       pf_list[n](mNode, reason);
+
+    /* free memory */
+    free(mNode);
 
-    if (!deleting && !channel->members.used && !channel->locks)
+    if (!deleting && !channel->members.used && !channel->locks && !(channel->modes & MODE_REGISTERED))
         DelChannel(channel);
 }
 
@@ -708,7 +718,13 @@ DEFINE_LIST(serverList, struct server*)
 static void
 hash_cleanup(void)
 {
+    dict_iterator_t it, next;
+
     DelServer(self, 0, NULL);
+    for (it = dict_first(channels); it; it = next) {
+        next = iter_next(it);
+        DelChannel(iter_data(it));
+    }
     dict_delete(channels);
     dict_delete(clients);
     dict_delete(servers);