Пример #1
0
void
userlist_clear (session *sess)
{
	fe_userlist_clear (sess);
	userlist_free (sess);
	fe_userlist_numbers (sess);
}
Пример #2
0
static LIST_FREE_ITEM(session_free_item, session_t *) {
	xfree(data->alias);
	xfree(data->uid);
	xfree(data->descr);

	userlist_free(data);
}
Пример #3
0
static void
group_cache_drop(struct uldb_mysql_state *state)
{
  struct xml_tree *p, *q;

  for (p = state->groups.first; p; p = q) {
    q = p->right;
    p->left = p->right = 0;
    userlist_free(p);
  }
  xfree(state->groups.group_map);
  memset(&state->groups, 0, sizeof(state->groups));
}
Пример #4
0
static void
group_cache_remove_by_id(struct uldb_mysql_state *state, int group_id)
{
  struct userlist_group *grp;

  if (group_id <= 0 || group_id >= state->groups.size) return;
  if (!(grp = state->groups.group_map[group_id])) return;

  state->groups.group_map[grp->group_id] = 0;
  state->groups.count--;
  UNLINK_FROM_LIST(&grp->b,state->groups.first,state->groups.last,left,right);
  userlist_free(&grp->b);
  memset(grp, 0, sizeof(*grp));
}
Пример #5
0
static void
group_cache_remove(struct uldb_mysql_state *state, struct userlist_group *grp)
{
  if (!grp) return;

  if (grp->group_id > 0 && grp->group_id < state->groups.size
      && state->groups.group_map[grp->group_id] == grp) {
    state->groups.group_map[grp->group_id] = 0;
    state->groups.count--;
  }
  UNLINK_FROM_LIST(&grp->b,state->groups.first,state->groups.last,left,right);

  userlist_free(&grp->b);
  memset(grp, 0, sizeof(*grp));
}
Пример #6
0
static void
do_remove_session(struct session_info *p)
{
  if (!p) return;

  if (!p->prev) {
    session_first = p->next;
  } else {
    p->prev->next = p->next;
  }
  if (!p->next) {
    session_last = p->prev;
  } else {
    p->next->prev = p->prev;
  }
  // cleanup p
  userlist_free(&p->user_info->b);
  xfree(p);
}
Пример #7
0
static void
do_remove_login_from_pool(
        struct users_cache *uc,
        struct userlist_user *u)
{
  struct xml_tree *u_xml = (struct xml_tree*) u;

  if (!u) return;
  ASSERT(u->id > 0 && u->id < uc->size);

  uc->user_map[u->id] = 0;
  UNLINK_FROM_LIST(u_xml, uc->first, uc->last, left, right);
  // don't even try to free nested cntsregs and cookies
  if (u->contests) {
    u->contests->first_down = u->contests->last_down = 0;
  }
  if (u->cookies) {
    u->cookies->first_down = u->cookies->last_down = 0;
  }
  userlist_free(u_xml);
  uc->count--;
}
Пример #8
0
void
session_free (session *killsess)
{
	server *killserv = killsess->server;
	session *sess;
	GSList *list;
	int oldidx;

	plugin_emit_dummy_print (killsess, "Close Context");

	if (current_tab == killsess)
		current_tab = NULL;

	if (killserv->server_session == killsess)
		killserv->server_session = NULL;

	if (killserv->front_session == killsess)
	{
		/* front_session is closed, find a valid replacement */
		killserv->front_session = NULL;
		list = sess_list;
		while (list)
		{
			sess = (session *) list->data;
			if (sess != killsess && sess->server == killserv)
			{
				killserv->front_session = sess;
				if (!killserv->server_session)
					killserv->server_session = sess;
				break;
			}
			list = list->next;
		}
	}

	if (!killserv->server_session)
		killserv->server_session = killserv->front_session;

	sess_list = g_slist_remove (sess_list, killsess);

	if (killsess->type == SESS_CHANNEL)
		userlist_free (killsess);

	oldidx = killsess->lastact_idx;
	if (oldidx != LACT_NONE)
		sess_list_by_lastact[oldidx] = g_list_remove(sess_list_by_lastact[oldidx], killsess);

	exec_notify_kill (killsess);

	log_close (killsess);
	scrollback_close (killsess);
	chanopt_save (killsess);

	send_quit_or_part (killsess);

	history_free (&killsess->history);
	if (killsess->topic)
		free (killsess->topic);
	if (killsess->current_modes)
		free (killsess->current_modes);

	fe_session_callback (killsess);

	if (current_sess == killsess)
	{
		current_sess = NULL;
		if (sess_list)
			current_sess = sess_list->data;
	}

	free (killsess);

	if (!sess_list && !in_hexchat_exit)
		hexchat_exit ();						/* sess_list is empty, quit! */

	list = sess_list;
	while (list)
	{
		sess = (session *) list->data;
		if (sess->server == killserv)
			return;					  /* this server is still being used! */
		list = list->next;
	}

	server_free (killserv);
}
Пример #9
0
void
session_free (session *killsess)
{
	server *killserv = killsess->server;
	session *sess;
	GSList *list;

	if (current_tab == killsess)
		current_tab = NULL;

	if (killserv->server_session == killsess)
		killserv->server_session = NULL;

	if (killserv->front_session == killsess)
	{
		/* front_session is closed, find a valid replacement */
		killserv->front_session = NULL;
		list = sess_list;
		while (list)
		{
			sess = (session *) list->data;
			if (sess != killsess && sess->server == killserv)
			{
				killserv->front_session = sess;
				if (!killserv->server_session)
					killserv->server_session = sess;
				break;
			}
			list = list->next;
		}
	}

	if (!killserv->server_session)
		killserv->server_session = killserv->front_session;

	sess_list = g_slist_remove (sess_list, killsess);

	signal_emit("session destroy", 1, killsess);

	if (killsess->type == SESS_CHANNEL)
		userlist_free (killsess);

	log_close (killsess);
	scrollback_close (killsess);

	send_quit_or_part (killsess);

	history_free (&killsess->history);
	if (killsess->topic)
		free (killsess->topic);
	if (killsess->current_modes)
		free (killsess->current_modes);

	fe_session_callback (killsess);

	if (current_sess == killsess)
	{
		current_sess = NULL;
		if (sess_list)
			current_sess = sess_list->data;
	}

	if (killsess->lastact_elem)
	{
		if (killsess->lastact_idx != LACT_NONE)
			sess_list_by_lastact[killsess->lastact_idx] = g_list_delete_link(sess_list_by_lastact[killsess->lastact_idx], killsess->lastact_elem);
		else
			g_list_free_1(killsess->lastact_elem);
	}

	free (killsess);

	if (!sess_list && !in_xchat_exit)
		xchat_exit ();						/* sess_list is empty, quit! */

	list = sess_list;
	while (list)
	{
		sess = (session *) list->data;
		if (sess->server == killserv)
			return;					  /* this server is still being used! */
		list = list->next;
	}

	server_free (killserv);
}