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); }