#include #include "cmd.h" #include "error.h" #include "config.h" #include "api.h" #include "uio.h" #include "net.h" #include "cache.h" struct cmd_entry { bool need_api : 1; /* Does this command needs to connect to the api? */ bool need_auth : 1; /* Does this command needs auth to the api? sets need_api */ bool need_cache : 1; /* Does this cmd needs the file cache? */ const char *arg_name; /* If this argument is present, execute this cmd */ enum error (*argcheck)(void); /* Function to check argument correctness before calling fn */ enum error (*fn)(void *data); /* The function for the command */ }; static const struct cmd_entry ents[] = { { .arg_name = "version", .fn = cmd_prog_version, }, { .arg_name = "server-version", .fn = cmd_server_version, .need_api = true }, { .arg_name = "uptime", .fn = cmd_server_uptime, .need_auth = true }, { .arg_name = "ed2k", .fn = cmd_ed2k, }, { .arg_name = "add", .fn = cmd_add, .argcheck = cmd_add_argcheck, .need_auth = true, .need_cache = true, }, { .arg_name = "modify", .fn = cmd_modify, .argcheck = cmd_modify_argcheck, .need_auth = true, .need_cache = true, }, { .arg_name = "stats", .fn = cmd_stats, .need_auth = true, .need_cache = false, }, }; static const int32_t ents_len = sizeof(ents)/sizeof(*ents); static enum error cmd_run_one(const struct cmd_entry *ent) { enum error err = NOERR; if (ent->argcheck) { err = ent->argcheck(); if (err != NOERR) goto end; } if (ent->need_cache) { err = cache_init(); if (err != NOERR) goto end; } if (ent->need_api || ent->need_auth) { err = api_init(ent->need_auth); if (err != NOERR) return err; } void *data = NULL; err = ent->fn(data); end: if (ent->need_api || ent->need_auth) api_free(); if (ent->need_cache) cache_free(); return err; } enum error cmd_main() { for (int i = 0; i < ents_len; i++) { enum error err; bool *is_set; err = config_get(ents[i].arg_name, (void**)&is_set); if (err != NOERR && err != ERR_OPT_UNSET) { uio_error("Cannot get arg '%s' (%s)", ents[i].arg_name, error_to_string(err)); continue; } if (*is_set) { err = cmd_run_one(&ents[i]); return err; } } return ERR_CMD_NONE; }