Exemple #1
0
static void read_ignores(void)
{
	IGNORE_REC *rec;
	CONFIG_NODE *node;
	GSList *tmp;

	while (ignores != NULL)
                ignore_destroy(ignores->data);

	node = iconfig_node_traverse("ignores", FALSE);
	if (node == NULL) return;

	for (tmp = node->value; tmp != NULL; tmp = tmp->next) {
		node = tmp->data;

		if (node->type != NODE_TYPE_BLOCK)
			continue;

		rec = g_new0(IGNORE_REC, 1);
		ignores = g_slist_append(ignores, rec);

		rec->mask = g_strdup(config_node_get_str(node, "mask", NULL));
		rec->pattern = g_strdup(config_node_get_str(node, "pattern", NULL));
		rec->level = level2bits(config_node_get_str(node, "level", ""));
		rec->except_level = level2bits(config_node_get_str(node, "except_level", ""));
		rec->regexp = config_node_get_bool(node, "regexp", FALSE);
		rec->fullword = config_node_get_bool(node, "fullword", FALSE);
		rec->replies = config_node_get_bool(node, "replies", FALSE);

		node = config_node_section(node, "channels", -1);
		if (node != NULL) rec->channels = config_node_get_list(node);
	}
}
Exemple #2
0
/* SYNTAX: LOG OPEN [-noopen] [-autoopen] [-window] [-<server tag>]
                    [-targets <targets>] [-colors]
		    <fname> [<levels>] */
static void cmd_log_open(const char *data)
{
        SERVER_REC *server;
        GHashTable *optlist;
	char *targetarg, *fname, *levels, *servertag;
	void *free_arg;
	char window[MAX_INT_STRLEN];
	LOG_REC *log;
	int level;

	if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST |
			    PARAM_FLAG_UNKNOWN_OPTIONS | PARAM_FLAG_OPTIONS,
			    "log open", &optlist, &fname, &levels))
		return;
	if (*fname == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);

	level = level2bits(levels);
	log = log_create_rec(fname, level != 0 ? level : MSGLEVEL_ALL);

	/* -<server tag> */
	server = cmd_options_get_server("log open", optlist, NULL);
	servertag = server == NULL ? NULL : server->tag;

	if (g_hash_table_lookup(optlist, "window")) {
		/* log by window ref# */
		targetarg = g_hash_table_lookup(optlist, "targets");
		if (targetarg == NULL || !is_numeric(targetarg, '\0')) {
			ltoa(window, active_win->refnum);
			targetarg = window;
		}
		log_item_add(log, LOG_ITEM_WINDOW_REFNUM, targetarg,
			     servertag);
	} else {
		targetarg = g_hash_table_lookup(optlist, "targets");
		if (targetarg != NULL && *targetarg != '\0')
			log_add_targets(log, targetarg, servertag);
		else if (servertag != NULL)
			log_add_targets(log, "*", servertag);
	}

	if (g_hash_table_lookup(optlist, "autoopen"))
		log->autoopen = TRUE;

	if (g_hash_table_lookup(optlist, "colors") == NULL)
		log->colorizer = log_colorizer_strip;

	log_update(log);

	if (log->handle == -1 && g_hash_table_lookup(optlist, "noopen") == NULL) {
		/* start logging */
		if (log_start_logging(log)) {
			printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
				    TXT_LOG_OPENED, fname);
		} else {
			log_close(log);
		}
	}

        cmd_params_free(free_arg);
}
Exemple #3
0
void windows_layout_restore(void)
{
	WINDOW_REC *window;
	CONFIG_NODE *node;
	GSList *tmp;

	node = iconfig_node_traverse("windows", FALSE);
	if (node == NULL) return;

	for (tmp = node->value; tmp != NULL; tmp = tmp->next) {
		CONFIG_NODE *node = tmp->data;

		window = window_create(NULL, TRUE);
		window_set_refnum(window, atoi(node->key));
                window->sticky_refnum = config_node_get_bool(node, "sticky_refnum", FALSE);
		window_set_name(window, config_node_get_str(node, "name", NULL));
		window_set_level(window, level2bits(config_node_get_str(node, "level", "")));

		window->servertag = g_strdup(config_node_get_str(node, "servertag", NULL));
		window->theme_name = g_strdup(config_node_get_str(node, "theme", NULL));
		if (window->theme_name != NULL)
			window->theme = theme_load(window->theme_name);

		window_add_items(window, config_node_section(node, "items", -1));
		signal_emit("window restore", 2, window, node);
	}

	signal_emit("windows restored", 0);
}
Exemple #4
0
static void awaylog_open(void)
{
	const char *fname, *levelstr;
	LOG_REC *log;
	int level;

	fname = settings_get_str("awaylog_file");
	levelstr = settings_get_str("awaylog_level");
	if (*fname == '\0' || *levelstr == '\0') return;

	level = level2bits(levelstr);
	if (level == 0) return;

	log = log_find(fname);
	if (log != NULL && log->handle != -1)
		return; /* already open */

	if (log == NULL) {
		log = log_create_rec(fname, level);
		log->temp = TRUE;
		log_update(log);
	}

	if (!log_start_logging(log)) {
		/* creating log file failed? close it. */
		log_close(log);
		return;
	}

	awaylog = log;
	away_filepos = lseek(log->handle, 0, SEEK_CUR);
	away_msgs = 0;
}
Exemple #5
0
/* SYNTAX: ECHO [-current] [-window <name>] [-level <level>] <text> */
static void cmd_echo(const char *data, void *server, WI_ITEM_REC *item)
{
    WINDOW_REC *window;
    GHashTable *optlist;
    char *msg, *levelstr, *winname;
    void *free_arg;
    int level;

    g_return_if_fail(data != NULL);

    if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS |
                        PARAM_FLAG_GETREST, "echo", &optlist, &msg))
        return;

    levelstr = g_hash_table_lookup(optlist, "level");
    level = levelstr == NULL ? 0 :
            level2bits(g_hash_table_lookup(optlist, "level"), NULL);
    if (level == 0) level = MSGLEVEL_CRAP;

    winname = g_hash_table_lookup(optlist, "window");
    window = winname == NULL ? NULL :
             is_numeric(winname, '\0') ?
             window_find_refnum(atoi(winname)) :
             window_find_item(NULL, winname);
    if (window == NULL) window = active_win;

    printtext_window(window, level, "%s", msg);
    cmd_params_free(free_arg);
}
Exemple #6
0
static void sig_layout_restore(void)
{
	WINDOW_REC *window;
	CONFIG_NODE *node;
	GSList *tmp;

	node = iconfig_node_traverse("windows", FALSE);
	if (node == NULL) return;

	tmp = config_node_first(node->value);
	for (; tmp != NULL; tmp = config_node_next(tmp)) {
		CONFIG_NODE *node = tmp->data;

		window = window_find_refnum(atoi(node->key));
		if (window == NULL)
			window = window_create(NULL, TRUE);

		window_set_refnum(window, atoi(node->key));
                window->sticky_refnum = config_node_get_bool(node, "sticky_refnum", FALSE);
                window->immortal = config_node_get_bool(node, "immortal", FALSE);
		window_set_name(window, config_node_get_str(node, "name", NULL));
		window_set_history(window, config_node_get_str(node, "history_name", NULL));
		window_set_level(window, level2bits(config_node_get_str(node, "level", "")));

		window->servertag = g_strdup(config_node_get_str(node, "servertag", NULL));
		window->theme_name = g_strdup(config_node_get_str(node, "theme", NULL));
		if (window->theme_name != NULL)
			window->theme = theme_load(window->theme_name);

		window_add_items(window, config_node_section(node, "items", -1));
		signal_emit("layout restore window", 2, window, node);
	}
}
Exemple #7
0
int settings_get_level(const char *key)
{
	const char *str;

	str = settings_get_str_type(key, SETTING_TYPE_LEVEL);
	return str == NULL ? 0 : level2bits(str, NULL);
}
Exemple #8
0
static void read_settings(void)
{
	int level;

	level = level2bits(settings_get_str("autocreate_query_level"));
	autocreate_dccquery = (level & MSGLEVEL_DCCMSGS) != 0;
}
Exemple #9
0
static void read_settings(void)
{
    const char *targets;

    if (hide_targets != NULL)
        g_strfreev(hide_targets);

    targets = settings_get_str("activity_hide_targets");
    hide_targets = *targets == '\0' ? NULL :
                   g_strsplit(targets, " ", -1);

    hide_level = MSGLEVEL_NEVER | MSGLEVEL_NO_ACT |
                 level2bits(settings_get_str("activity_hide_level"));
    msg_level = level2bits(settings_get_str("activity_msg_level"));
    hilight_level = MSGLEVEL_HILIGHT |
                    level2bits(settings_get_str("activity_hilight_level"));
}
Exemple #10
0
static void sig_flood(IRC_SERVER_REC *server, const char *nick, const char *host, gpointer levelp)
{
	int level, check_level;

	level = GPOINTER_TO_INT(levelp);
	check_level = level2bits(settings_get_str("autoignore_levels"));

	if (level & check_level)
		autoignore_add(server, nick, level);
}
Exemple #11
0
static void read_settings(void)
{
    int old_autolog = autolog_level;

    autolog_path = settings_get_str("autolog_path");
    autolog_level = !settings_get_bool("autolog") ? 0 :
                    level2bits(settings_get_str("autolog_level"));

    if (old_autolog && !autolog_level)
        autologs_close_all();
}
Exemple #12
0
gboolean settings_set_level(const char *key, const char *value)
{
	int iserror;

	(void)level2bits(value, &iserror);
	if (iserror)
		return FALSE;

        iconfig_node_set_str(settings_get_node(key), key, value);
	return TRUE;
}
Exemple #13
0
static void read_settings(void)
{
	querycreate_level = level2bits(settings_get_str("autocreate_query_level"));
	query_auto_close = settings_get_int("autoclose_query");
	if (query_auto_close > 0 && queryclose_tag == -1)
		queryclose_tag = g_timeout_add(5000, (GSourceFunc) sig_query_autoclose, NULL);
	else if (query_auto_close <= 0 && queryclose_tag != -1) {
		g_source_remove(queryclose_tag);
		queryclose_tag = -1;
	}
}
Exemple #14
0
static void log_read_config(void)
{
	CONFIG_NODE *node;
	LOG_REC *log;
	GSList *tmp, *next, *fnames;

	/* close old logs, save list of open logs */
	fnames = NULL;
	for (tmp = logs; tmp != NULL; tmp = next) {
		log = tmp->data;

		next = tmp->next;
		if (log->temp)
			continue;

		if (log->handle != -1)
			fnames = g_slist_append(fnames, g_strdup(log->fname));
		log_destroy(log);
	}

	node = iconfig_node_traverse("logs", FALSE);
	if (node == NULL) return;

	tmp = config_node_first(node->value);
	for (; tmp != NULL; tmp = config_node_next(tmp)) {
		node = tmp->data;

		if (node->type != NODE_TYPE_BLOCK)
			continue;

		log = g_new0(LOG_REC, 1);
		logs = g_slist_append(logs, log);

		log->handle = -1;
		log->fname = g_strdup(node->key);
		log->autoopen = config_node_get_bool(node, "auto_open", FALSE);
		log->level = level2bits(config_node_get_str(node, "level", 0));

		signal_emit("log config read", 2, log, node);

		node = config_node_section(node, "items", -1);
		if (node != NULL)
			log_items_read_config(node, log);

		if (log->autoopen || gslist_find_string(fnames, log->fname))
			log_start_logging(log);
	}

	g_slist_foreach(fnames, (GFunc) g_free, NULL);
	g_slist_free(fnames);
}
Exemple #15
0
static void cmd_log_open(const char *data)
{
    /* /LOG OPEN [-noopen] [-autoopen] [-targets <targets>] [-window]
                 [-rotate hour|day|week|month] <fname> [<levels>] */
    char *params, *args, *targetarg, *rotatearg, *fname, *levels;
    char window[MAX_INT_STRLEN];
    LOG_REC *log;
    int level, rotate;

    args = "targets rotate";
    params = cmd_get_params(data, 5 | PARAM_FLAG_MULTIARGS | PARAM_FLAG_GETREST,
                            &args, &targetarg, &rotatearg, &fname, &levels);
    if (*fname == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);

    rotate = LOG_ROTATE_NEVER;
    if (stristr(args, "-rotate")) {
        rotate = log_str2rotate(rotatearg);
        if (rotate < 0) rotate = LOG_ROTATE_NEVER;
    }

    level = level2bits(levels);
    if (level == 0) level = MSGLEVEL_ALL;

    if (stristr(args, "-window")) {
        /* log by window ref# */
        ltoa(window, active_win->refnum);
        targetarg = window;
    }

    log = log_create_rec(fname, level, targetarg);
    if (log != NULL) {
        if (stristr(args, "-autoopen"))
            log->autoopen = TRUE;
        log->rotate = rotate;
        log_update(log);

        if (log->handle == -1 && stristr(args, "-noopen") == NULL) {
            /* start logging */
            if (log_start_logging(log)) {
                printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
                            IRCTXT_LOG_OPENED, fname);
            } else {
                log_close(log);
            }
        }
    }

    g_free(params);
}
Exemple #16
0
static void read_ignores(void)
{
	IGNORE_REC *rec;
	CONFIG_NODE *node;
	GSList *tmp;

	while (ignores != NULL)
                ignore_destroy(ignores->data, FALSE);

	node = iconfig_node_traverse("ignores", FALSE);
	if (node == NULL) {
		nickmatch_rebuild(nickmatch);
		return;
	}

	tmp = config_node_first(node->value);
	for (; tmp != NULL; tmp = config_node_next(tmp)) {
		node = tmp->data;

		if (node->type != NODE_TYPE_BLOCK)
			continue;

		rec = g_new0(IGNORE_REC, 1);
		ignores = g_slist_append(ignores, rec);

		rec->mask = g_strdup(config_node_get_str(node, "mask", NULL));
		rec->pattern = g_strdup(config_node_get_str(node, "pattern", NULL));
		rec->level = level2bits(config_node_get_str(node, "level", ""), NULL);
                rec->exception = config_node_get_bool(node, "exception", FALSE);
		rec->regexp = config_node_get_bool(node, "regexp", FALSE);
		rec->fullword = config_node_get_bool(node, "fullword", FALSE);
		rec->replies = config_node_get_bool(node, "replies", FALSE);
		rec->unignore_time = config_node_get_int(node, "unignore_time", 0);
		rec->servertag = g_strdup(config_node_get_str(node, "servertag", 0));

		node = iconfig_node_section(node, "channels", -1);
		if (node != NULL) rec->channels = config_node_get_list(node);

		ignore_init_rec(rec);
	}

	nickmatch_rebuild(nickmatch);
}
Exemple #17
0
WINDOW_REC *window_create(WI_ITEM_REC *item, int automatic)
{
	WINDOW_REC *rec;

	rec = g_new0(WINDOW_REC, 1);
	rec->refnum = window_get_new_refnum();
	rec->level = level2bits(settings_get_str("window_default_level"));

	windows = g_slist_prepend(windows, rec);
	signal_emit("window created", 2, rec, GINT_TO_POINTER(automatic));

	if (item != NULL) window_item_add(rec, item, automatic);
	if (windows->next == NULL || !automatic || settings_get_bool("window_auto_change")) {
		if (automatic && windows->next != NULL)
			signal_emit("window changed automatic", 1, rec);
		window_set_active(rec);
	}
	return rec;
}
Exemple #18
0
/* SYNTAX: SCROLLBACK LEVELCLEAR [-all] [-level <level>] [<refnum>] */
static void cmd_scrollback_levelclear(const char *data)
{
	WINDOW_REC *window;
	GHashTable *optlist;
	char *refnum;
	void *free_arg;
	GSList *tmp;
	int level;
	char *levelarg;

	g_return_if_fail(data != NULL);

	if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS,
			    "scrollback levelclear", &optlist, &refnum)) return;

	levelarg = g_hash_table_lookup(optlist, "level");
	level = (levelarg == NULL || *levelarg == '\0') ? 0 :
		level2bits(replace_chars(levelarg, ',', ' '), NULL);
	if (level == 0) {
		cmd_params_free(free_arg);
		return;
	}

	if (g_hash_table_lookup(optlist, "all") != NULL) {
		/* clear all windows */
		for (tmp = windows; tmp != NULL; tmp = tmp->next) {
			window = tmp->data;
			textbuffer_view_remove_lines_by_level(WINDOW_GUI(window)->view, level);
		}
	} else if (*refnum != '\0') {
		/* clear specified window */
		window = window_find_refnum(atoi(refnum));
		if (window != NULL)
			textbuffer_view_remove_lines_by_level(WINDOW_GUI(window)->view, level);
	} else {
		/* clear active window */
		textbuffer_view_remove_lines_by_level(WINDOW_GUI(active_win)->view, level);
	}

	cmd_params_free(free_arg);
}
Exemple #19
0
/* NOTE: -network replaces the old -ircnet flag. */
static void cmd_ignore(const char *data)
{
	GHashTable *optlist;
	IGNORE_REC *rec;
	char *patternarg, *chanarg, *mask, *levels, *timestr, *servertag;
	char **channels;
	void *free_arg;
	int new_ignore, msecs, level, flags;

	if (*data == '\0') {
		cmd_ignore_show();
		return;
	}

	if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTIONS | 
			    PARAM_FLAG_GETREST | PARAM_FLAG_STRIP_TRAILING_WS,
			    "ignore", &optlist, &mask, &levels))
		return;

	patternarg = g_hash_table_lookup(optlist, "pattern");
        chanarg = g_hash_table_lookup(optlist, "channels");
	servertag = g_hash_table_lookup(optlist, "network");
	/* Allow -ircnet for backwards compatibility */
	if (!servertag)
		servertag = g_hash_table_lookup(optlist, "ircnet");

	if (*mask == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
        if (*levels == '\0') levels = "ALL";
	level = level2bits(levels, NULL);

	msecs = 0;
	timestr = g_hash_table_lookup(optlist, "time");
	if (timestr != NULL) {
		if (!parse_time_interval(timestr, &msecs))
			cmd_param_error(CMDERR_INVALID_TIME);
	}

	if (active_win->active_server != NULL &&
	    server_ischannel(active_win->active_server, mask)) {
		chanarg = mask;
		mask = NULL;
	}
	channels = (chanarg == NULL || *chanarg == '\0') ? NULL :
		g_strsplit(chanarg, ",", -1);

	flags = IGNORE_FIND_PATTERN;
	if (level & MSGLEVEL_NO_ACT)
		flags |= IGNORE_FIND_NOACT;
	if (level & MSGLEVEL_HIDDEN)
		flags |= IGNORE_FIND_HIDDEN;

	rec = ignore_find_full(servertag, mask, patternarg, channels, flags);
	new_ignore = rec == NULL;

	if (rec == NULL) {
		rec = g_new0(IGNORE_REC, 1);

		rec->mask = mask == NULL || *mask == '\0' ||
			g_strcmp0(mask, "*") == 0 ? NULL : g_strdup(mask);
		rec->channels = channels;
	} else {
                g_free_and_null(rec->pattern);
		g_strfreev(channels);
	}

	rec->level = combine_level(rec->level, levels);

	if (rec->level == MSGLEVEL_NO_ACT) {
		/* If only NO_ACT was specified add all levels; it makes no
		 * sense on its own. */
		rec->level |= MSGLEVEL_ALL;
	}

	if (rec->level == MSGLEVEL_HIDDEN) {
		/* If only HIDDEN was specified add all levels; it makes no
		 * sense on its own. */
		rec->level |= MSGLEVEL_ALL;
	}

	if (new_ignore && rec->level == 0) {
		/* tried to unignore levels from nonexisting ignore */
		printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE,
			    TXT_IGNORE_NOT_FOUND, rec->mask);
		g_free(rec->mask);
		g_strfreev(rec->channels);
		g_free(rec);
		cmd_params_free(free_arg);
                return;
	}
	rec->servertag = (servertag == NULL || *servertag == '\0') ?
		NULL : g_strdup(servertag);
	rec->pattern = (patternarg == NULL || *patternarg == '\0') ?
		NULL : g_strdup(patternarg);
	rec->exception = g_hash_table_lookup(optlist, "except") != NULL;
	rec->regexp = g_hash_table_lookup(optlist, "regexp") != NULL;
	rec->fullword = g_hash_table_lookup(optlist, "full") != NULL;
	rec->replies = g_hash_table_lookup(optlist, "replies") != NULL;
	if (msecs != 0)
		rec->unignore_time = time(NULL)+msecs/1000;

	if (new_ignore)
		ignore_add_rec(rec);
	else
		ignore_update_rec(rec);

	cmd_params_free(free_arg);
}
Exemple #20
0
static void read_settings(void)
{
    beep_msg_level = level2bits(settings_get_str("beep_msg_level"));
    beep_when_away = settings_get_bool("beep_when_away");
    beep_when_window_active = settings_get_bool("beep_when_window_active");
}
Exemple #21
0
static void handle_exec(const char *args, GHashTable *optlist,
			WI_ITEM_REC *item)
{
	PROCESS_REC *rec;
        char *target, *level;
	int notice, signum, interactive, target_nick, target_channel;

	/* check that there's no unknown options. we allowed them
	   because signals can be used as options, but there should be
	   only one unknown option: the signal name/number. */
	signum = cmd_options_get_signal("exec", optlist);
	if (signum == -2)
                return;

	if (*args == '\0') {
		exec_show_list();
                return;
	}

	target = NULL;
	notice = FALSE;

	if (g_hash_table_lookup(optlist, "in") != NULL) {
		rec = process_find(g_hash_table_lookup(optlist, "in"), TRUE);
		if (rec != NULL) {
			net_sendbuffer_send(rec->out, args, strlen(args));
			net_sendbuffer_send(rec->out, "\n", 1);
		}
		return;
	}

	/* check if args is a process ID or name. if it's ID but not found,
	   complain about it and fail immediately */
	rec = process_find(args, *args == '%');
	if (*args == '%' && rec == NULL)
		return;

        /* common options */
        target_channel = target_nick = FALSE;
	if (g_hash_table_lookup(optlist, "out") != NULL) {
                /* redirect output to active channel/query */
		if (item == NULL)
			cmd_return_error(CMDERR_NOT_JOINED);
		target = (char *) window_item_get_target(item);
		target_channel = IS_CHANNEL(item);
		target_nick = IS_QUERY(item);
	} else if (g_hash_table_lookup(optlist, "msg") != NULL) {
                /* redirect output to /msg <nick> */
		target = g_hash_table_lookup(optlist, "msg");
	} else if (g_hash_table_lookup(optlist, "notice") != NULL) {
		target = g_hash_table_lookup(optlist, "notice");
                notice = TRUE;
	}

        /* options that require process ID/name as argument */
	if (rec == NULL &&
	    (signum != -1 || g_hash_table_lookup(optlist, "close") != NULL)) {
		printtext(NULL, NULL, MSGLEVEL_CLIENTERROR,
			  "Unknown process name: %s", args);
		return;
	}
	if (g_hash_table_lookup(optlist, "close") != NULL) {
		/* forcibly close the process */
                process_destroy(rec, -1);
                return;
	}

	if (signum != -1) {
		/* send a signal to process */
                kill(rec->pid, signum);
                return;
	}

        interactive = g_hash_table_lookup(optlist, "interactive") != NULL;
	if (*args == '%') {
		/* do something to already existing process */
		char *name;

		if (target != NULL) {
                        /* redirect output to target */
			g_free_and_null(rec->target);
			rec->target = g_strdup(target);
                        rec->notice = notice;
		}

                name = g_hash_table_lookup(optlist, "name");
		if (name != NULL) {
			/* change window name */
			g_free_not_null(rec->name);
			rec->name = *name == '\0' ? NULL : g_strdup(name);
		} else if (target == NULL &&
			   (rec->target_item == NULL || interactive)) {
			/* no parameters given,
			   redirect output to the active window */
			g_free_and_null(rec->target);
			rec->target_win = active_win;

			if (rec->target_item != NULL)
				exec_wi_destroy(rec->target_item);

			if (interactive) {
				rec->target_item =
					exec_wi_create(active_win, rec);
			}
		}
                return;
	}

        /* starting a new process */
	rec = g_new0(PROCESS_REC, 1);
	rec->pid = -1;
        rec->shell = g_hash_table_lookup(optlist, "nosh") == NULL;

	process_exec(rec, args);
	if (rec->pid == -1) {
                /* pipe() or fork() failed */
		g_free(rec);
		cmd_return_error(CMDERR_ERRNO);
	}

        rec->id = process_get_new_id();
	rec->target = g_strdup(target);
	rec->target_win = active_win;
	rec->target_channel = target_channel;
	rec->target_nick = target_nick;
        rec->args = g_strdup(args);
	rec->notice = notice;
        rec->silent = g_hash_table_lookup(optlist, "-") != NULL;
        rec->quiet = g_hash_table_lookup(optlist, "quiet") != NULL;
	rec->name = g_strdup(g_hash_table_lookup(optlist, "name"));

	level = g_hash_table_lookup(optlist, "level");
	rec->level = level == NULL ? MSGLEVEL_CLIENTCRAP : level2bits(level);

	rec->read_tag = g_input_add(rec->in, G_INPUT_READ,
				    (GInputFunction) sig_exec_input_reader,
				    rec);
	processes = g_slist_append(processes, rec);

	if (rec->target == NULL && interactive)
		rec->target_item = exec_wi_create(active_win, rec);

	signal_emit("exec new", 1, rec);
}
Exemple #22
0
/* SYNTAX: HILIGHT [-nick | -word | -line] [-mask | -full | -regexp]
                   [-color <color>] [-actcolor <color>] [-level <level>]
		   [-network <network>] [-channels <channels>] <text> */
static void cmd_hilight(const char *data)
{
    GHashTable *optlist;
    HILIGHT_REC *rec;
    char *colorarg, *actcolorarg, *levelarg, *priorityarg, *chanarg, *text, *servertag;
    char **channels;
    void *free_arg;

    g_return_if_fail(data != NULL);

    if (*data == '\0') {
        cmd_hilight_show();
        return;
    }

    if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS |
                        PARAM_FLAG_GETREST, "hilight", &optlist, &text))
        return;

    chanarg = g_hash_table_lookup(optlist, "channels");
    levelarg = g_hash_table_lookup(optlist, "level");
    priorityarg = g_hash_table_lookup(optlist, "priority");
    colorarg = g_hash_table_lookup(optlist, "color");
    actcolorarg = g_hash_table_lookup(optlist, "actcolor");
    servertag = g_hash_table_lookup(optlist, "network");

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

    channels = (chanarg == NULL || *chanarg == '\0') ? NULL :
               g_strsplit(chanarg, ",", -1);

    rec = hilight_find(text, channels);
    if (rec == NULL) {
        rec = g_new0(HILIGHT_REC, 1);

        /* default to nick/word hilighting */
        rec->nick = TRUE;
        rec->word = TRUE;

        rec->text = g_strdup(text);
        rec->channels = channels;
    } else {
        g_strfreev(channels);
    }

    rec->level = (levelarg == NULL || *levelarg == '\0') ? 0 :
                 level2bits(replace_chars(levelarg, ',', ' '), NULL);
    rec->priority = priorityarg == NULL ? 0 : atoi(priorityarg);

    if (g_hash_table_lookup(optlist, "line") != NULL) {
        rec->word = FALSE;
        rec->nick = FALSE;
    }

    if (g_hash_table_lookup(optlist, "word") != NULL) {
        rec->word = TRUE;
        rec->nick = FALSE;
    }

    if (g_hash_table_lookup(optlist, "nick") != NULL)
        rec->nick = TRUE;

    rec->nickmask = g_hash_table_lookup(optlist, "mask") != NULL;
    rec->fullword = g_hash_table_lookup(optlist, "full") != NULL;
    rec->regexp = g_hash_table_lookup(optlist, "regexp") != NULL;

    if (colorarg != NULL) {
        g_free_and_null(rec->color);
        if (*colorarg != '\0')
            rec->color = g_strdup(colorarg);
    }
    if (actcolorarg != NULL) {
        g_free_and_null(rec->act_color);
        if (*actcolorarg != '\0')
            rec->act_color = g_strdup(actcolorarg);
    }
    if (servertag != NULL) {
        g_free_and_null(rec->servertag);
        if (*servertag != '\0')
            rec->servertag = g_strdup(servertag);
    }

    hilight_create(rec);

    hilight_print(g_slist_index(hilights, rec)+1, rec);
    cmd_params_free(free_arg);

    reset_cache();
}
Exemple #23
0
/* SYNTAX: HILIGHT [-nick | -nonick] [-mask | -regexp | -word]
                   [-color <color>] [-level <level>]
		   [-channels <channels>] <text> */
static void cmd_hilight(const char *data)
{
        GHashTable *optlist;
	HILIGHT_REC *rec;
	char *colorarg, *levelarg, *chanarg, *text;
	char **channels;
	void *free_arg;

	g_return_if_fail(data != NULL);

	if (*data == '\0') {
		cmd_hilight_show();
		return;
	}

	if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS |
			    PARAM_FLAG_GETREST, "hilight", &optlist, &text))
		return;

	chanarg = g_hash_table_lookup(optlist, "channels");
	levelarg = g_hash_table_lookup(optlist, "level");
	colorarg = g_hash_table_lookup(optlist, "color");

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

	channels = (chanarg == NULL || *chanarg == '\0') ? NULL :
		g_strsplit(replace_chars(chanarg, ',', ' '), " ", -1);

	rec = hilight_find(text, channels);
	if (rec == NULL) {
		rec = g_new0(HILIGHT_REC, 1);

		rec->text = g_strdup(text);
		rec->channels = channels;
	} else {
                g_free_and_null(rec->color);
		g_strfreev(channels);

                hilight_remove_config(rec);
		hilights = g_slist_remove(hilights, rec);
	}

	rec->level = (levelarg == NULL || *levelarg == '\0') ? 0 :
		level2bits(replace_chars(levelarg, ',', ' '));
	rec->nick = settings_get_bool("hilight_only_nick") &&
		(rec->level == 0 || (rec->level & DEFAULT_HILIGHT_LEVEL) == rec->level) ?
		g_hash_table_lookup(optlist, "nonick") == NULL :
		g_hash_table_lookup(optlist, "nick") != NULL;
	rec->nickmask = g_hash_table_lookup(optlist, "mask") != NULL;
	rec->fullword = g_hash_table_lookup(optlist, "word") != NULL;
	rec->regexp = g_hash_table_lookup(optlist, "regexp") != NULL;

	if (colorarg != NULL && *colorarg != '\0')
		rec->color = g_strdup(colorarg);

	hilights = g_slist_append(hilights, rec);
	hilight_add_config(rec);

	hilight_print(g_slist_index(hilights, rec)+1, rec);
        cmd_params_free(free_arg);
}