userclient_close(session->client);
if(session->irc)
ircclient_close(session->irc);
+ if(session->timer)
+ iohandler_close(session->timer);
if(session->prev)
session->prev->next = session->next;
/* ****************** EXTERNAL EVENTS ****************** */
+static void usersession_timer_callback(struct IOEvent *event);
+
void usersession_error(struct UserSession *session, char *error) {
if(session->client) {
iohandler_printf(session->client->iofd, ":*TransparentIRC!TransIRC@TransparentIRC.system.notification NOTICE %s :[TransparentIRC] ERROR: %s", session->nick, error);
void usersession_client_close(struct UserSession *session) {
session->client = NULL;
+ if(!session->irc || !session->irc->fully_connected) {
+ usersession_close(session);
+ return;
+ }
session->idle_since = time(0);
-
+ if(!session->timer) {
+ int timeout_sec = get_int_field("session.timeout");
+ if(timeout_sec) {
+ struct timeval timeout;
+ gettimeofday(&timeout, NULL);
+ timeout.tv_sec += timeout_sec;
+ session->timer = iohandler_timer(timeout, usersession_timer_callback);
+ session->timer->data = session;
+ }
+ }
}
void usersession_client_raw(struct UserSession *session, char *raw) {
}
}
+static void usersession_timer_callback(struct IOEvent *event) {
+ struct UserSession *session = event->iofd->data;
+ switch(event->type) {
+ case IOEVENT_TIMEOUT:
+ usersession_close(session);
+ break;
+ default:
+ break;
+ }
+}
+
/* ****************** LOGIN FUNCTIONS ****************** */
static void usersession_login_accept(struct UserLogin *login);
userclient_close(active_session->client);
} //active_session->client is now NULL
active_session->client = login->client;
+ if(active_session->timer) {
+ iohandler_close(active_session->timer);
+ active_session->timer = NULL;
+ }
userclient_login_successful(login, active_session, 1);
} else {
int sessionlimit = get_int_field("auth.session_limit");