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);
}
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);
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);
+ }
+
+}
struct IRCClient {
struct IODescriptor *iofd;
-
struct UserSession *session;
int auth_confirmed : 1;
+ struct IRCLine *recover_header;
struct IRCClient *next, *prev;
};
+struct IRCLine {
+ char *line;
+ struct IRCLine *next;
+};
+
void ircclient_initialize(struct UserSession *session, struct UserLogin *login);
void ircclient_close(struct IRCClient *client);
void ircclient_send(struct IRCClient *client, char *line);
+void ircclient_recover_session(struct UserSession *session);
#endif