fixed modcmd privs parsing and extended merge_argv
authorpk910 <philipp@zoelle1.de>
Sat, 27 Aug 2011 16:36:20 +0000 (18:36 +0200)
committerpk910 <philipp@zoelle1.de>
Sat, 27 Aug 2011 16:37:37 +0000 (18:37 +0200)
IRCParser.c
IRCParser.h
modcmd.c

index bfcd44ce58a3111bfbd515346e34e739924caec4..04ec1446510e8b287817e45c74702557bd257d2b 100644 (file)
@@ -391,12 +391,16 @@ void reply(struct ClientSocket *client, struct UserNode *user, const char *text,
 }
 
 char* merge_argv(char **argv, int start, int end) {
+    return merge_argv_char(argv, start, end, ' ');
+}
+
+char* merge_argv_char(char **argv, int start, int end, char seperator) {
     int i;
     char *p = NULL;
     for(i = start; i < end; i++) {
         p = argv[i];
         while(*p) p++;
-        *p = ' ';
+        *p = seperator;
     }
     if(p) *p = '\0';
     return argv[start];
index d0ab8d6762e68830ef7712d323266bc31512b36a..ac2b376612a6dd0b14027381c0cc19a12f73f72f 100644 (file)
@@ -21,5 +21,6 @@ void init_parser();
 void free_parser();
 void reply(struct ClientSocket *client, struct UserNode *user, const char *text, ...);
 char* merge_argv(char **argv, int start, int end);
+char* merge_argv_char(char **argv, int start, int end, char seperator);
 
 #endif
\ No newline at end of file
index 7c1b0c5ec9a0f7b38afe0c8583143249e81c2c6e..dcf5cefc0097f3b44700a109057fa9ad21044f84 100644 (file)
--- a/modcmd.c
+++ b/modcmd.c
@@ -263,30 +263,28 @@ static void handle_command_async(struct ClientSocket *client, struct UserNode *u
         int access_pos = 0;
         int access_count = 0;
         int minaccess = 0;
-        char *str_a, *str_b = cbind->func->channel_access;
+        char *str_a, *str_b = cbind->func->channel_access, *str_c;
         if(cbind->flags & CMDFLAG_OVERRIDE_CHANNEL_ACCESS)
             str_b = cbind->channel_access;
         if(str_b) {
-            while((str_a = strstr(str_b, ","))) {
-                *str_a = '\0';
-                if(*str_b == '#') {
+            str_c = strdup(str_b);
+            str_b = str_c;
+            while((str_a = str_b)) {
+                str_b = strstr(str_a, ",");
+                if(str_b) {
+                    *str_b = '\0';
                     str_b++;
-                    access_pos += sprintf(access_list+access_pos, ", `%s`", str_b);
+                }
+                if(*str_a == '#') {
+                    str_a++;
+                    access_pos += sprintf(access_list+access_pos, ", `%s`", str_a);
                     access_count++;
                 } else {
-                    if(atoi(str_b) > minaccess)
-                        minaccess = atoi(str_b);
+                    if(atoi(str_a) > minaccess)
+                        minaccess = atoi(str_a);
                 }
-                *str_a = ',';
-                str_b = str_a+1;
             }
-            if(*str_b == '#') {
-                str_b++;
-                access_pos += sprintf(access_list+access_pos, ", `%s`", str_b);
-                access_count++;
-            } else if(atoi(str_b) > minaccess)
-                minaccess = atoi(str_b);
-                
+            free(str_c);
         } else
             access_list[0] = '\0';
         if(!(chan->flags & CHANFLAG_REQUESTED_CHANINFO) || (sent_chan && sent_chan == chan) || access_count || minaccess) {