예제 #1
0
static void subscribe_command(sub_client *c)
{
    int i;
    for (i = 1; i < c->argc; i++) {
        subscribe_channel(c, c->argv[i]);
    }
    add_reply_string(c, "+subscribe", 10);
    add_reply_string(c, "\r\n", 2);
}
예제 #2
0
파일: custom.c 프로젝트: wangdkchina/xcb
/* FIXME */
void auth_command(client c) {
	if (password == NULL)
		add_reply_error(c, "no password is set");
	else if (cmppass(password, c->argv[1]) == 0) {
		c->authenticated = 1;
		add_reply_string(c, "OK\r\n", 4);
	} else {
		c->authenticated = 0;
		add_reply_error(c, "invalid password");
	}
	add_reply_string(c, "\r\n", 2);
}
예제 #3
0
파일: xcb-dp2.c 프로젝트: lbustc/xcube
static void help_command(client c) {
	int ncmds, i;

	ncmds = sizeof commands / sizeof (struct cmd);
	for (i = 0; i < ncmds; ++i) {
		struct cmd *cmd = commands + i;

		add_reply_string_format(c, "%30.30s  %s\r\n", cmd->name, cmd->doc);
	}
	add_reply_string(c, "\r\n", 2);
}
예제 #4
0
파일: custom.c 프로젝트: wangdkchina/xcb
/* FIXME */
void index_command(client c) {
	const char *fmt;

	table_lock(idxfmts);
	if ((fmt = table_get_value(idxfmts, c->argv[1])))
		add_reply_string_format(c, "%s\r\n", fmt);
	else
		add_reply_error(c, "format unavailable");
	table_unlock(idxfmts);
	add_reply_string(c, "\r\n", 2);
}
예제 #5
0
파일: xcb-dp2.c 프로젝트: lbustc/xcube
/* FIXME */
static void monitor_command(client c) {
	if (!strcasecmp(c->argv[1], "on")) {
		dlist_rwlock_wrlock(monitors);
		if (dlist_find(monitors, c) == NULL)
			dlist_insert_tail(monitors, c);
		dlist_rwlock_unlock(monitors);
	} else if (!strcasecmp(c->argv[1], "off")) {
		remove_from_monitors(c);
		add_reply_string(c, "\r\n", 2);
	} else
		add_reply_error_format(c, "unknown action '%s'\r\n", c->argv[1]);
}
예제 #6
0
파일: xcb-dp2.c 프로젝트: wood3559/xcb
/* FIXME */
static void show_command(client c) {
	if (!strcasecmp(c->argv[1], "modules")) {
		struct module *mod = get_module_list_head();

		for (; mod; mod = mod->link)
			add_reply_string_format(c, "%30.30s  %s [Status: %s]\r\n", mod->name, mod->info->desc,
				mod->flags.running == 1 ? "Running" :
					(mod->flags.declined == 1 ? "Declined" : "Failed"));
	} else
		add_reply_error_format(c, "unknown property '%s'", c->argv[1]);
	add_reply_string(c, "\r\n", 2);
}
예제 #7
0
파일: custom.c 프로젝트: wangdkchina/xcb
/* FIXME */
void u_command(client c) {
	dstr pkey, skey;
	dlist_t dlist;

	if (dstr_length(c->argv[0]) == 1) {
		add_reply_error(c, "index can't be empty\r\n");
		return;
	}
	pkey = dstr_new(c->argv[0] + 1);
	skey = dstr_new(pkey);
	if (c->argc > 1) {
		int i;

		for (i = 1; i < c->argc; ++i) {
			skey = dstr_cat(skey, ",");
			skey = dstr_cat(skey, c->argv[i]);
		}
	}
	table_rwlock_wrlock(subscribers);
	if ((dlist = table_get_value(subscribers, pkey))) {
		struct kvd *kvd;

		if (NEW(kvd)) {
			dlist_node_t node, node2;

			kvd->key = skey;
			if ((node = dlist_find(dlist, kvd))) {
				FREE(kvd);
				kvd = (struct kvd *)dlist_node_value(node);
				if ((node2 = dlist_find(kvd->u.dlist, c)))
					dlist_remove(kvd->u.dlist, node2);
				if (dlist_length(kvd->u.dlist) == 0) {
					dlist_remove(dlist, node);
					kdfree(kvd);
				}
				if (dlist_length(dlist) == 0) {
					table_remove(subscribers, pkey);
					dlist_free(&dlist);
				}
			} else
				FREE(kvd);
		} else
			add_reply_error(c, "error allocating memory for kvd");
	}
	table_rwlock_unlock(subscribers);
	dstr_free(skey);
	dstr_free(pkey);
	add_reply_string(c, "\r\n", 2);
}
예제 #8
0
파일: xcb-dp2.c 프로젝트: lbustc/xcube
/* FIXME */
static int process_command(client c) {
	/* the quit command */
	if (!strcasecmp(c->argv[0], "quit")) {
		add_reply_string(c, "OK\r\n\r\n", 6);
		c->flags |= CLIENT_CLOSE_AFTER_REPLY;
		return -1;
	}
	if ((c->cmd = table_get_value(cmds, c->argv[0])) == NULL) {
		add_reply_error_format(c, "unknown command '%s'\r\n", c->argv[0]);
		return 0;
	} else if ((c->cmd->arity > 0 && c->cmd->arity != c->argc) || c->argc < -c->cmd->arity) {
		add_reply_error_format(c, "wrong number of arguments for command '%s'\r\n", c->argv[0]);
		return 0;
	}
	c->cmd->cproc(c);
	return 0;
}
예제 #9
0
파일: custom.c 프로젝트: wangdkchina/xcb
/* FIXME */
void uall_command(client c) {
	dstr res = get_indices();
	dstr *fields = NULL;
	int nfield = 0, i;

	RTRIM(res);
	fields = dstr_split_len(res, dstr_length(res), ",", 1, &nfield);
	for (i = 1; i < nfield; ++i) {
		dstr pkey = dstr_new(fields[i]);
		dstr skey = dstr_new(pkey);
		dlist_t dlist;

		table_rwlock_wrlock(subscribers);
		if ((dlist = table_get_value(subscribers, pkey))) {
			struct kvd *kvd;

			if (NEW(kvd)) {
				dlist_node_t node, node2;

				kvd->key = skey;
				if ((node = dlist_find(dlist, kvd))) {
					FREE(kvd);
					kvd = (struct kvd *)dlist_node_value(node);
					if ((node2 = dlist_find(kvd->u.dlist, c)))
						dlist_remove(kvd->u.dlist, node2);
					if (dlist_length(kvd->u.dlist) == 0) {
						dlist_remove(dlist, node);
						kdfree(kvd);
					}
					if (dlist_length(dlist) == 0) {
						table_remove(subscribers, pkey);
						dlist_free(&dlist);
					}
				} else
					FREE(kvd);
			} else
				add_reply_error(c, "error allocating memory for kvd");
		}
		table_rwlock_unlock(subscribers);
		dstr_free(skey);
		dstr_free(pkey);
	}
	add_reply_string(c, "\r\n", 2);
	dstr_free(res);
}
예제 #10
0
파일: custom.c 프로젝트: wangdkchina/xcb
/* FIXME */
void qc_command(client c) {
	char buf[64];
	dstr rid;
	struct crss *crss;

	snprintf(buf, sizeof buf, "%p,", c);
	rid = dstr_new(buf);
	rid = dstr_cat(rid, c->argv[1]);
	if (rids == NULL)
		rids = table_new(cmpstr, hashmurmur2, kfree, NULL);
	table_lock(rids);
	if ((crss = table_get_value(rids, rid))) {
		crss->cancel = 1;
		xcb_log(XCB_LOG_DEBUG, "Query with rid '%s' got cancelled", c->argv[1]);
	}
	table_unlock(rids);
	add_reply_string(c, "\r\n", 2);
	dstr_free(rid);
}
예제 #11
0
파일: xcb-dp2.c 프로젝트: wood3559/xcb
static void module_command(client c) {
	if (!strcasecmp(c->argv[1], "load")) {
		/* FIXME */
		if (module_load("/var/lib/xcb", c->argv[2]) != MODULE_LOAD_SUCCESS)
			add_reply_error_format(c, "module '%s' loaded NOT OK", c->argv[2]);
		else
			add_reply_string_format(c, "module '%s' loaded OK\r\n", c->argv[2]);
	} else if (!strcasecmp(c->argv[1], "unload")) {
		if (module_unload(c->argv[2]) != MODULE_LOAD_SUCCESS)
			add_reply_error_format(c, "module '%s' unloaded NOT OK", c->argv[2]);
		else
			add_reply_string_format(c, "module '%s' unloaded OK\r\n", c->argv[2]);
	} else if (!strcasecmp(c->argv[1], "reload")) {
		if (module_reload(c->argv[2]) != MODULE_RELOAD_SUCCESS)
			add_reply_error_format(c, "module '%s' reloaded NOT OK", c->argv[2]);
		else
			add_reply_string_format(c, "module '%s' reloaded OK\r\n", c->argv[2]);
	} else
		add_reply_error_format(c, "unknown action '%s'", c->argv[1]);
	add_reply_string(c, "\r\n", 2);
}
예제 #12
0
파일: xcb-dp2.c 프로젝트: lbustc/xcube
/* FIXME */
static void config_command(client c) {
	if (!strcasecmp(c->argv[1], "get")) {
		pthread_mutex_lock(&cfg_lock);
		if (!strcasecmp(c->argv[2], "log_level"))
			add_reply_string_format(c, "log_level:%s\r\n",
				variable_retrieve(cfg, "general", "log_level"));
		else if (!strcasecmp(c->argv[2], "udp_port"))
			add_reply_string_format(c, "udp_port:%s\r\n",
				variable_retrieve(cfg, "general", "udp_port"));
		else if (!strcasecmp(c->argv[2], "sender") && !strcasecmp(c->argv[3], "network"))
			add_reply_string_format(c, "sender network:%s\r\n",
				variable_retrieve(cfg, "pgm_sender", "network"));
		else if (!strcasecmp(c->argv[2], "sender") && !strcasecmp(c->argv[3], "port"))
			add_reply_string_format(c, "sender port:%s\r\n",
				variable_retrieve(cfg, "pgm_sender", "port"));
		else
			add_reply_string(c, "-1\r\n", 4);
		pthread_mutex_unlock(&cfg_lock);
	} else if (!strcasecmp(c->argv[1], "set")) {
		struct category *category;

		pthread_mutex_lock(&cfg_lock);
		if (!strcasecmp(c->argv[2], "log_level") && c->argc >= 4) {
			category = category_get(cfg, "general");
			if (variable_update(category, "log_level", c->argv[3]) == 0)
				add_reply_string(c, "OK\r\n", 4);
			else
				add_reply_string(c, "-1\r\n", 4);
		} else if (!strcasecmp(c->argv[2], "udp_port") && c->argc >= 4) {
			category = category_get(cfg, "general");
			if (variable_update(category, "udp_port", c->argv[3]) == 0)
				add_reply_string(c, "OK\r\n", 4);
			else
				add_reply_string(c, "-1\r\n", 4);
		} else if (!strcasecmp(c->argv[2], "sender") && !strcasecmp(c->argv[3], "network") &&
			c->argc >= 5) {
			category = category_get(cfg, "pgm_sender");
			if (variable_update(category, "network", c->argv[4]) == 0)
				add_reply_string(c, "OK\r\n", 4);
			else
				add_reply_string(c, "-1\r\n", 4);
		} else if (!strcasecmp(c->argv[2], "sender") && !strcasecmp(c->argv[3], "port") &&
			c->argc >= 5) {
			category = category_get(cfg, "pgm_sender");
			if (variable_update(category, "port", c->argv[4]) == 0)
				add_reply_string(c, "OK\r\n", 4);
			else
				add_reply_string(c, "-1\r\n", 4);
		} else
			add_reply_string(c, "-1\r\n", 4);
		pthread_mutex_unlock(&cfg_lock);
	} else
		add_reply_error_format(c, "unknown action '%s'", c->argv[1]);
	add_reply_string(c, "\r\n", 2);
}
예제 #13
0
static void add_reply_error_length(sub_client *c, char *s, size_t len)
{
    add_reply_string(c, "-ERR ", 5);
    add_reply_string(c, s, len);
    add_reply_string(c, "\r\n", 2);
}
예제 #14
0
static void unsubscribe_command(sub_client *c)
{
    add_reply_string(c, "+unsubscribe", 12);
    add_reply_string(c, "\r\n", 2);
}
예제 #15
0
파일: custom.c 프로젝트: wangdkchina/xcb
/* FIXME */
void q_command(client c) {
	struct tm tm;
	char *end;
	char buf[64];
	dstr rid;
	struct crss *crss;

	if (!persistence) {
		add_reply_error(c, "database not open\r\n");
		return;
	}
	if (dstr_length(c->argv[0]) == 1) {
		add_reply_error(c, "index can't be empty\r\n");
		return;
	}
	if ((end = strptime(c->argv[3], "%F %T", &tm)) && *end == '\0')
		c->argv[3] = dstr_cat(c->argv[3], ".000");
	else if ((end = strptime(c->argv[3], "%F %R", &tm)) && *end == '\0')
		c->argv[3] = dstr_cat(c->argv[3], ":00.000");
	else {
		add_reply_error(c, "invalid time format, "
			"please use 'YYYY-mm-dd HH:MM:SS' or 'YYYY-mm-dd HH:MM'.\r\n");
		return;
	}
	if ((end = strptime(c->argv[4], "%F %T", &tm)) && *end == '\0')
		c->argv[4] = dstr_cat(c->argv[4], ".999");
	else if ((end = strptime(c->argv[4], "%F %R", &tm)) && *end == '\0')
		c->argv[4] = dstr_cat(c->argv[4], ":59.999");
	else {
		add_reply_error(c, "invalid time format, "
			"please use 'YYYY-mm-dd HH:MM:SS' or 'YYYY-mm-dd HH:MM'.\r\n");
		return;
	}
	snprintf(buf, sizeof buf, "%p,", c);
	rid = dstr_new(buf);
	rid = dstr_cat(rid, c->argv[1]);
	if (rids == NULL)
		rids = table_new(cmpstr, hashmurmur2, kfree, NULL);
	table_lock(rids);
	if ((crss = table_get_value(rids, rid))) {
		add_reply_error_format(c, "query with rid '%s' already exists\r\n", c->argv[1]);
		dstr_free(rid);
	} else if (NEW(crss)) {
		pthread_t thread;

		crss->c      = c;
		crss->rid    = dstr_new(c->argv[1]);
		crss->match  = dstr_new(c->argv[2]);
		crss->start  = dstr_new(c->argv[0] + 1);
		crss->start  = dstr_cat(crss->start, ",");
		crss->start  = dstr_cat(crss->start, c->argv[3]);
		crss->stop   = dstr_new(c->argv[0] + 1);
		crss->stop   = dstr_cat(crss->stop, ",");
		crss->stop   = dstr_cat(crss->stop, c->argv[4]);
		crss->cancel = 0;
		if (pthread_create(&thread, NULL, q_thread, crss) != 0) {
			add_reply_error(c, strerror(errno));
			add_reply_string(c, "\r\n", 2);
			dstr_free(crss->rid);
			dstr_free(crss->match);
			dstr_free(crss->start);
			dstr_free(crss->stop);
			FREE(crss);
			dstr_free(rid);
		} else {
			client_incr(crss->c);
			table_insert(rids, rid, crss);
		}
	} else {
		add_reply_error(c, "error allocating memory for crss\r\n");
		dstr_free(rid);
	}
	table_unlock(rids);
}