diff options
| -rw-r--r-- | blabouncer.c | 36 | 
1 files changed, 31 insertions, 5 deletions
diff --git a/blabouncer.c b/blabouncer.c index 2c210b1..f85e58c 100644 --- a/blabouncer.c +++ b/blabouncer.c @@ -903,14 +903,40 @@ int processircmessage(SSL *server_ssl, char *str, int source, struct client *cli            return 1;          } -        // Server MODE received?  Store in ircdstrings for when clients connect and relay to current clients. +        // Server MODE received?  See what sort it is and act accordingly.          if (strncmp(tokens[1], "MODE", strlen(tokens[1])) == 0) { -          printf("Server MODE found and it is: %s with length %zd!  Mode is '%s'.  Storing for later.\n", tokens[1], strlen(tokens[1]), tokens[3]); +          printf("Server MODE found and it is: %s with length %zd!  Next token is '%s'.  Analysing...\n", tokens[1], strlen(tokens[1]), tokens[2]); + +          // 4 tokens could be either our initial mode or a channel mode (or something else - TODO - what else?) +          if (counter == 4) { +            // Might be our initial mode (e.g. ":nick MODE nick :+iwz") +            char comparison[MAXDATASIZE]; +            snprintf(comparison, MAXDATASIZE, ":%s MODE %s :", ircdstrings->ircnick, ircdstrings->ircnick); +            if (strncmp(str, comparison, strlen(comparison)) == 0) { +              // Looks like it! +              printf("Our initial MODE found (%s), storing for later.\n", tokens[3]); +              // Store in ircdstrings for when clients connect and relay to current clients. +              strcpy(ircdstrings->mode, tokens[3]); + +              // Relay to all current clients anyway - TODO - Necessary? +              sendtoallclients(clients, str, sourcefd, settings); + +              free(strcopyPtr); +              return 1; +            } + +            // Might be a channel mode (e.g. ":nick!user@host MODE #channel +s") +            if (tokens[2][0] == '#') { +              // Looks like it!  Tell all clients. +              printf("Channel MODE found (%s %s), telling all clients.\n", tokens[2], tokens[3]); +              sendtoallclients(clients, str, sourcefd, settings); -          // Store for new clients -          strcpy(ircdstrings->mode, tokens[3]); +              free(strcopyPtr); +              return 1; +            } +          } -          // Relay to all current clients +          // Relay to all current clients if not processed by the above            sendtoallclients(clients, str, sourcefd, settings);            free(strcopyPtr);  | 
