|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define WIN32_LEAN_AND_MEAN |
|
|
|
|
|
#include <stdlib.h> |
|
|
#include <stdio.h> |
|
|
#ifdef _WIN32 |
|
|
# include <windows.h> |
|
|
#else |
|
|
# include <unistd.h> |
|
|
#endif |
|
|
|
|
|
#include <xmlrpc-c/base.h> |
|
|
#include <xmlrpc-c/server.h> |
|
|
#include <xmlrpc-c/server_abyss.h> |
|
|
|
|
|
#include "config.h" |
|
|
|
|
|
#ifdef _WIN32 |
|
|
#define SLEEP(seconds) SleepEx(seconds * 1000, 1); |
|
|
#else |
|
|
#define SLEEP(seconds) sleep(seconds); |
|
|
#endif |
|
|
|
|
|
|
|
|
static xmlrpc_value * |
|
|
sample_add(xmlrpc_env * const envP, |
|
|
xmlrpc_value * const paramArrayP, |
|
|
void * const serverInfo, |
|
|
void * const channelInfo) { |
|
|
|
|
|
xmlrpc_int32 x, y, z; |
|
|
|
|
|
|
|
|
xmlrpc_decompose_value(envP, paramArrayP, "(ii)", &x, &y); |
|
|
if (envP->fault_occurred) |
|
|
return NULL; |
|
|
|
|
|
|
|
|
z = x + y; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (y == 1) |
|
|
SLEEP(2); |
|
|
|
|
|
|
|
|
return xmlrpc_build_value(envP, "i", z); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
main(int const argc, |
|
|
const char ** const argv) { |
|
|
|
|
|
struct xmlrpc_method_info3 const methodInfo = { |
|
|
.methodName = "sample.add", |
|
|
.methodFunction = &sample_add, |
|
|
.serverInfo = NULL |
|
|
}; |
|
|
xmlrpc_server_abyss_parms serverparm; |
|
|
xmlrpc_registry * registryP; |
|
|
xmlrpc_env env; |
|
|
|
|
|
if (argc-1 != 0) { |
|
|
fprintf(stderr, "There are no arguments. You must supply a " |
|
|
"bound socket on which to listen for client connections " |
|
|
"as Standard Input\n"); |
|
|
if (argv) {} |
|
|
exit(1); |
|
|
} |
|
|
|
|
|
xmlrpc_env_init(&env); |
|
|
|
|
|
registryP = xmlrpc_registry_new(&env); |
|
|
|
|
|
xmlrpc_registry_add_method3(&env, registryP, &methodInfo); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
serverparm.config_file_name = NULL; |
|
|
serverparm.registryP = registryP; |
|
|
serverparm.log_file_name = "/tmp/xmlrpc_log"; |
|
|
serverparm.keepalive_timeout = 0; |
|
|
serverparm.keepalive_max_conn = 0; |
|
|
serverparm.timeout = 0; |
|
|
serverparm.dont_advertise = 0; |
|
|
serverparm.socket_bound = 1; |
|
|
serverparm.socket_handle = STDIN_FILENO; |
|
|
|
|
|
printf("Running XML-RPC server...\n"); |
|
|
|
|
|
xmlrpc_server_abyss(&env, &serverparm, XMLRPC_APSIZE(socket_handle)); |
|
|
|
|
|
return 0; |
|
|
} |
|
|
|