1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
/* A simple standalone XML-RPC server based on Abyss that contains a
simple one-thread request processing loop.
xmlrpc_sample_add_server.c is a server that does the same thing, but
does it by running a full Abyss daemon in the background, so it has
less control over how the requests are served.
*/
#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <xmlrpc-c/base.h>
#include <xmlrpc-c/abyss.h>
#include <xmlrpc-c/server.h>
#include <xmlrpc-c/server_abyss.h>
#include "config.h" /* information about this build environment */
#define DEBUG 0
/** ************************************************************************ **/
xmlrpc_value *
test_ping(xmlrpc_env *const envP, xmlrpc_value *const paramArrayP,
void *const serverInfo, void *const channelInfo)
{
static long count = 0;
fprintf (stderr, "count = %ld\n", (long) count++);
return xmlrpc_build_value(envP, "i", 0);
}
int
main(int const argc,
const char ** const argv) {
struct xmlrpc_method_info3 const methodInfo = {
/* .methodName = */ "ping",
/* .methodFunction = */ &test_ping,
};
TServer abyssServer;
xmlrpc_registry * registryP;
xmlrpc_env env;
int terminationRequested; /* A boolean value */
const char * error;
AbyssInit (&error);
xmlrpc_env_init (&env);
registryP = xmlrpc_registry_new (&env);
xmlrpc_registry_add_method3 (&env, registryP, &methodInfo);
xmlrpc_registry_set_shutdown (registryP,
&xr_requestShutdown, &terminationRequested);
ServerCreate (&abyssServer, "XmlRpcServer", 3000, NULL, NULL);
xmlrpc_server_abyss_set_handlers2 (&abyssServer, "/RPC2", registryP);
ServerInit (&abyssServer);
xr_setupSigHandlers ();
terminationRequested = 0;
while (!terminationRequested) {
printf ("Waiting for next RPC...\n");
/* This waits for the next connection, accepts it, reads the
* HTTP POST request, executes the indicated RPC, and closes
* the connection.
*/
ServerRunOnce (&abyssServer);
}
ServerFree (&abyssServer);
AbyssTerm ();
return 0;
}
|