diff options
| author | Luke Bratch <luke@bratch.co.uk> | 2019-05-18 22:50:18 +0100 | 
|---|---|---|
| committer | Luke Bratch <luke@bratch.co.uk> | 2019-05-18 22:50:18 +0100 | 
| commit | 7764645c80ed542095b97eaa119d2df6340b0330 (patch) | |
| tree | a6b9de19b51d67449d49edd760e8e7db1d734b9a /blabouncer.c | |
| parent | c47b5a1531fe0e2a3b00c4a5ec80a4dc4cbe2428 (diff) | |
Handle nick in use or invalid nick, add multiple nicks to configuration file to automatically try.
Diffstat (limited to 'blabouncer.c')
| -rw-r--r-- | blabouncer.c | 41 | 
1 files changed, 40 insertions, 1 deletions
| diff --git a/blabouncer.c b/blabouncer.c index 0eb2519..ae62487 100644 --- a/blabouncer.c +++ b/blabouncer.c @@ -1,5 +1,4 @@  // TODO: -// - handle nick in use  // - Might need to change channel struct nicks to be channel struct user struct with its own nick/modes/etc.  // - Do we actually need to store the modes in the channel struct?  // - Get CAP from server and relay to client @@ -946,6 +945,46 @@ int processircmessage(SSL *server_ssl, char *str, int source, struct client *cli            return 1;          } +        // Server 432 (ERR_ERRONEUSNICKNAME) or 433 (ERR_NICKNAMEINUSE) received?  See which nick we're on and try another. +        if (strncmp(tokens[1], "432", strlen(tokens[1])) == 0 || strncmp(tokens[1], "433", strlen(tokens[1])) == 0) { +          printf("Server 432 (ERR_ERRONEUSNICKNAME) or 433 (ERR_NICKNAMEINUSE) found and it is: %s with length %zd!  Trying another nick...\n", tokens[1], strlen(tokens[1])); + +          // Make sure nick3 hasn't already been tried +          if (getconfstr("nick3", settings->conffile, settings->ircnick)) { +            // If it's the current nick already then... +            if (strncmp(ircdstrings->ircnick, settings->ircnick, strlen(settings->ircnick)) == 0) { +              // ...give up +              printf("error: server doesn't like any configured nicks, giving up.\n"); +              exit(1); +            } +          } + +          // Try nick2 +          if (!getconfstr("nick2", settings->conffile, settings->ircnick)) { +            printf("error: server doesn't like nick and can't get 'nick2' from configuration file.\n"); +            exit(1); +          } +          // Have we already tried this one?  (i.e. is it the current nick) +          if (strncmp(ircdstrings->ircnick, settings->ircnick, strlen(settings->ircnick)) == 0) { +            // Then try nick3 +            if (!getconfstr("nick3", settings->conffile, settings->ircnick)) { +              printf("error: server doesn't like nick or nick2 and can't get 'nick3' from configuration file.\n"); +              exit(1); +            } +          } + +          // Set whichever one we settled on as the current nick +          strcpy(ircdstrings->ircnick, settings->ircnick); + +          // Try it with the server +          char outgoingmsg[MAXDATASIZE]; +          snprintf(outgoingmsg, MAXDATASIZE, "NICK %s", ircdstrings->ircnick); +          // sourcefd = 0 as this is a trusted message +          sendtoserver(server_ssl, outgoingmsg, strlen(outgoingmsg), 0, clients, settings); + +          free(strcopyPtr); +          return 1; +        }        }        // Don't return if we got here because this means we didn't process something above | 
