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