aboutsummaryrefslogtreecommitdiff
path: root/vendor/voclient/libsamp/libxrpc/zzs.c
blob: afe8beae10e37eccd192de5d1505179e9fd01f85 (plain) (blame)
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;
}