char *xmlrpc_process(char *xml) { tXmlRPCVars *xmlrpc_vars = NULL; char *methodName = NULL; int xmlrpc_varc = 0; char *buf = NULL; if ((methodName = xmlrpc_parse(xml)) == NULL) return NULL; xmlrpc_vars = xmlrpc_process_method(methodName, &xmlrpc_varc); buf = xmlrpc_format_reply(xmlrpc_vars, xmlrpc_varc); xmlrpc_variable_free_all(); return strdup(buf); }
static void xmlrpc_handler(int fd) { fd_set rfds; struct timeval tv; int ret, len, max = 0, loadlen = -1; char buffer[CONFIG_EXAMPLES_XMLRPC_BUFFERSIZE] = { 0 }; char value[CONFIG_XMLRPC_STRINGSIZE + 1]; char *temp; /* Read in the Request Header */ do { FD_ZERO(&rfds); FD_SET(fd, &rfds); tv.tv_sec = 1; tv.tv_usec = 0; ndbg("[%d] select...\n", fd); ret = select(fd + 1, &rfds, NULL, NULL, &tv); ndbg("[%d] data ready\n", fd); if (ret > 0) { if (FD_ISSET(fd, &rfds)) { len = recv(fd, &buffer[max], 1024, 0); ndbg("[%d] %d bytes received\n", fd, len); if (len > 0) { max += len; buffer[max] = 0; ret = xmlrpc_getheader(buffer, "Content-Length:", value, CONFIG_EXAMPLES_XMLRPC_BUFFERSIZE); if (ret > 0) loadlen = atoi(value); } else { ret = -1; break; } } } else { /* Timeout... */ ndbg("[%d] timeout\n", fd); ret = -1; break; } temp = strstr(buffer, separator); if (temp) { if (strlen(temp) - 4 == loadlen) break; } } while (1); /* Determine request */ if (!strncmp(buffer, "POST", 4)) { temp = xmlrpc_findbody(buffer); xmlrpc_parse(fd, temp); } else { write(fd, notimplemented, strlen(notimplemented)); } }
void xmlrpc_process(char *buffer, void *userdata) { int retVal = 0; XMLRPCCmd *current = NULL; XMLRPCCmd *xml; char *tmp; int ac; char **av = NULL; char *name = NULL; xmlrpc_error_code = 0; if (!buffer) { xmlrpc_error_code = -1; return; } tmp = xmlrpc_parse(buffer); if (tmp) { name = xmlrpc_method(tmp); if (name) { xml = mowgli_patricia_retrieve(XMLRPCCMD, name); if (xml) { ac = xmlrpc_split_buf(tmp, &av); if (xml->func) { retVal = xml->func(userdata, ac, av); if (retVal == XMLRPC_CONT) { current = xml->next; while (current && current->func && retVal == XMLRPC_CONT) { retVal = current->func(userdata, ac, av); current = current->next; } } else { /* we assume that XMLRPC_STOP means the handler has given no output */ xmlrpc_error_code = -7; xmlrpc_generic_error(xmlrpc_error_code, "XMLRPC error: First eligible function returned XMLRPC_STOP"); } } else { xmlrpc_error_code = -6; xmlrpc_generic_error(xmlrpc_error_code, "XMLRPC error: Method has no registered function"); } } else { xmlrpc_error_code = -4; xmlrpc_generic_error(xmlrpc_error_code, "XMLRPC error: Unknown routine called"); } } else { xmlrpc_error_code = -3; xmlrpc_generic_error(xmlrpc_error_code, "XMLRPC error: Missing methodRequest or methodName."); } } else { xmlrpc_error_code = -2; xmlrpc_generic_error(xmlrpc_error_code, "XMLRPC error: Invalid document end at line 1"); } free(av); free(tmp); free(name); }