Example #1
0
void URL_free(T *U) {
	assert(U && *U);
        freeParams((*U)->params);
        FREE((*U)->paramNames);
	FREE((*U)->toString);
	FREE((*U)->query);
	FREE((*U)->data);
	FREE((*U)->host);
	FREE(*U);
}
static int handle_xml_cmd(int sock, char *data, int len)
{
	int   out_fields[RESP_FIELD_MAX + 1];
	void *out_params[RESP_FIELD_MAX + 1];
	int   in_fields[CMD_FIELD_MAX + 1];
	void *in_params[CMD_FIELD_MAX];

	int ret;
	char *resp_buf = NULL;
	struct node_info info = {
		.cmd = -1,
		.timeout = DEF_TIMEOUT,
		.debug = 0
	};

	INFO("recv cmd: %s", data);

	memset(in_fields, 0, sizeof(in_fields));
	memset(in_params, 0, sizeof(in_params));
	memset(out_fields, 0, sizeof(out_fields));
	memset(out_params, 0, sizeof(out_params));

	if (parseXmlContent(data, len, in_fields, in_params, &info)) {
		ERROR("xml parsing error.");
		return -1;
	}

	if (!info.debug) {
		/* DEBUG("alarm %d", info.timeout); */
		alarm(info.timeout);
	}
	ret = executeCmd(info.cmd, in_fields, in_params, out_fields, out_params);
	freeParams(in_fields, in_params);

	if (ret)
		ERROR("cmd %s failed: %s", cmd_name[info.cmd], strerror(ret));

	ret = createXmlResult(info.cmd, ret, out_fields, out_params, &resp_buf);
	freeParams(out_fields, out_params);

	if (!info.debug)
		alarm(0);

	if (ret || !resp_buf) {
		ERROR("create result string error.");
		return -1;
	}

	ret = send_resp(sock, resp_buf, strlen(resp_buf));
	free(resp_buf);

	return ret;
}

static void handle_request(int sock)
{
	int command, ret = 0;
	char *buffer = malloc(MAX_CMD_BUF + 1);

	if (!buffer) {
		ERROR("malloc error : %s", strerror(errno));
		return;
	}

	while (ret == 0) {

		ret = receive_cmd(sock, buffer, MAX_CMD_BUF, &command);
		//DEBUG("received cmd %d len %d", command, ret);

		if (ret == 0) {
			ERROR("Socket closed");
			break;
		}

		if (ret > 0 && command != CMD_XML) {
			ERROR("Not supported command %d", command);
			ret = INVALID_DATA;
		}

		if (ret < 0) {
			sprintf(buffer, resp_xml, status_str[-ret]);
			send_resp(sock, buffer, strlen(buffer));
			break;
		}

		ret = handle_xml_cmd(sock, buffer, ret /* len */);
		if (ret < 0) {
			ERROR("xml command %d error %d", command, ret);
			break;
		}
	}
	free(buffer);
}