X-Git-Url: http://git.pk910.de/?p=TransparentIRC.git;a=blobdiff_plain;f=src%2FIRCClient.c;h=eb91bafdbf684f3e6671269bb03c2dcbdfd6c61f;hp=46e030ea45ff47600042dbf9d21dc9a76ed2ae7a;hb=93381f41151945656be8f31cdae882e90af05c75;hpb=8889b0aee1dc430e735e2a0df462fd0aeee63847 diff --git a/src/IRCClient.c b/src/IRCClient.c index 46e030e..eb91baf 100644 --- a/src/IRCClient.c +++ b/src/IRCClient.c @@ -53,6 +53,12 @@ void ircclient_close(struct IRCClient *client) { client->session->irc = NULL; iohandler_printf(client->iofd, "QUIT :[TransparentIRC] Quit"); iohandler_close(client->iofd); + struct IRCLine *recover_line, *next_line; + for(recover_line = client->recover_header; recover_line; recover_line = next_line) { + next_line = recover_line->next; + free(recover_line->line); + free(recover_line); + } free(client); } @@ -85,7 +91,29 @@ static void ircclient_recv(struct IRCClient *client, char *line) { pass_to_client = 0; } } else { - + if(!stricmp(argv[1], "001") || + !stricmp(argv[1], "002") || + !stricmp(argv[1], "003") || + !stricmp(argv[1], "004") || + !stricmp(argv[1], "005") || + !stricmp(argv[1], "375") || + !stricmp(argv[1], "372") || + !stricmp(argv[1], "376") + ) { + //save these raw's for recovering the connection later + struct IRCLine *recover_line = NULL, *new_line; + if(client->recover_header) + for(recover_line = client->recover_header; recover_line->next; recover_line = recover_line->next) {}; + new_line = malloc(sizeof(*new_line)); + if(new_line) { + new_line->line = strdup(line); + new_line->next = NULL; + if(recover_line) + recover_line->next = new_line; + else + client->recover_header = new_line; + } + } } if(pass_to_client) usersession_client_raw(session, line); @@ -114,3 +142,13 @@ static void ircclient_callback(struct IOEvent *event) { void ircclient_send(struct IRCClient *client, char *line) { iohandler_printf(client->iofd, "%s", line); } + +void ircclient_recover_session(struct UserSession *session) { + struct IRCClient *client = session->irc; + //replay header + struct IRCLine *recover_line; + for(recover_line = client->recover_header; recover_line; recover_line = recover_line->next) { + usersession_client_raw(session, recover_line->line); + } + +}