1 /* A CGI which implements all of the test functions need for an interop
2 ** endpoint. */
3
4 #include <sys/utsname.h>
5 #include <errno.h>
6 #include <string.h>
7
8 #include "xmlrpc-c/base.h"
9 #include "xmlrpc-c/cgi.h"
10
11 #include "version.h"
12
13 #include "config.h" /* information about this build environment */
14
15
16 /*=========================================================================
17 ** Toolkit Identification
18 **=========================================================================
19 */
20
21 static xmlrpc_value *
whichToolkit(xmlrpc_env * const env,xmlrpc_value * const param_array,void * const user_data ATTR_UNUSED)22 whichToolkit(xmlrpc_env * const env,
23 xmlrpc_value * const param_array,
24 void * const user_data ATTR_UNUSED) {
25
26 xmlrpc_value * retval;
27
28 /* Parse our argument array. */
29 xmlrpc_parse_value(env, param_array, "()");
30 if (env->fault_occurred)
31 retval = NULL;
32 else {
33 struct utsname utsname;
34
35 int rc;
36 rc = uname(&utsname);
37 if (rc != 0) {
38 xmlrpc_env_set_fault_formatted(env, XMLRPC_INTERNAL_ERROR,
39 "uname() failed. errno=%d (%s)",
40 errno, strerror(errno));
41 retval = NULL;
42 } else {
43 /* Assemble our result. */
44 retval = xmlrpc_build_value(env, "{s:s,s:s,s:s,s:s}",
45 "toolkitDocsUrl",
46 "http://xmlrpc-c.sourceforge.net/",
47 "toolkitName", PACKAGE,
48 "toolkitVersion", XMLRPC_C_VERSION"+",
49 "toolkitOperatingSystem",
50 utsname.sysname);
51 }
52 }
53 return retval;
54 }
55
56
57
58 static char whichToolkit_help[] =
59 "Identify the toolkit used to implement this server. The operating system "
60 "information is based on where the toolkit was compiled, not where it's "
61 "currently running.";
62
63
64 /*=========================================================================
65 ** noInParams
66 **=========================================================================
67 ** Test a method with no parameters.
68 */
69
70 static xmlrpc_value *
noInParams(xmlrpc_env * const env,xmlrpc_value * const param_array,void * const user_data ATTR_UNUSED)71 noInParams(xmlrpc_env * const env,
72 xmlrpc_value * const param_array,
73 void * const user_data ATTR_UNUSED) {
74
75 /* Parse our argument array. */
76 xmlrpc_parse_value(env, param_array, "()");
77 if (env->fault_occurred)
78 return NULL;
79
80 /* Assemble our result. */
81 return xmlrpc_build_value(env, "i", (xmlrpc_int32) 0);
82 }
83
84 static char noInParams_help[] =
85 "A method with no parameters. Returns an arbitrary int.";
86
87
88 /*=========================================================================
89 ** Echo Tests
90 **=========================================================================
91 ** We're lazy--we only implement one actual echo method, but we hook it
92 ** up to lots of different names.
93 */
94
95 static xmlrpc_value *
echoValue(xmlrpc_env * const env,xmlrpc_value * const param_array,void * const user_data ATTR_UNUSED)96 echoValue(xmlrpc_env * const env,
97 xmlrpc_value * const param_array,
98 void * const user_data ATTR_UNUSED) {
99
100 xmlrpc_value *val;
101
102 /* Parse our argument array. */
103 xmlrpc_parse_value(env, param_array, "(V)", &val);
104 if (env->fault_occurred)
105 return NULL;
106
107 /* Create a new reference (because both our parameter list and our
108 ** return value will be DECREF'd when we return). */
109 xmlrpc_INCREF(val);
110
111 /* Return our result. */
112 return val;
113 }
114
115 static char echoValue_help[] =
116 "Echo an arbitrary XML-RPC value of any type.";
117
118 static char echoString_help[] =
119 "Echo an arbitrary XML-RPC string.";
120
121 static char echoInteger_help[] =
122 "Echo an arbitrary XML-RPC integer.";
123
124 static char echoBoolean_help[] =
125 "Echo an arbitrary XML-RPC boolean value.";
126
127 static char echoFloat_help[] =
128 "Echo an arbitrary XML-RPC float.";
129
130 static char echoStruct_help[] =
131 "Echo an arbitrary XML-RPC struct.";
132
133 static char echoDate_help[] =
134 "Echo an arbitrary XML-RPC date/time value.";
135
136 static char echoBase64_help[] =
137 "Echo an arbitrary XML-RPC Base64 value.";
138
139 static char echoStringArray_help[] =
140 "Echo an array of arbitrary XML-RPC strings.";
141
142 static char echoIntegerArray_help[] =
143 "Echo an array of arbitrary XML-RPC integers.";
144
145 static char echoFloatArray_help[] =
146 "Echo an array of arbitrary XML-RPC floats.";
147
148 static char echoStructArray_help[] =
149 "Echo an array of arbitrary XML-RPC structs.";
150
151
152 /*=========================================================================
153 ** Server Setup
154 **=========================================================================
155 ** Set up and run our server.
156 */
157
158 int
main(int const argc ATTR_UNUSED,char ** const argv ATTR_UNUSED)159 main(int const argc ATTR_UNUSED,
160 char ** const argv ATTR_UNUSED) {
161
162 /* Process our request. */
163 xmlrpc_cgi_init(XMLRPC_CGI_NO_FLAGS);
164
165 /* Add a method to identify our toolkit. */
166 xmlrpc_cgi_add_method_w_doc("interopEchoTests.whichToolkit",
167 &whichToolkit, NULL,
168 "S:", whichToolkit_help);
169
170 /* Add a whole bunch of test methods. */
171 xmlrpc_cgi_add_method_w_doc("interopEchoTests.noInParams",
172 &noInParams, NULL,
173 "i:", noInParams_help);
174 xmlrpc_cgi_add_method_w_doc("interopEchoTests.echoValue",
175 &echoValue, NULL,
176 "?", echoValue_help);
177 xmlrpc_cgi_add_method_w_doc("interopEchoTests.echoString",
178 &echoValue, NULL,
179 "s:s", echoString_help);
180 xmlrpc_cgi_add_method_w_doc("interopEchoTests.echoInteger",
181 &echoValue, NULL,
182 "i:i", echoInteger_help);
183 xmlrpc_cgi_add_method_w_doc("interopEchoTests.echoBoolean",
184 &echoValue, NULL,
185 "b:b", echoBoolean_help);
186 xmlrpc_cgi_add_method_w_doc("interopEchoTests.echoFloat",
187 &echoValue, NULL,
188 "d:d", echoFloat_help);
189 xmlrpc_cgi_add_method_w_doc("interopEchoTests.echoStruct",
190 &echoValue, NULL,
191 "S:S", echoStruct_help);
192 xmlrpc_cgi_add_method_w_doc("interopEchoTests.echoDate",
193 &echoValue, NULL,
194 "8:8", echoDate_help);
195 xmlrpc_cgi_add_method_w_doc("interopEchoTests.echoBase64",
196 &echoValue, NULL,
197 "6:6", echoBase64_help);
198 xmlrpc_cgi_add_method_w_doc("interopEchoTests.echoStringArray",
199 &echoValue, NULL,
200 "A:A", echoStringArray_help);
201 xmlrpc_cgi_add_method_w_doc("interopEchoTests.echoIntegerArray",
202 &echoValue, NULL,
203 "A:A", echoIntegerArray_help);
204 xmlrpc_cgi_add_method_w_doc("interopEchoTests.echoFloatArray",
205 &echoValue, NULL,
206 "A:A", echoFloatArray_help);
207 xmlrpc_cgi_add_method_w_doc("interopEchoTests.echoStructArray",
208 &echoValue, NULL,
209 "A:A", echoStructArray_help);
210
211 xmlrpc_cgi_process_call();
212 xmlrpc_cgi_cleanup();
213
214 return 0;
215 }
216