Exemplo n.º 1
0
struct unitaryc* parse_unitary_conf_file(const char *fname,
		char *err, size_t err_len)
{
	char err2[512] = { 0 };
	size_t err2_len = sizeof(err2);
	struct unitaryc *conf;
	struct json_object* jo;

	jo = parse_json_file(fname, err2, err2_len);
	if (err2[0]) {
		snprintf(err, err_len, "error parsing json file %s: %s",
			fname, err2);
		return NULL;
	}
	conf = JORM_FROMJSON_unitaryc(jo);
	json_object_put(jo);
	if (!conf) {
		snprintf(err, err_len, "ran out of memory reading "
			"config file.\n");
		return NULL;
	}
	if (conf->osd == JORM_INVAL_ARRAY) {
		snprintf(err, err_len, "No OSDs found!");
		goto error;
	}
	if (conf->mds == JORM_INVAL_ARRAY) {
		snprintf(err, err_len, "No MDSes found!");
		goto error;
	}
	return conf;

error:
	JORM_FREE_unitaryc(conf);
	return NULL;
}
Exemplo n.º 2
0
int parse_json_file(FILE *fptr, JSON_T *json_obj)
{
	int ret;
	char *key;
	char first_meet;
	char *tmpstr;
	long long tmpnum;
	double floatnum, decimal;
	JSON_T *value;

	if (!json_obj)
		return -ENOMEM;

	key = NULL;
	tmpstr = NULL;
	value = NULL;
	memset(json_obj, 0, sizeof(JSON_T));
	json_obj->type = JSON;
	json_obj->keys = NULL;

	_PARSE_SYMBOL(fptr, "{", NULL);

	while (!feof(fptr)) {
		_PARSE_SYMBOL(fptr, "\"}", &first_meet);
		if (first_meet == '}')
			break;

		ret = _parse_string(fptr, &key);
		if (ret < 0)
			goto error_handle;
		//printf("string = %s : ", key);

		_PARSE_SYMBOL(fptr, ":", NULL);
		_PARSE_SYMBOL(fptr, "\"{-0123456789.", &first_meet);
		value = malloc(sizeof(JSON_T));
		if (!value) {
			ret = -ENOMEM;
			goto error_handle;
		}
		memset(value, 0, sizeof(JSON_T));

		switch (first_meet) {
		case '\"':
			ret = _parse_string(fptr, &tmpstr);
			if (ret < 0)
				goto error_handle;
			value->type = STRING;
			value->str = tmpstr;
			//printf("value = %s\n", tmpstr);
			break;
		case '{':
			fseek(fptr, -1, SEEK_CUR);
			ret = parse_json_file(fptr, value);
			if (ret < 0)
				goto error_handle;
			break;
		case '-':
			ret = _parse_integer(fptr, &tmpnum);
			if (ret < 0) {
				goto error_handle;
			} else if (ret == 1) {
				ret = _parse_decimal(fptr, &decimal);
				if (ret < 0)
					goto error_handle;
				floatnum = tmpnum + decimal;
				value->type = FLOAT;
				value->floating = -floatnum;
			} else {
				value->type = INTEGER;
				value->integer = -tmpnum;
			}
			//printf("value = %lld\n", -tmpnum);
			break;
		default:
			fseek(fptr, -1, SEEK_CUR);
			ret = _parse_integer(fptr, &tmpnum);
			if (ret < 0) {
				goto error_handle;
			} else if (ret == 1) {
				ret = _parse_decimal(fptr, &decimal);
				if (ret < 0)
					goto error_handle;
				floatnum = tmpnum + decimal;
				value->type = FLOAT;
				value->floating = floatnum;
			} else {
				value->type = INTEGER;
				value->integer = tmpnum;
			}
			//printf("value = %lld\n", tmpnum);
			break;	
		}

		/* Insert */
		ret = insert_json_obj(json_obj, key, value);
		if (ret < 0)
			goto error_handle;

		key = NULL;
		tmpstr = NULL;
		value = NULL;

		_PARSE_SYMBOL(fptr, "},", &first_meet);
		if (first_meet == '}')
			break;
	}

	return 0;

error_handle:
	/* Do not free self because it perhaps results in
	double free error when recursing */
	free_json_obj_field(json_obj);
	if (key)
		free(key);
	if (tmpstr)
		free(tmpstr);
	if (value)
		free(value);
	return ret;
}