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); }
/* 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); }
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); }
/* 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); }
/* 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]); }
/* 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); }
/* 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); }
/* 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; }
/* 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); }
/* 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); }
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); }
/* 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); }
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); }
static void unsubscribe_command(sub_client *c) { add_reply_string(c, "+unsubscribe", 12); add_reply_string(c, "\r\n", 2); }
/* 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); }