Merge branch 'development'
[NeonServV5.git] / src / ModeNode.c
index 6ed9b530b89e7b5d42ae3c7e844925bd5bf398ca..f3579cd42b71654ae34d168eddec03bf6393b5c8 100644 (file)
@@ -1,5 +1,5 @@
-/* ModeNode.c - NeonServ v5.2
- * Copyright (C) 2011  Philipp Kreil (pk910)
+/* ModeNode.c - NeonServ v5.6
+ * Copyright (C) 2011-2012  Philipp Kreil (pk910)
  * 
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #include "ChanUser.h"
 #include "UserNode.h"
 #include "BanNode.h"
+#include "log.h"
 
 static int modes_with_strarg, modes_with_intarg, modes_count;
 
 unsigned int valid_modes[] = { /* Thats our mode list :P */
     1,  'b', CHANNEL_MODE_TYPE_A,
     2,  'o', CHANNEL_MODE_TYPE_A,
-    3,  'v', CHANNEL_MODE_TYPE_A,
-    4,  'k', CHANNEL_MODE_TYPE_B | CHANNEL_MODE_VALUE_STRING | CHANNEL_MODE_KEY,
-    5,  'a', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER,
-    6,  'l', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER,
-    7,  'f', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING,
-    8,  'F', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING,
-    9,  'c', CHANNEL_MODE_TYPE_D,
-    10, 'C', CHANNEL_MODE_TYPE_D,
-    11, 'i', CHANNEL_MODE_TYPE_D,
-    12, 'm', CHANNEL_MODE_TYPE_D,
-    13, 'M', CHANNEL_MODE_TYPE_D,
-    14, 'n', CHANNEL_MODE_TYPE_D,
-    15, 'N', CHANNEL_MODE_TYPE_D,
-    16, 'p', CHANNEL_MODE_TYPE_D,
-    17, 'r', CHANNEL_MODE_TYPE_D,
-    18, 's', CHANNEL_MODE_TYPE_D,
-    19, 't', CHANNEL_MODE_TYPE_D,
-    20, 'u', CHANNEL_MODE_TYPE_D,
-    21, 'D', CHANNEL_MODE_TYPE_D,
-    22, 'd', CHANNEL_MODE_TYPE_D,
-    23, 'R', CHANNEL_MODE_TYPE_D,
-    24, 'z', CHANNEL_MODE_TYPE_D,
+    3,  'h', CHANNEL_MODE_TYPE_A,
+    4,  'v', CHANNEL_MODE_TYPE_A,
+    5,  'k', CHANNEL_MODE_TYPE_B | CHANNEL_MODE_VALUE_STRING | CHANNEL_MODE_KEY,
+    6,  'a', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER,
+    7,  'l', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER,
+    8,  'f', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING,
+    9,  'F', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING,
+    10, 'c', CHANNEL_MODE_TYPE_D,
+    11, 'C', CHANNEL_MODE_TYPE_D,
+    12, 'i', CHANNEL_MODE_TYPE_D,
+    13, 'm', CHANNEL_MODE_TYPE_D,
+    14, 'M', CHANNEL_MODE_TYPE_D,
+    15, 'n', CHANNEL_MODE_TYPE_D,
+    16, 'N', CHANNEL_MODE_TYPE_D,
+    17, 'p', CHANNEL_MODE_TYPE_D,
+    18, 'r', CHANNEL_MODE_TYPE_D,
+    19, 's', CHANNEL_MODE_TYPE_D,
+    20, 'S', CHANNEL_MODE_TYPE_D,
+    21, 't', CHANNEL_MODE_TYPE_D,
+    22, 'u', CHANNEL_MODE_TYPE_D,
+    23, 'D', CHANNEL_MODE_TYPE_D,
+    24, 'd', CHANNEL_MODE_TYPE_D,
+    25, 'R', CHANNEL_MODE_TYPE_D,
+    26, 'z', CHANNEL_MODE_TYPE_D,
 //  ^ maximum is 32!!!
     0x00, 0x00, 0x00
 };
@@ -75,7 +78,7 @@ struct ModeNode *createModeNode(struct ChanNode *chan) {
     struct ModeNode *modes = malloc(sizeof(*modes));
     if (!modes)
     {
-        perror("malloc() failed");
+        printf_log("main", LOG_ERROR, "%s:%d malloc() failed", __FILE__, __LINE__);
         return NULL;
     }
     modes->chan = chan;
@@ -181,6 +184,9 @@ void parseModes(struct ModeNode* modes, char *modeStr, char **argv, int argc) {
                 case 'o':
                     parseModesUserPriv(modes, CHANUSERFLAG_OPPED, add, argv[argpos]);
                     break;
+                case 'h':
+                    parseModesUserPriv(modes, CHANUSERFLAG_HALFOPPED, add, argv[argpos]);
+                    break;
                 case 'v':
                     parseModesUserPriv(modes, CHANUSERFLAG_VOICED, add, argv[argpos]);
                     break;
@@ -279,7 +285,7 @@ int parseMode(struct ModeNode* modes, int add, char mode, char *param) {
         modes->modes &= ~modeOpt[0];
         modes->allmodes |= modeOpt[0];
         if(MODE_TYPE == CHANNEL_MODE_TYPE_B) {
-            if(!param) return 0;
+            if(!param && !(modeOpt[2] & CHANNEL_MODE_KEY)) return 0;
             if(MODE_VALUE == CHANNEL_MODE_VALUE_STRING) {
                 free(modes->mode_str_args[MODE_VALUE_INDEX]);
                 modes->mode_str_args[MODE_VALUE_INDEX] = NULL;