Merge branch 'development'
[NeonServV5.git] / src / IRCQueue.c
index d68f098b0bd9fd64c2a8baeea93cd1051e2c3903..a7cc1a4d00fd52521ba0cc108a3db83c9dbf0d69 100644 (file)
@@ -1,4 +1,4 @@
-/* IRCQueue.c - NeonServ v5.5
+/* IRCQueue.c - NeonServ v5.6
  * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
@@ -17,6 +17,8 @@
 #include "IRCQueue.h"
 #include "ClientSocket.h"
 #include "IOHandler.h"
+#include "tools.h"
+#include "log.h"
 
 #define MAXPENALTY 8 /* 4 messages */
 
@@ -40,11 +42,12 @@ static IOHANDLER_CALLBACK(queue_callback);
 static struct BotQueue *initialize_queue(struct ClientSocket *client) {
     struct BotQueue *queue = malloc(sizeof(*queue));
     if (!queue) {
-        perror("malloc() failed");
+        printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
         return NULL;
     }
     queue->client = client;
     client->queue = queue;
+    queue->iofd = NULL;
     queue->penalty = 0;
     queue->fastqueue_first = NULL;
     queue->fastqueue_last = NULL;
@@ -118,14 +121,18 @@ int queue_add(struct ClientSocket *client, char* msg, int len) {
         if(!queue->iofd) {
             struct timeval timeout;
             gettimeofday(&timeout, NULL);
-            queue->rem_penalty = (MAXPENALTY - queue->penalty) + 1;
+            if(queue->penalty >= MAXPENALTY)
+                queue->rem_penalty = (queue->penalty - MAXPENALTY)+1;
+            else
+                queue->rem_penalty = queue->penalty;
             timeout.tv_sec += queue->rem_penalty;
             queue->iofd = iohandler_timer(timeout, queue_callback);
+            queue->iofd->data = queue;
         }
     } else {
         struct QueueEntry *entry = malloc(sizeof(*entry));
         if (!entry) {
-            perror("malloc() failed");
+            printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
             return 0;
         }
         entry->msg = strdup(msg);
@@ -241,9 +248,13 @@ static IOHANDLER_CALLBACK(queue_callback) {
         if(queue->penalty > 0) {
             struct timeval timeout;
             gettimeofday(&timeout, NULL);
-            queue->rem_penalty = (MAXPENALTY - queue->penalty) + 1;
+            if(queue->penalty >= MAXPENALTY)
+                queue->rem_penalty = (queue->penalty - MAXPENALTY)+1;
+            else
+                queue->rem_penalty = queue->penalty;
             timeout.tv_sec += queue->rem_penalty;
             queue->iofd = iohandler_timer(timeout, queue_callback);
+            queue->iofd->data = queue;
         } else {
             queue->iofd = NULL;
             queue->penalty = 0;