/** * Checks if player group can use @/#command * @param group_id ID of the group * @param command Command name without @/# and params * @param type enum AtCommanndType { COMMAND_ATCOMMAND = 1, COMMAND_CHARCOMMAND = 2 } */ bool pc_group_can_use_command(int group_id, const char *command, AtCommandType type) { int result = 0; config_setting_t *commands = NULL; GroupSettings *group = NULL; if (pc_group_has_permission(group_id, PC_PERM_USE_ALL_COMMANDS)) return true; if ((group = id2group(group_id)) == NULL) return false; commands = group->commands; if (commands != NULL) { config_setting_t *cmd = NULL; // <commandname> : <bool> (only atcommand) if (type == COMMAND_ATCOMMAND && config_setting_lookup_bool(commands, command, &result)) return (bool)result; // <commandname> : [ <bool>, <bool> ] ([ atcommand, charcommand ]) if ((cmd = config_setting_get_member(commands, command)) != NULL && config_setting_is_aggregate(cmd) && config_setting_length(cmd) == 2) return (bool)config_setting_get_bool_elem(cmd, AtCommandType2idx(type)); } return false; }
// // Functions to copy settings from libconfig/contrib // void config_setting_copy_simple(config_setting_t *parent, const config_setting_t *src) { if (config_setting_is_aggregate(src)) { libconfig->setting_copy_aggregate(parent, src); } else { config_setting_t *set; if( libconfig->setting_get_member(parent, config_setting_name(src)) != NULL ) return; if ((set = libconfig->setting_add(parent, config_setting_name(src), config_setting_type(src))) == NULL) return; if (CONFIG_TYPE_INT == config_setting_type(src)) { libconfig->setting_set_int(set, libconfig->setting_get_int(src)); libconfig->setting_set_format(set, src->format); } else if (CONFIG_TYPE_INT64 == config_setting_type(src)) { libconfig->setting_set_int64(set, libconfig->setting_get_int64(src)); libconfig->setting_set_format(set, src->format); } else if (CONFIG_TYPE_FLOAT == config_setting_type(src)) { libconfig->setting_set_float(set, libconfig->setting_get_float(src)); } else if (CONFIG_TYPE_STRING == config_setting_type(src)) { libconfig->setting_set_string(set, libconfig->setting_get_string(src)); } else if (CONFIG_TYPE_BOOL == config_setting_type(src)) { libconfig->setting_set_bool(set, libconfig->setting_get_bool(src)); } } }
int config_setting_copy(config_setting_t *parent, const config_setting_t *src) { if (!config_setting_is_group(parent) && !config_setting_is_list(parent)) return CONFIG_FALSE; if (config_setting_is_aggregate(src)) { libconfig->setting_copy_aggregate(parent, src); } else { libconfig->setting_copy_simple(parent, src); } return CONFIG_TRUE; }
void config_setting_copy_elem(config_setting_t *parent, const config_setting_t *src) { config_setting_t *set = NULL; if (config_setting_is_aggregate(src)) libconfig->setting_copy_aggregate(parent, src); else if (CONFIG_TYPE_INT == config_setting_type(src)) { set = libconfig->setting_set_int_elem(parent, -1, libconfig->setting_get_int(src)); libconfig->setting_set_format(set, src->format); } else if (CONFIG_TYPE_INT64 == config_setting_type(src)) { set = libconfig->setting_set_int64_elem(parent, -1, libconfig->setting_get_int64(src)); libconfig->setting_set_format(set, src->format); } else if (CONFIG_TYPE_FLOAT == config_setting_type(src)) { libconfig->setting_set_float_elem(parent, -1, libconfig->setting_get_float(src)); } else if (CONFIG_TYPE_STRING == config_setting_type(src)) { libconfig->setting_set_string_elem(parent, -1, libconfig->setting_get_string(src)); } else if (CONFIG_TYPE_BOOL == config_setting_type(src)) { libconfig->setting_set_bool_elem(parent, -1, libconfig->setting_get_bool(src)); } }
static const char *test_libconfig_setting_types(void) { struct config_t config; struct config_setting_t *t; const char *input = "/* Test File */\n" "Setting_Int: 1;\n" "Setting_Int64: 1L;\n" "Setting_Float: 1.0;\n" "Setting_Bool: true;\n" "Setting_String: \"1\";\n" "Setting_Array: [ ];\n" "Setting_Group: { };\n" "Setting_List: ( );\n" "/* End test file */\n"; if (libconfig->read_string(&config, input) == CONFIG_FALSE) { libconfig->destroy(&config); return "Unable to parse configuration."; } if (config_setting_type(config.root) != CONFIG_TYPE_GROUP) { libconfig->destroy(&config); return "CONFIG_TYPE_GROUP failed."; } if ((t = libconfig->lookup(&config, "Setting_Int")) == NULL || config_setting_type(t) != CONFIG_TYPE_INT || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || !config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_INT failed."; } if ((t = libconfig->lookup(&config, "Setting_Int64")) == NULL || config_setting_type(t) != CONFIG_TYPE_INT64 || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || !config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_INT64 failed."; } if ((t = libconfig->lookup(&config, "Setting_Float")) == NULL || config_setting_type(t) != CONFIG_TYPE_FLOAT || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || !config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_FLOAT failed."; } if ((t = libconfig->lookup(&config, "Setting_Bool")) == NULL || config_setting_type(t) != CONFIG_TYPE_BOOL || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_BOOL failed."; } if ((t = libconfig->lookup(&config, "Setting_String")) == NULL || config_setting_type(t) != CONFIG_TYPE_STRING || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_STRING failed."; } if ((t = libconfig->lookup(&config, "Setting_Array")) == NULL || config_setting_type(t) != CONFIG_TYPE_ARRAY || config_setting_is_group(t) || !config_setting_is_array(t) || config_setting_is_list(t) || !config_setting_is_aggregate(t) || config_setting_is_scalar(t) || config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_ARRAY failed."; } if ((t = libconfig->lookup(&config, "Setting_Group")) == NULL || config_setting_type(t) != CONFIG_TYPE_GROUP || !config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) || !config_setting_is_aggregate(t) || config_setting_is_scalar(t) || config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_GROUP failed."; } if ((t = libconfig->lookup(&config, "Setting_List")) == NULL || config_setting_type(t) != CONFIG_TYPE_LIST || config_setting_is_group(t) || config_setting_is_array(t) || !config_setting_is_list(t) || !config_setting_is_aggregate(t) || config_setting_is_scalar(t) || config_setting_is_number(t) ) { libconfig->destroy(&config); return "CONFIG_TYPE_LIST failed."; } libconfig->destroy(&config); return NULL; }
int gt_parse_settings(config_t *config) { config_setting_t *node, *root, *elem; int i, len, ret; struct stat st; const char *filename; if (stat(GT_USER_SETTING_PATH, &st) == 0) filename = GT_USER_SETTING_PATH; else filename = GT_SETTING_PATH; ret = config_read_file(config, filename); if (ret == CONFIG_FALSE) return -1; root = config_root_setting(config); #define GET_SETTING(name, field) do { \ node = config_setting_get_member(root, name); \ if (node) { \ if (config_setting_type(node) != CONFIG_TYPE_STRING) { \ fprintf(stderr, "%s:%d: Expected string\n", \ config_setting_source_file(node), \ config_setting_source_line(node)); \ return -1; \ } \ gt_settings.field = config_setting_get_string(node); \ } \ } while (0) GET_SETTING("default-udc", default_udc); GET_SETTING("configfs-path", configfs_path); GET_SETTING("default-template-path", default_template_path); GET_SETTING("default-gadget", default_gadget); node = config_setting_get_member(root, "lookup-path"); if (node) { if (config_setting_is_aggregate(node) == CONFIG_FALSE) { fprintf(stderr, "%s:%d: Expected list\n", config_setting_source_file(node), config_setting_source_line(node)); return -1; } len = config_setting_length(node); gt_settings.lookup_path = calloc(len + 1, sizeof(*gt_settings.lookup_path)); for (i = 0; i < len; ++i) { elem = config_setting_get_elem(node, i); if (config_setting_type(elem) != CONFIG_TYPE_STRING) { fprintf(stderr, "%s:%d: Expected string\n", config_setting_source_file(elem), config_setting_source_line(elem)); goto out; } gt_settings.lookup_path[i] = config_setting_get_string(elem); } } #undef GET_SETTING return 0; out: free(gt_settings.lookup_path); return -1; }