示例#1
0
static AUTOIGNORE_REC *autoignore_find(IRC_SERVER_REC *server, const char *mask)
{
    MODULE_SERVER_REC *mserver;
    GSList *tmp;

    g_return_val_if_fail(server != NULL, NULL);
    g_return_val_if_fail(mask != NULL, NULL);

    mserver = MODULE_DATA(server);
    for (tmp = mserver->ignorelist; tmp != NULL; tmp = tmp->next) {
        AUTOIGNORE_REC *rec = tmp->data;

        if (g_strcasecmp(rec->nick, mask) == 0)
            return rec;
    }

    return NULL;
}
示例#2
0
/* SYNTAX: FORMAT [-delete | -reset] [<module>] [<key> [<value>]] */
static void cmd_format(const char *data)
{
        GHashTable *optlist;
	GSList *tmp, *modules;
	char *module, *key, *value;
	void *free_arg;
	int reset;

	if (!cmd_get_params(data, &free_arg, 3 | PARAM_FLAG_GETREST | PARAM_FLAG_OPTIONS,
			    "format", &optlist, &module, &key, &value))
		return;

	modules = get_sorted_modules();
	if (*module == '\0')
		module = NULL;
	else if (theme_search(modules, module) == NULL) {
		/* first argument isn't module.. */
		cmd_params_free(free_arg);
		if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST | PARAM_FLAG_OPTIONS,
				    "format", &optlist, &key, &value))
			return;
		module = NULL;
	}

	reset = FALSE;
	if (*key == '\0') key = NULL;
	if (g_hash_table_lookup(optlist, "reset"))
		reset = TRUE;
	else if (g_hash_table_lookup(optlist, "delete"))
		value = "";
	else if (*value == '\0')
		value = NULL;

	for (tmp = modules; tmp != NULL; tmp = tmp->next) {
		THEME_SEARCH_REC *rec = tmp->data;

		if (module == NULL || g_strcasecmp(rec->short_name, module) == 0)
			theme_show(rec, key, value, reset);
	}
	g_slist_foreach(modules, (GFunc) g_free, NULL);
	g_slist_free(modules);

        cmd_params_free(free_arg);
}
示例#3
0
int msn_buddy_list_remove( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *group )
{
	struct msn_data *md = ic->proto_data;
	char groupid[8];
	bee_user_t *bu;
	struct msn_buddy_data *bd;
	char *adl;
	
	*groupid = '\0';
#if 0
	if( group )
	{
		int i;
		for( i = 0; i < md->groupcount; i ++ )
			if( g_strcasecmp( md->grouplist[i], group ) == 0 )
			{
				g_snprintf( groupid, sizeof( groupid ), " %d", i );
				break;
			}
	}
#endif
	
	if( !( bu = bee_user_by_handle( ic->bee, ic, who ) ) ||
	    !( bd = bu->data ) || !( bd->flags & list ) )
		return 1;
	
	bd->flags &= ~list;
	
	if( list == MSN_BUDDY_FL )
		msn_soap_ab_contact_del( ic, bu );
	else
		msn_soap_memlist_edit( ic, who, FALSE, list );
	
	if( ( adl = adlrml_entry( who, list ) ) )
	{
		int st = msn_ns_write( ic, -1, "RML %d %zd\r\n%s",
		                       ++md->trId, strlen( adl ), adl );
		g_free( adl );
		
		return st;
	}
	
	return 1;
}
示例#4
0
/*--------------------------------------------------------------------------*/
static GList *
prune_list_from_dir( GList *remote_list, gint *n, const gchar *dirname )
{
	GnomeVFSFileInfo *local_info, *remote_info;
	GList            *local_list;
	GList            *p_remote, *p_local;
	gchar            *local_text_uri;
	GnomeVFSResult    ret;

	gb_debug (DEBUG_UPDATE, "START");

	if ( dirname == NULL ) return remote_list;

	local_text_uri = gnome_vfs_get_uri_from_local_path( dirname );
	if ( (ret = gnome_vfs_directory_list_load (&local_list,
						   local_text_uri,
						   GNOME_VFS_FILE_INFO_DEFAULT))
	     != GNOME_VFS_OK ) {
		return remote_list;
	}

	for ( p_local=local_list; p_local != NULL; p_local=p_local->next ) {
		local_info = (GnomeVFSFileInfo *)p_local->data;

		for ( p_remote=remote_list; p_remote != NULL; p_remote=p_remote->next ) {
			remote_info = (GnomeVFSFileInfo *)p_remote->data;
			if ( g_strcasecmp( local_info->name, remote_info->name ) == 0 ) {
				remote_list = g_list_remove_link( remote_list, p_remote );
				gnome_vfs_file_info_unref( remote_info );
				p_remote->data = remote_info = NULL;
				g_list_free_1( p_remote ); p_remote = NULL;
				*n -= 1;
				break;
			}
		}

	}
  
	g_free( local_text_uri );

	gb_debug (DEBUG_UPDATE, "END");

	return remote_list;
}
示例#5
0
/**
 * Setup labels and indexes from metadata.
 * \param pilotFile  JPilot control data.
 * \return <i>TRUE</i> is setup successfully.
 */
static gboolean jpilot_setup_labels( JPilotFile *pilotFile ) {
	gboolean retVal = FALSE;
	struct AddressAppInfo *ai;
	GList *node;

	g_return_val_if_fail( pilotFile != NULL, -1 );

	/* Release indexes */
	node = pilotFile->labelInd;
	while( node ) {
		node->data = NULL;
		node = g_list_next( node );
	}
	pilotFile->labelInd = NULL;

	if( pilotFile->readMetadata ) {
		ai = & pilotFile->addrInfo;
		node = pilotFile->customLabels;
		while( node ) {
			gchar *lbl = node->data;
			gint ind = -1;
			gint i;
			for( i = 0; i < JPILOT_NUM_LABELS; i++ ) {
				gchar *labelName = ai->labels[i];
				gchar convertBuff[ JPILOT_LEN_LABEL ];

				if( convert_charcode ) {
					conv_sjistoeuc( convertBuff, JPILOT_LEN_LABEL, labelName );
					labelName = convertBuff;
				}

				if( g_strcasecmp( labelName, lbl ) == 0 ) {
					ind = i;
					break;
				}
			}
			pilotFile->labelInd = g_list_append(
				pilotFile->labelInd, GINT_TO_POINTER(ind) );
			node = g_list_next( node );
		}
		retVal = TRUE;
	}
	return retVal;
}
示例#6
0
static void event_join(IRC_SERVER_REC *server, const char *data,
		       const char *nick, const char *address)
{
	NETSPLIT_REC *rec;

	/* check if split is over */
	rec = g_hash_table_lookup(server->splits, nick);

	if (rec != NULL && g_strcasecmp(rec->address, address) == 0) {
		/* yep, looks like it is. for same people that had the same
		   splitted servers set the timeout to one minute.

		   .. if the user just changed server, she can't use the
		   same nick (unless the server is broken) so don't bother
		   checking that the nick's server matches the split. */
		g_hash_table_foreach(server->splits,
				     (GHFunc) split_set_timeout, rec);
	}
}
示例#7
0
文件: util.c 项目: rlaager/gbonds-pkg
gchar *
gb_util_add_extension (const gchar * orig_filename)
{
	gchar *new_filename, *extension;

	extension = strrchr (orig_filename, '.');
	if (extension == NULL) {
		new_filename = g_strconcat (orig_filename, ".gbonds", NULL);
	} else {
		if (g_strcasecmp (extension, ".gbonds") != 0) {
			new_filename =
			    g_strconcat (orig_filename, ".gbonds", NULL);
		} else {
			new_filename = g_strdup (orig_filename);
		}
	}

	return new_filename;
}
示例#8
0
/* SYNTAX: WINDOW GOTO active|<number>|<name> */
static void cmd_window_goto(const char *data)
{
	WINDOW_REC *window;

	g_return_if_fail(data != NULL);

	if (is_numeric(data, 0)) {
		cmd_window_refnum(data);
		return;
	}

	if (g_strcasecmp(data, "active") == 0)
                window = window_highest_activity(active_win);
	else
                window = window_find_item(active_win, data);

	if (window != NULL)
		window_set_active(window);
}
示例#9
0
/**
 * Check whether label is in list of custom labels.
 * \param pilotFile JPilot control data.
 * \param labelName to test.
 * \return <i>TRUE</i> if found.
 */
gboolean jpilot_test_custom_label( JPilotFile *pilotFile, const gchar *labelName ) {
	gboolean retVal;
	GList *node;

	g_return_val_if_fail( pilotFile != NULL, FALSE );

	retVal = FALSE;
	if( labelName ) {
		node = pilotFile->customLabels;
		while( node ) {
			if( g_strcasecmp( labelName, ( gchar * ) node->data ) == 0 ) {
				retVal = TRUE;
				break;
			}
			node = g_list_next( node );
		}
	}
	return retVal;
}
示例#10
0
文件: dcc.c 项目: svn2github/irssi
/* SYNTAX: DCC CLOSE <type> <nick> [<file>] */
static void cmd_dcc_close(char *data, IRC_SERVER_REC *server)
{
    DCC_REC *dcc;
    GSList *tmp, *next;
    char *type, *nick, *arg;
    void *free_arg;
    gboolean found;
    int itype;

    g_return_if_fail(data != NULL);

    if (!cmd_get_params(data, &free_arg, 3, &type, &nick, &arg))
	    return;

    if (*nick == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);

    g_strup(type);
    itype = dcc_str2type(type);
    if (itype == 0)
    {
        signal_emit("dcc error unknown type", 1, type);
	cmd_params_free(free_arg);
        return;
    }

    dcc = NULL; found = FALSE;
    for (tmp = dcc_conns; tmp != NULL; tmp = next)
    {
	dcc = tmp->data;
	next = tmp->next;

        if (dcc->type == itype && g_strcasecmp(nick, dcc->nick) == 0)
        {
	    dcc_reject(dcc, server);
	    found = TRUE;
        }
    }

    if (!found)
        signal_emit("dcc error close not found", 3, type, nick, arg);

    cmd_params_free(free_arg);
}
示例#11
0
int player_filter_add_player (char *name, unsigned mask) {
  GSList *list;
  struct player_pattern *pp;
  char *pattern;
  int changed = FALSE;

  pattern = strdup_strip (name);

  if (!pattern)
    return FALSE;

  for (list = players; list; list = list->next) {
    pp = (struct player_pattern *) list->data;
    if (pp->mode == PATTERN_MODE_STRING && pp->pattern &&
                                   g_strcasecmp (pattern, pp->pattern) == 0) {
      break;
    }
  }

  if (!list) {
    pp = player_pattern_new (NULL);
    pp->pattern = pattern;
    pp->groups = 0;

    player_pattern_compile (pp);
    players = g_slist_append (players, pp);

    changed = TRUE;
  }

  mask &= PLAYER_GROUP_MASK;

  if ((pp->groups & mask) != mask) {
    pp->groups |= mask;

    filters[FILTER_PLAYER].last_changed = filter_time_inc();
    player_filter_save_patterns ();

    changed = TRUE;
  }

  return changed;
}
示例#12
0
QUERY_REC *query_find(SERVER_REC *server, const char *nick)
{
    GSList *tmp;

    g_return_val_if_fail(server == NULL || IS_SERVER(server), NULL);
    g_return_val_if_fail(nick != NULL, NULL);

    if (server != NULL)
        return query_find_server(server, nick);

    for (tmp = queries; tmp != NULL; tmp = tmp->next) {
        QUERY_REC *rec = tmp->data;

        if (g_strcasecmp(rec->name, nick) == 0)
            return rec;
    }

    return NULL;
}
示例#13
0
/*
 * Search (case insensitive) for header entry with specified name.
 * Enter: harvester Harvester.
 *        name      Header name.
 * Return: Header, or NULL if not found.
 */
static HeaderEntry *addrharvest_find( 
	AddressHarvester* harvester, const gchar *name ) {
	HeaderEntry *retVal;
	GList *node;

	retVal = NULL;
	node = harvester->headerTable;
	while( node ) {
		HeaderEntry *entry;

		entry = node->data;
		if( g_strcasecmp( entry->header, name ) == 0 ) {
			retVal = entry;
			break;
		}
		node = g_list_next( node );
	}
	return retVal;
}
示例#14
0
static void signal_query_nick_changed(QUERY_REC *query, const char *oldnick)
{
        TEXT_DEST_REC dest;

	g_return_if_fail(query != NULL);

	format_create_dest_tag(&dest, query->server, query->server_tag,
			       query->name, MSGLEVEL_NICKS, NULL);

	/* don't print the nick change message if only the case was changed */
	if (g_strcasecmp(query->name, oldnick) != 0) {
		printformat_dest(&dest,  TXT_NICK_CHANGED, oldnick,
				 query->name, query->name,
				 query->address == NULL ? "" : query->address);
	}

	signal_emit("window item changed", 2,
		    window_item_window((WI_ITEM_REC *) query), query);
}
示例#15
0
static void sig_server_connected(SERVER_REC *server)
{
	GSList *tmp;

	if (!IS_SERVER(server))
		return;

	/* check if there's any queries without server */
	for (tmp = queries; tmp != NULL; tmp = tmp->next) {
		QUERY_REC *rec = tmp->data;

		if (rec->server == NULL &&
		    (rec->server_tag == NULL ||
		     g_strcasecmp(rec->server_tag, server->tag) == 0)) {
			window_item_change_server((WI_ITEM_REC *) rec, server);
			server->queries = g_slist_append(server->queries, rec);
		}
	}
}
示例#16
0
文件: query.c 项目: svn2github/irssi
static void event_nick(const char *data, IRC_SERVER_REC *server, const char *orignick)
{
	char *params, *nick;
	GSList *tmp;

	params = event_get_params(data, 1, &nick);

	for (tmp = server->queries; tmp != NULL; tmp = tmp->next) {
		QUERY_REC *rec = tmp->data;

		if (g_strcasecmp(rec->nick, orignick) == 0) {
			g_free(rec->nick);
			rec->nick = g_strdup(nick);
			signal_emit("query nick changed", 1, rec);
		}
	}

	g_free(params);
}
示例#17
0
文件: flood.c 项目: svn2github/irssi
static void flood_privmsg(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr)
{
	char *params, *target, *text;
	int level;

	g_return_if_fail(data != NULL);
	g_return_if_fail(server != NULL);

	if (addr == NULL || g_strcasecmp(nick, server->nick) == 0)
		return;

	params = event_get_params(data, 2, &target, &text);

	level = ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS;
	if (addr != NULL && !ignore_check(server, nick, addr, target, text, level))
		flood_newmsg(server, level, nick, addr, target);

	g_free(params);
}
示例#18
0
文件: modes.c 项目: svn2github/irssi
static char *get_nicks(IRC_CHANNEL_REC *channel,
		       const char *data, int op, int voice)
{
        GString *str;
	GSList *nicks, *tmp;
	char **matches, **match, *ret;

	g_return_val_if_fail(channel != NULL, NULL);
	g_return_val_if_fail(data != NULL, NULL);
	if (*data == '\0') return NULL;

	str = g_string_new(NULL);
	matches = g_strsplit(data, " ", -1);
	for (match = matches; *match != NULL; match++) {
		if (strchr(*match, '*') == NULL && strchr(*match, '?') == NULL) {
			/* no wildcards */
                        g_string_sprintfa(str, "%s ", *match);
			continue;
		}

		/* wildcards */
		nicks = nicklist_find_multiple(CHANNEL(channel), data);
		for (tmp = nicks; tmp != NULL; tmp = tmp->next) {
			NICK_REC *rec = tmp->data;

			if ((op == 1 && !rec->op) || (op == 0 && rec->op) ||
			    (voice == 1 && !rec->voice) || (voice == 0 && rec->voice))
				continue;

			if (g_strcasecmp(rec->nick, channel->server->nick) == 0)
				continue;

			g_string_sprintfa(str, "%s ", rec->nick);
		}
		g_slist_free(nicks);
	}

        if (str->len > 0) g_string_truncate(str, str->len-1);
	ret = str->str;
	g_string_free(str, FALSE);
	return ret;
}
示例#19
0
文件: dcc.c 项目: FauxFaux/irssi
/* SYNTAX: DCC CLOSE <type> <nick> [<file>] */
static void cmd_dcc_close(char *data, IRC_SERVER_REC *server)
{
	GSList *tmp, *next;
	char *typestr, *nick, *arg;
	void *free_arg;
	int found, type;

	g_return_if_fail(data != NULL);

	if (!cmd_get_params(data, &free_arg, 3 | PARAM_FLAG_GETREST,
			    &typestr, &nick, &arg))
		return;

	if (*nick == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);

	ascii_strup(typestr);
	type = dcc_str2type(typestr);
	if (type == -1) {
		signal_emit("dcc error unknown type", 1, typestr);
		cmd_params_free(free_arg);
		return;
	}

	found = FALSE;
	for (tmp = dcc_conns; tmp != NULL; tmp = next) {
		DCC_REC *dcc = tmp->data;

		next = tmp->next;
		if (dcc->type == type && g_strcasecmp(dcc->nick, nick) == 0 &&
		    (*arg == '\0' || strcmp(dcc->arg, arg) == 0)) {
			dcc_reject(dcc, server);
			found = TRUE;
		}
	}

	if (!found) {
		signal_emit("dcc error close not found", 3,
			    typestr, nick, arg);
	}

	cmd_params_free(free_arg);
}
示例#20
0
static QUERY_REC *query_find_server(SERVER_REC *server, const char *nick)
{
    GSList *tmp;

    g_return_val_if_fail(IS_SERVER(server), NULL);

    if (server->query_find_func != NULL) {
        /* use the server specific query find function */
        return server->query_find_func(server, nick);
    }

    for (tmp = server->queries; tmp != NULL; tmp = tmp->next) {
        QUERY_REC *rec = tmp->data;

        if (g_strcasecmp(rec->name, nick) == 0)
            return rec;
    }

    return NULL;
}
示例#21
0
文件: ipc.c 项目: dequis/bitlbee-old
static void ipc_master_cmd_client( irc_t *data, char **cmd )
{
	/* Normally data points at an irc_t block, but for the IPC master
	   this is different. We think this scary cast is better than
	   creating a new command_t structure, just to make the compiler
	   happy. */
	struct bitlbee_child *child = (void*) data;
	
	if( child && cmd[1] )
	{
		child->host = g_strdup( cmd[1] );
		child->nick = g_strdup( cmd[2] );
		child->realname = g_strdup( cmd[3] );
	}
	
	/* CLIENT == On initial connects, HELLO is after /RESTARTs. */
	if( g_strcasecmp( cmd[0], "CLIENT" ) == 0 )
		ipc_to_children_str( "OPERMSG :Client connecting (PID=%d): %s@%s (%s)\r\n",
		                     (int) ( child ? child->pid : -1 ), cmd[2], cmd[1], cmd[3] );
}
示例#22
0
文件: dcc.c 项目: svn2github/irssi
/* Server connected, check if there's any open dcc sessions for this ircnet.. */
static void dcc_server_connected(IRC_SERVER_REC *server)
{
	GSList *tmp;

	g_return_if_fail(server != NULL);

	if (server->connrec->ircnet == NULL)
		return;

	for (tmp = dcc_conns; tmp != NULL; tmp = tmp->next) {
		DCC_REC *dcc = tmp->data;

		if (dcc->server == NULL && dcc->ircnet != NULL &&
		    g_strcasecmp(dcc->ircnet, server->connrec->ircnet) == 0) {
			dcc->server = server;
			g_free(dcc->mynick);
			dcc->mynick = g_strdup(server->nick);
		}
	}
}
示例#23
0
文件: fe-log.c 项目: svn2github/irssi
static void sig_server_disconnected(SERVER_REC *server)
{
        LOG_ITEM_REC *logitem;
	GSList *tmp, *next;

	for (tmp = logs; tmp != NULL; tmp = next) {
		LOG_REC *log = tmp->data;
		next = tmp->next;

		if (!log->temp || log->items == NULL)
                        continue;

		logitem = log->items->data;
		if (logitem->type == LOG_ITEM_TARGET &&
		    logitem->servertag != NULL &&
		    g_strcasecmp(logitem->servertag, server->tag) == 0 &&
		    server_ischannel(server, logitem->name)) /* kludge again.. so we won't close dcc chats */
			log_close(log);
	}
}
示例#24
0
文件: global.c 项目: zizoumgs/Aman
void globalSetCurrentIndexCombo(GtkWidget* combo, gchar* textFind){
	GtkTreeIter iter;
	gboolean valid;
	gint row_count = 0;
	GtkTreeModel * list_store = gtk_combo_box_get_model (combo);
	valid = gtk_tree_model_get_iter_first (list_store, &iter);
	while (valid){
		gchar *str_data;
		gint   int_data;
		gtk_tree_model_get (list_store, &iter,0,&str_data,-1);
		if( g_strcasecmp( str_data , textFind) == 0 ){
			g_free (str_data);
			break;
		}
		g_free (str_data);
		row_count ++;
		valid = gtk_tree_model_iter_next (list_store, &iter);
    }
    gtk_combo_box_set_active (combo, row_count);	
}
示例#25
0
Group * group_get(const gchar *name)
{
	GSList *l;
	Group *gi;
	gchar *id;

	if(name == NULL)
		id = "Kontakty";
	else
		id = (gchar *)name;

	for(l = group_list; l != NULL; l = l->next) {
		gi = (Group *)l->data;
		if(g_strcasecmp(id, gi->name) == 0) {
			return gi;
		}
	}

	return NULL;
}
示例#26
0
gint config_list_find(proplist_t prop, gchar *key, gchar *value)
{
    proplist_t item;
    gint num, max;
    gchar *ret;

    if (prop == NULL)
	return -1;

    max = PLGetNumberOfElements(prop);
    for (num = 0; num < max; num++)
    {
	item = PLGetArrayElement(prop, num);
	ret = config_get_str(item, key, NULL);
	if (ret != NULL && g_strcasecmp(ret, value) == 0)
	    return num;
    }

    return -1;
}
示例#27
0
文件: g_rc.c 项目: fvila/geda-gaf
/*! \brief Test the version of gattrib and gEDA/gaf
 * 
 * \param version Version being tested
 * \returns false if incorrect version, true if OK
 */
SCM g_rc_gattrib_version(SCM scm_version)
{
  char *version;
  SCM ret = SCM_BOOL_T;

  SCM_ASSERT (scm_is_string (scm_version), scm_version,
	      SCM_ARG1, "gattrib-version");

  version = scm_to_utf8_string (scm_version);
  if (g_strcasecmp (version, PACKAGE_DATE_VERSION) != 0) {
    fprintf(stderr,
            _("You are running gEDA/gaf version [%s%s.%s],\nbut you have a version [%s] gattribrc file.\nPlease be sure that you have the latest rc file.\n"),
            PREPEND_VERSION_STRING, PACKAGE_DOTTED_VERSION,
            PACKAGE_DATE_VERSION, version);
    ret = SCM_BOOL_F;
  }

  free (version);
  return ret;
}
示例#28
0
static NETJOIN_REC *netjoin_find(IRC_SERVER_REC *server, const char *nick)
{
	NETJOIN_SERVER_REC *srec;
	GSList *tmp;

	g_return_val_if_fail(server != NULL, NULL);
	g_return_val_if_fail(nick != NULL, NULL);

	srec = netjoin_find_server(server);
        if (srec == NULL) return NULL;

	for (tmp = srec->netjoins; tmp != NULL; tmp = tmp->next) {
		NETJOIN_REC *rec = tmp->data;

		if (g_strcasecmp(rec->nick, nick) == 0)
			return rec;
	}

	return NULL;
}
示例#29
0
/* SYNTAX: NAMES [-yes] [<channels>] */
static void cmd_names(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item)
{
	g_return_if_fail(data != NULL);

	if (!IS_IRC_SERVER(server) || !server->connected)
		cmd_return_error(CMDERR_NOT_CONNECTED);
	if (*data == '\0') cmd_return_error(CMDERR_NOT_GOOD_IDEA);

	if (strcmp(data, "*") == 0) {
		if (!IS_IRC_CHANNEL(item))
			cmd_return_error(CMDERR_NOT_JOINED);

		data = item->name;
	}

	if (g_strcasecmp(data, "-YES") == 0)
		irc_send_cmd(server, "NAMES");
	else
		irc_send_cmdv(server, "NAMES %s", data);
}
示例#30
0
static void event_names_list(const char *data, SERVER_REC *server)
{
	CHANNEL_REC *chanrec;
	char *params, *type, *channel, *names, *ptr;

	g_return_if_fail(data != NULL);

	params = event_get_params(data, 4, NULL, &type, &channel, &names);

	chanrec = channel_find(server, channel);
	if (chanrec == NULL || chanrec->names_got) {
		/* unknown channel / names list already read */
		g_free(params);
		return;
	}

	/* type = '=' = public, '*' = private, '@' = secret.

	   This is actually pretty useless to check here, but at least we
	   get to know if the channel is +p or +s a few seconds before
	   we receive the MODE reply... */
	if (*type == '*')
		parse_channel_modes(IRC_CHANNEL(chanrec), NULL, "+p");
	else if (*type == '@')
		parse_channel_modes(IRC_CHANNEL(chanrec), NULL, "+s");

	while (*names != '\0') {
		while (*names == ' ') names++;
		ptr = names;
		while (*names != '\0' && *names != ' ') names++;
		if (*names != '\0') *names++ = '\0';

		if (*ptr == '@' && g_strcasecmp(server->nick, ptr+1) == 0)
			chanrec->chanop = TRUE;

		nicklist_insert(chanrec, ptr+isnickflag(*ptr),
				*ptr == '@', *ptr == '+', FALSE);
	}

	g_free(params);
}