コード例 #1
0
ファイル: read.c プロジェクト: Travlo26/rpcd
/** Common part of request parser, usually after JSON representation is made available in req->params
 * @param req     the request
 * @param leave   leave the req->params */
static bool common(struct req *req, bool leave)
{
	ut *ut;

	/* guarantee that req->params is ok */
	if (!ut_ok(req->params)) {
		req->reply = req->params;
		req->params = NULL;
		return false;
	} else if (ut_type(req->params) != T_HASH) {
		return errcode(JSON_RPC_INVALID_REQUEST);
	}

	/* JSON-RPC argument check */
	if ((ut = uth_get(req->params, "service"))) /* used by Qooxdoo */
		req->service = ut_char(ut);

	if ((ut = uth_get(req->params, "method")))
		req->method = ut_char(ut);

	if ((ut = uth_get(req->params, "id")))
		req->id = ut_char(ut);

	/* XXX: dont check jsonrpc=2.0 */

	if (!leave) {
		if ((ut = uth_get(req->params, "params")))
			req->params = ut;
		else
			req->params = uth_set_thash(req->params, "params", NULL); /* create empty hash */

		if (ut_is_tlist(req->params) && thash_get(req->http.headers, "X-Qooxdoo-Response-Type")) {
			tlist *tl = ut_tlist(req->params);
			req->params = tlist_shift(tl);
		}
	}

	return true;
}
コード例 #2
0
ファイル: generator.c プロジェクト: iitis/iitis-generator
/** Parse config file part passed as unitype object
 * @retval 0 success
 * @retval 1 error
 */
static int parse_config_ut(struct mg *mg, ut *cfg)
{
	thash *t;
	char *key, *key2;
	ut *subcfg;
	int num1, num2;

	t = ut_thash(cfg);

	/* parse global config */
	thash_iter_loop(t, key, subcfg) {
		if (isdigit(key[0]))
			continue;

		if (streq(key, "id")) {
			mg->options.myid = ut_int(subcfg);
		} else if (streq(key, "stats")) {
			mg->options.stats = ut_int(subcfg);
		} else if (streq(key, "sync")) {
			mg->options.sync = ut_int(subcfg);
		} else if (streq(key, "root")) {
			mg->options.stats_root = ut_char(subcfg);
		} else if (streq(key, "session")) {
			mg->options.stats_sess = ut_char(subcfg);
		} else if (streq(key, "dump")) {
			mg->options.dump = ut_bool(subcfg);
		} else if (streq(key, "dump-size")) {
			mg->options.dumpsize = ut_int(subcfg);
		} else if (streq(key, "dump-beacons")) {
			mg->options.dumpb = ut_bool(subcfg);
		} else if (streq(key, "svc-ifname")) {
			mg->options.svc_ifname = ut_char(subcfg);
		} else {
			dbg(0, "unrecognized configuration file option: %s\n", key);
			return 1;
		}
	}

	/* parse per-node config */
	thash_iter_loop(t, key, subcfg) {
		if (!(isdigit(key[0]) && ut_type(subcfg) == T_HASH))
			continue;

		/* parse list consisting of ranges and lists of ids */
		while (isdigit(key[0])) {
			num1 = strtol(key, &key2, 10);

			if (key2[0] == '-') {
				/* range */
				num2 = strtol(key2+1, &key, 10);
				key++;
			} else if (key2[0] == ',') {
				/* list */
				num2 = 0;
				key = key2 + 1;
			} else {
				/* single */
				num2 = 0;
				key = key2;
			}

			/* if its for me... */
			if (mg->options.myid == num1 ||
			    (num2 > 0 && (mg->options.myid >= num1 && mg->options.myid <= num2))) {
				parse_config_ut(mg, subcfg);
			}
		}
	}

	return 0;
}