static void readconfig () { const char* homedir = getenv("HOME"); const char* relconfig = ".config/dwm/config.json"; char* rulesFile = calloc(strlen(homedir) + strlen(relconfig) + 2, sizeof(char)); char* content; const nx_json *json, *js; strcpy(rulesFile, homedir); strcat(rulesFile, "/"); strcat(rulesFile, relconfig); content = load_file(rulesFile); if (content) { json = nx_json_parse_utf8(content); for (js = json->child; js; js = js->next) { if (!strcmp(js->key, "rules")) readjsonrules(js); else if (!strcmp(js->key, "tags")) readtags(js); else if (!strcmp(js->key, "font")) readfont(js); } nx_json_free(json); free(content); } if (!font) { font = calloc(strlen(fallbackfont) + 1, sizeof(char)); strcpy(font, fallbackfont); } }
/* Parse json string to c data structure, and then store them in global config */ int do_parse_config(const char *json_str, unsigned int size) { int ret = -1; char *json_str_cpy = NULL; const nx_json *js = NULL, *js_elem = NULL; if (json_str == NULL || size <= 0) { AC_ERROR("invalid parameters."); return -1; } json_str_cpy = malloc(sizeof(char) * (size + 1)); if (json_str_cpy == NULL) { goto out; } bzero(json_str_cpy, size + 1); memcpy(json_str_cpy, json_str, size); js = nx_json_parse_utf8(json_str_cpy); if (js == NULL) { AC_ERROR("config parse failed.\n"); goto out; } if (nx_json_verify(js) != 0) { AC_ERROR("nxjson verify failed.\n"); goto out; } init_global_config(); /*parse control set*/ js_elem = nx_json_get(js, CONTROL_SET_KEY); if (js_elem->type != NX_JSON_NULL) { if (do_parse_control_set(js_elem, &s_config.control->set) == 0) { display_control_set(&s_config.control->set); } } /*parse audit set*/ js_elem = nx_json_get(js, AUDIT_SET_KEY); if (js_elem->type != NX_JSON_NULL) { if (do_parse_audit_set(js_elem, &s_config.audit->set) == 0) { display_audit_set(&s_config.audit->set); } } /*parse control rule*/ js_elem = nx_json_get(js, CONTROL_RULE_KEY); if (js_elem->type != NX_JSON_NULL) { if (do_parse_control_rule(js_elem, &s_config.control->rule) == 0) { display_control_rule(&s_config.control->rule); } else { goto out; } } /*parse audit rule*/ js_elem = nx_json_get(js, AUDIT_RULE_KEY); if (js_elem->type != NX_JSON_NULL) { if (do_parse_audit_rule(js_elem, &s_config.audit->rule) == 0) { display_audit_rule(&s_config.audit->rule); } else { goto out; } } ret = 0; out: if (js != NULL) { nx_json_free(js); } if (json_str_cpy) { free(json_str_cpy); } if (ret != 0) { free_global_config(); } return ret; }