diff options
Diffstat (limited to 'src/lib/abrt_xmlrpc.c')
-rw-r--r-- | src/lib/abrt_xmlrpc.c | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/lib/abrt_xmlrpc.c b/src/lib/abrt_xmlrpc.c new file mode 100644 index 00000000..28d42325 --- /dev/null +++ b/src/lib/abrt_xmlrpc.c @@ -0,0 +1,137 @@ +/* + Copyright (C) 2010 ABRT team + Copyright (C) 2010 RedHat Inc + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ +#include "abrtlib.h" +#include "abrt_xmlrpc.h" + +void abrt_xmlrpc_die(xmlrpc_env *env) +{ + error_msg_and_die("fatal: XML-RPC(%d): %s", env->fault_code, env->fault_string); +} + +void abrt_xmlrpc_error(xmlrpc_env *env) +{ + error_msg("error: XML-RPC (%d): %s", env->fault_code, env->fault_string); +} + +struct abrt_xmlrpc *abrt_xmlrpc_new_client(const char *url, int ssl_verify) +{ + xmlrpc_env env; + xmlrpc_env_init(&env); + + struct abrt_xmlrpc *ax = xzalloc(sizeof(struct abrt_xmlrpc)); + + /* This should be done at program startup, once. We do it in main */ + /* xmlrpc_client_setup_global_const(&env); */ + + /* URL - bugzilla.redhat.com/show_bug.cgi?id=666893 Unable to make sense of + * XML-RPC response from server + * + * By default, XML data from the network may be no larger than 512K. + * XMLRPC_XML_SIZE_LIMIT_DEFAULT is #defined to (512*1024) in xmlrpc-c/base.h + * + * Users reported trouble with 733402 byte long responses, hope raising the + * limit to 2*512k is enough + */ + xmlrpc_limit_set(XMLRPC_XML_SIZE_LIMIT_ID, 2 * XMLRPC_XML_SIZE_LIMIT_DEFAULT); + + struct xmlrpc_curl_xportparms curl_parms; + memset(&curl_parms, 0, sizeof(curl_parms)); + /* curlParms.network_interface = NULL; - done by memset */ + curl_parms.no_ssl_verifypeer = !ssl_verify; + curl_parms.no_ssl_verifyhost = !ssl_verify; +#ifdef VERSION + curl_parms.user_agent = PACKAGE_NAME"/"VERSION; +#else + curl_parms.user_agent = "abrt"; +#endif + + struct xmlrpc_clientparms client_parms; + memset(&client_parms, 0, sizeof(client_parms)); + client_parms.transport = "curl"; + client_parms.transportparmsP = &curl_parms; + client_parms.transportparm_size = XMLRPC_CXPSIZE(user_agent); + + xmlrpc_client_create(&env, XMLRPC_CLIENT_NO_FLAGS, + PACKAGE_NAME, VERSION, + &client_parms, XMLRPC_CPSIZE(transportparm_size), + &ax->ax_client); + + if (env.fault_occurred) + abrt_xmlrpc_die(&env); + + ax->ax_server_info = xmlrpc_server_info_new(&env, url); + if (env.fault_occurred) + { + xmlrpc_client_destroy(ax->ax_client); + abrt_xmlrpc_die(&env); + } + + return ax; +} + +void abrt_xmlrpc_free_client(struct abrt_xmlrpc *ax) +{ + if (!ax) + return; + + if (ax->ax_server_info) + xmlrpc_server_info_free(ax->ax_server_info); + + if (ax->ax_client) + xmlrpc_client_destroy(ax->ax_client); + + free(ax); +} + +/* die or return expected results */ +xmlrpc_value *abrt_xmlrpc_call(struct abrt_xmlrpc *ax, + const char* method, const char* format, ...) +{ + xmlrpc_env env; + xmlrpc_env_init(&env); + + xmlrpc_value* param = NULL; + const char* suffix; + va_list args; + + va_start(args, format); + xmlrpc_build_value_va(&env, format, args, ¶m, &suffix); + va_end(args); + if (env.fault_occurred) + abrt_xmlrpc_die(&env); + + xmlrpc_value* result = NULL; + if (*suffix != '\0') + { + xmlrpc_env_set_fault_formatted( + &env, XMLRPC_INTERNAL_ERROR, "Junk after the argument " + "specifier: '%s'. There must be exactly one argument.", + suffix); + } + else + { + xmlrpc_client_call2(&env, ax->ax_client, ax->ax_server_info, method, + param, &result); + } + xmlrpc_DECREF(param); + if (env.fault_occurred) + abrt_xmlrpc_die(&env); + + return result; +} |