Merge branch 'development'
[NeonServV5.git] / src / HandleInfoHandler.c
index 0508e07413448c82c7dc22f2661b364d333db646..8a8a46ce3a0ce205b422c01907c28f62c9e78835 100644 (file)
@@ -1,4 +1,4 @@
-/* HandleInfoHandler.c - NeonServ v5.3
+/* HandleInfoHandler.c - NeonServ v5.6
  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
@@ -21,6 +21,8 @@
 #include "ChanNode.h"
 #include "IRCEvents.h"
 #include "tools.h"
+#include "modules.h"
+#include "log.h"
 
 #define AUTHSERV_NICK "AuthServ"
 
@@ -29,6 +31,7 @@
 struct HandleInfoQueueEntry {
     char *auth;
     void *callback[MAXCALLBACKS];
+    int module_id[MAXCALLBACKS];
     void *data[MAXCALLBACKS];
     
     struct HandleInfoQueueEntry *next;
@@ -38,7 +41,7 @@ static struct HandleInfoQueueEntry* addHandleInfoQueueEntry(struct ClientSocket
     struct HandleInfoQueueEntry *entry = malloc(sizeof(*entry));
     if (!entry)
     {
-        perror("malloc() failed");
+        printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
         return NULL;
     }
     SYNCHRONIZE(cache_sync);
@@ -79,7 +82,7 @@ void clear_handleinfoqueue(struct ClientSocket *client) {
     DESYNCHRONIZE(cache_sync);
 }
 
-void lookup_authname(char *auth, authlookup_callback_t callback, void *data) {
+void lookup_authname(char *auth, int module_id, authlookup_callback_t callback, void *data) {
     struct ClientSocket *bot;
     struct HandleInfoQueueEntry* entry;
     for(bot = getBots(SOCKET_FLAG_READY, NULL); bot; bot = getBots(SOCKET_FLAG_READY, bot)) {
@@ -89,6 +92,7 @@ void lookup_authname(char *auth, authlookup_callback_t callback, void *data) {
                 for(i = 1; i < MAXCALLBACKS; i++) {
                     if(!entry->callback[i]) {
                         entry->callback[i] = callback;
+                        entry->module_id[i] = module_id;
                         entry->data[i] = data;
                         return;
                     }
@@ -103,6 +107,7 @@ void lookup_authname(char *auth, authlookup_callback_t callback, void *data) {
     int i;
     entry->auth = strdup(auth);
     entry->callback[0] = callback;
+    entry->module_id[0] = module_id;
     for(i = 1; i < MAXCALLBACKS; i++)
         entry->callback[i] = NULL;
     entry->data[0] = data;
@@ -207,7 +212,7 @@ static void recv_notice(struct UserNode *user, struct UserNode *target, char *me
     
     if(do_match) {
         #ifdef HAVE_THREADS
-        unsigned long tid = syscall(SYS_gettid);
+        unsigned int tid = (unsigned int) pthread_self_tid();
         while(!clientsocket_parseorder_top(tid)) {
             usleep(1000); //1ms
         }
@@ -224,7 +229,8 @@ static void recv_notice(struct UserNode *user, struct UserNode *target, char *me
             for(i = 0; i < MAXCALLBACKS; i++) {
                 callback = entry->callback[i];
                 if(!callback) break;
-                callback(entry->auth, exists, registered, entry->data[i]);
+                if(!entry->module_id[i] || module_loaded(entry->module_id[i]))
+                    callback(entry->auth, exists, registered, entry->data[i]);
             }
             free(entry->auth);
             free(entry);
@@ -233,7 +239,7 @@ static void recv_notice(struct UserNode *user, struct UserNode *target, char *me
 }
 
 void init_handleinfohandler() {
-    bind_privnotice(recv_notice);
+    bind_privnotice(recv_notice, 0);
 }
 
 void free_handleinfohandler() {