1 /*****************************************************************************
2  *
3  * FILE:	sxmlrpc.h
4  * DESCRIPTION:	Skimpy XML-RPC library header file
5  * DATE:	Sat, Mar 18 2006
6  * UPDATED:	Tue, Sep  4 2007
7  * AUTHOR:	Kouichi ABE (WALL) / ��������
8  * E-MAIL:	kouichi@MysticWALL.COM
9  * URL:		http://www.MysticWALL.COM/
10  * COPYRIGHT:	(c) 2006-2007 �������졿Kouichi ABE (WALL), All rights reserved.
11  * NOTES:	http://www.xmlrpc.com/spec
12  * LICENSE:
13  *
14  *  Copyright (c) 2006-2007 Kouichi ABE (WALL) <kouichi@MysticWALL.COM>,
15  *  All rights reserved.
16  *
17  *  Redistribution and use in source and binary forms, with or without
18  *  modification, are permitted provided that the following conditions
19  *  are met:
20  *
21  *   1. Redistributions of source code must retain the above copyright
22  *      notice, this list of conditions and the following disclaimer.
23  *   2. Redistributions in binary form must reproduce the above copyright
24  *      notice, this list of conditions and the following disclaimer in the
25  *      documentation and/or other materials provided with the distribution.
26  *
27  *   THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
28  *   ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29  *   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30  *   ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
31  *   FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32  *   DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33  *   OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34  *   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35  *   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36  *   OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37  *   SUCH DAMAGE.
38  *
39  * $Id: sxmlrpc.h,v 1.10 2007/09/04 08:18:02 kouichi Exp $
40  *
41  *****************************************************************************/
42 
43 #ifndef	_SXMLRPC_H
44 #define	_SXMLRPC_H
45 
46 #include <stdio.h>
47 #include <sys/types.h>
48 
49 /******************************************************************************
50  *
51  *	Macros and structures definition
52  *
53  *****************************************************************************/
54 /*
55  * Numeric release version identifier:
56  * MNNFFPPS: major minor fix patch status
57  * The status nibble has one of the values 0 for development,
58  * 1 to e for betas 1 to 14, and f for release.
59  * The patch level is exactly that.
60  */
61 #define	SXMLRPC_VERSION_NUMBER	0x10004000L
62 #define	SXMLRPC_VERSION		"SXMLRPC/1.0.4"
63 #define	SXMLRPC_VERSION_TEXT	SXMLRPC_VERSION " (2007/09/04)"
64 #define	SXMLRPC_VERSION_TEXT_LONG \
65 	"Skimpy XML-RPC Library 1.0.4, Tue, Sep  4 2007"
66 
67 /* XML-RPC server/client */
68 typedef enum {
69   SXMLRPC_ROLE_SERVER,
70   SXMLRPC_ROLE_CLIENT
71 } sxmlrpc_role_t;
72 
73 /* XML-RPC payload type */
74 typedef enum {
75   SXMLRPC_METHOD_NONE,
76   SXMLRPC_METHOD_CALL,
77   SXMLRPC_METHOD_RESPONSE,
78   SXMLRPC_METHOD_RESPONSE_FAULT
79 } sxmlrpc_method_t;
80 
81 /* XML-RPC value type */
82 typedef enum {
83   SXMLRPC_VALUE_INTEGER,
84   SXMLRPC_VALUE_DOUBLE,
85   SXMLRPC_VALUE_BOOLEAN,
86   SXMLRPC_VALUE_STRING,
87   SXMLRPC_VALUE_DATETIME,
88   SXMLRPC_VALUE_BASE64,
89   SXMLRPC_VALUE_STRUCT,
90   SXMLRPC_VALUE_ARRAY
91 } sxmlrpc_value_type_t;
92 
93 /* XML-RPC integer */
94 typedef int32_t	sxmlrpc_int_t;
95 /* XML-RPC double */
96 typedef double	sxmlrpc_double_t;
97 /* XML-RPC boolean */
98 #ifndef	_BOOL_T
99 #define	_BOOL_T
100 typedef enum {
101   false	= 0,
102   true	= 1
103 } sxmlrpc_boolean_t;
104 typedef	sxmlrpc_boolean_t	bool;
105 #endif	/* _BOOL_T */
106 /* XML-RPC string (or dateTime.iso8601, base64) */
107 typedef u_int8_t *	sxmlrpc_string_t;
108 /* XML-RPC struct */
109 typedef struct _sxmlrpc_struct_t {
110   size_t			size;
111   struct _sxmlrpc_member_t *	member;
112 } sxmlrpc_struct_t;
113 #define	sxmlrpc_set_struct(t,s,m) \
114 	do { \
115 		(t)->size   = s; \
116 		(t)->member = m; \
117 	} while (0)
118 /* XML-RPC array */
119 typedef struct _sxmlrpc_array_t {
120   size_t			size;
121   struct _sxmlrpc_value_t *	value;
122 } sxmlrpc_array_t;
123 #define	sxmlrpc_set_array(a,s,v) \
124 	do { \
125 		(a)->size  = s; \
126 		(a)->value = v; \
127 	} while (0)
128 
129 /* XML-RPC value */
130 typedef struct _sxmlrpc_value_t {
131   sxmlrpc_value_type_t	type;
132   union {
133     sxmlrpc_int_t	ival;
134     sxmlrpc_double_t	dval;
135     sxmlrpc_boolean_t	bval;
136     sxmlrpc_string_t	sval;	/* string | dateTime | base64 */
137     sxmlrpc_struct_t	tval;
138     sxmlrpc_array_t	aval;
139   } u;
140 } sxmlrpc_value_t;
141 #define sxmlrpc_get_value_type(v)	((v)->type)
142 #define sxmlrpc_get_value_int(v)	((v)->u.ival)
143 #define sxmlrpc_get_value_double(v)	((v)->u.dval)
144 #define sxmlrpc_get_value_boolean(v)	((v)->u.bval)
145 #define sxmlrpc_get_value_string(v)	((v)->u.sval)
146 #define sxmlrpc_get_value_datetime(v)	((v)->u.sval)
147 #define sxmlrpc_get_value_base64(v)	((v)->u.sval)
148 #define sxmlrpc_get_value_struct(v)	((v)->u.tval)
149 #define sxmlrpc_get_value_array(v)	((v)->u.aval)
150 #define sxmlrpc_get_struct_size(v)	((v)->u.tval.size)
151 #define sxmlrpc_get_struct_member(v)	((v)->u.tval.member)
152 #define sxmlrpc_get_array_size(v)	((v)->u.aval.size)
153 #define sxmlrpc_get_array_value(v)	((v)->u.aval.value)
154 
155 /* member of XML-RPC struct */
156 typedef struct _sxmlrpc_member_t {
157   sxmlrpc_string_t		name;
158   sxmlrpc_value_t		value;
159 } sxmlrpc_member_t;
160 
161 
162 /* XML-RPC param */
163 typedef struct _sxmlrpc_param_t {
164   sxmlrpc_value_t	value;
165 } sxmlrpc_param_t;
166 
167 /* XML-RPC params */
168 typedef struct _sxmlrpc_params_t {
169   size_t		size;
170   sxmlrpc_param_t *	param;
171 } sxmlrpc_params_t;
172 
173 /* XML-RPC */
174 typedef struct {
175   sxmlrpc_role_t	role;
176   sxmlrpc_method_t	method;
177   char *		hostname;
178   char *		servname;
179   char *		path;
180   char *		encoding;
181   /* XML-RPC Call/Response payload */
182   union {
183 #define	call_method	u.call.method_name
184 #define	call_params	u.call.params
185     struct {
186       char *		method_name;
187       sxmlrpc_params_t	params;
188     } call;
189 #define	response_value	u.response
190 #define	fault_code	u.response.u.tval.member[0].value.u.ival
191 #define	fault_string	u.response.u.tval.member[1].value.u.sval
192     sxmlrpc_value_t	response;
193   } u;
194   /* HTTP-Request/Response Header/Body */
195   struct {
196 #define	msghdr_text	mesg.head.text
197 #define	msghdr_size	mesg.head.size
198     struct {
199       char *		text;
200       int		size;
201     } head;
202 #define	msgbdy_fd	mesg.body.fd
203 #define	msgbdy_size	mesg.body.size
204     struct {
205       int		fd;
206       size_t		size;
207     } body;
208   } mesg;
209 } sxmlrpc_t;
210 #define	sxmlrpc_method_name(x)		((x)->call_method)
211 #define	sxmlrpc_call_params(x)		((x)->call_params)
212 #define	sxmlrpc_response_ok(x)		((x)->method=SXMLRPC_METHOD_RESPONSE)
213 #define	sxmlrpc_response_fault(x) \
214 	((x)->method=SXMLRPC_METHOD_RESPONSE_FAULT)
215 
216 /* the type for a callback function */
217 typedef int (*sxmlrpc_callback_t)(
218   const char * client,		/* client IP address */
219   const char * method,		/* method name */
220   sxmlrpc_params_t * params,	/* parameters for method */
221   sxmlrpc_param_t * param	/* parameter returned as result */
222 );
223 
224 /******************************************************************************
225  *
226  *	Global functions declaration
227  *
228  *****************************************************************************/
229 /*
230  * create new object for XML-RPC
231  */
232 sxmlrpc_t *	sxmlrpc_new(
233 		const char *	hostname,	/* server/client IP address */
234 		const char *	servname,	/* server/client port number */
235 		const char *	path);		/* server/client request-URI */
236 /*
237  * free object of XML-RPC
238  */
239 void	sxmlrpc_free(sxmlrpc_t * sxRPC);
240 /*
241  * clear old response value of XML-RPC object
242  */
243 void	sxmlrpc_flush(sxmlrpc_t * sxRPC);
244 /*
245  * clear dynamic allocated area of value
246  */
247 void	sxmlrpc_flush_value(sxmlrpc_value_t * v);
248 /*
249  * call method of XML-RPC server
250  */
251 int	sxmlrpc_call(
252 	sxmlrpc_t *		sxRPC,		/* an object of XML-RPC */
253 	const char *		methodName,	/* method name */
254 	sxmlrpc_param_t *	param,		/* parameter for method */
255 	size_t			param_num);	/* number of parameter */
256 /*
257  * reply to a request from XML-RPC client
258  */
259 int	sxmlrpc_server(
260 	sxmlrpc_t *	sxRPC,		/* an object of XML-RPC */
261 	const int	backlog,	/* backlog of listen(2) */
262 	sxmlrpc_callback_t callback);	/* callback function to process request */
263 
264 /*****************************************************************************/
265 
266 /*
267  * set value functions
268  */
269 int	sxmlrpc_set_value_int(sxmlrpc_value_t *, sxmlrpc_int_t);
270 int	sxmlrpc_set_value_double(sxmlrpc_value_t *, sxmlrpc_double_t);
271 int	sxmlrpc_set_value_boolean(sxmlrpc_value_t *, sxmlrpc_boolean_t);
272 int	sxmlrpc_set_value_string(sxmlrpc_value_t *, sxmlrpc_string_t);
273 int	sxmlrpc_set_value_datetime(sxmlrpc_value_t *, sxmlrpc_string_t);
274 int	sxmlrpc_set_value_base64(sxmlrpc_value_t *, sxmlrpc_string_t);
275 int	sxmlrpc_set_value_struct(sxmlrpc_value_t *, sxmlrpc_struct_t);
276 int	sxmlrpc_set_value_array(sxmlrpc_value_t *, sxmlrpc_array_t);
277 int	sxmlrpc_set_param(sxmlrpc_param_t * param, sxmlrpc_value_t value);
278 /*
279  * set fault response
280  */
281 int	sxmlrpc_set_fault(
282 	sxmlrpc_param_t *	param,		/* parameter for response */
283 	int			faultCode,	/* value of <faultCode> */
284 	sxmlrpc_string_t	faultString);	/* value of <faultString> */
285 
286 /*****************************************************************************/
287 
288 int			sxmlrpc_get_fault_code(sxmlrpc_t *);
289 sxmlrpc_string_t	sxmlrpc_get_fault_string(sxmlrpc_t *);
290 sxmlrpc_value_t *	sxmlrpc_get_response_value(sxmlrpc_t *);
291 
292 /*****************************************************************************/
293 
294 void	sxmlrpc_print_value(sxmlrpc_value_t * value, FILE * output);
295 
296 void	sxmlrpc_copy_value(sxmlrpc_value_t * dst_value,
297 			   sxmlrpc_value_t * src_value);
298 
299 /*****************************************************************************/
300 
301 const char *	sxmlrpc_get_datetime_iso8601(const time_t);
302 const char *	sxmlrpc_get_current_datetime_iso8601(void);
303 
304 int	sxmlrpc_base64_encode(	/* >0: successful, -1: error */
305 	const char *	text,	/* input text */
306 	char *		buf,	/* return buffer of base64 encoded text */
307 	size_t		len);	/* buffer size */
308 
309 int	sxmlrpc_base64_decode(	/* >0: successful, -1: error */
310 	const char *	text,	/* input text */
311 	char *		buf,	/* return buffer of base64 decoded text */
312 	size_t		len);	/* buffer size */
313 
314 /*****************************************************************************/
315 
316 int	sxmlrpc_get_call_params(sxmlrpc_t *, int input_fd);
317 int	sxmlrpc_set_response_param(sxmlrpc_t *, sxmlrpc_param_t * param,
318 				   int output_fd);
319 void	sxmlrpc_set_encoding(sxmlrpc_t *, const char * ctype);
320 
321 #endif	/* _SXMLRPC_H */
322