Annotation of embedaddon/strongswan/src/libcharon/plugins/vici/libvici.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2014 Martin Willi
! 3: * Copyright (C) 2014 revosec AG
! 4: *
! 5: * libvici.h is MIT-licensed to simplify reuse, but please note that libvici.c
! 6: * is not, as it depends on the GPLv2 licensed libstrongswan.
! 7: *
! 8: * Permission is hereby granted, free of charge, to any person obtaining a copy
! 9: * of this software and associated documentation files (the "Software"), to deal
! 10: * in the Software without restriction, including without limitation the rights
! 11: * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
! 12: * copies of the Software, and to permit persons to whom the Software is
! 13: * furnished to do so, subject to the following conditions:
! 14: *
! 15: * The above copyright notice and this permission notice shall be included in
! 16: * all copies or substantial portions of the Software.
! 17: *
! 18: * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
! 19: * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
! 20: * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
! 21: * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
! 22: * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
! 23: * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
! 24: * THE SOFTWARE.
! 25: */
! 26:
! 27: /**
! 28: * @defgroup libvici libvici
! 29: * @{ @ingroup vici
! 30: *
! 31: * libvici is a low-level client library for the "Versatile IKE Control
! 32: * Interface" protocol. While it uses libstrongswan and its thread-pool for
! 33: * asynchronous message delivery, this interface does not directly depend on
! 34: * libstrongswan interfaces and should be stable.
! 35: *
! 36: * This interface provides the following basic functions:
! 37: *
! 38: * - vici_init()/vici_deinit(): Library initialization functions
! 39: * - vici_connect(): Connect to a vici service
! 40: * - vici_disconnect(): Disconnect from a vici service
! 41: *
! 42: * Library initialization implicitly initializes libstrongswan and a small
! 43: * thread pool.
! 44: *
! 45: * Connecting requires an uri, which is currently either a UNIX socket path
! 46: * prefixed with unix://, or a hostname:port tuple prefixed with tcp://.
! 47: * Passing NULL takes the system default socket path.
! 48: *
! 49: * After the connection has been established, request messages can be sent.
! 50: * Only a single thread may operate on a single connection instance
! 51: * simultaneously. To construct request messages, use the following functions:
! 52: *
! 53: * - vici_add_key_value() / vici_add_key_valuef(): Add key/value pairs
! 54: * - vici_begin(): Start constructing a new request message
! 55: * - vici_begin_section(): Open a new section to add contents to
! 56: * - vici_end_section(): Close a previously opened session
! 57: * - vici_begin_list(): Open a new list to add list items to
! 58: * - vici_end_list(): Close a previously opened list
! 59: * - vici_add_list_item() / vici_add_list_itemf(): Add list item
! 60: *
! 61: * Once the request message is complete, it can be sent or cancelled with:
! 62: *
! 63: * - vici_submit()
! 64: * - vici_free_req()
! 65: *
! 66: * If submitting a message is successful, a response message is returned. It
! 67: * can be processed using the following functions:
! 68: *
! 69: * - vici_parse(): Parse content type
! 70: * - vici_parse_name(): Parse name if content type provides one
! 71: * - vici_parse_name_eq(): Parse name and check if matches string
! 72: * - vici_parse_value() / vici_parse_value_str(): Parse value for content type
! 73: * - vici_dump(): Dump a full response to a FILE stream
! 74: * - vici_free_res(): Free response after use
! 75: *
! 76: * Usually vici_parse() is called in a loop, and depending on the returned
! 77: * type the name and value can be inspected.
! 78: *
! 79: * To register or unregister for asynchronous event messages vici_register() is
! 80: * used. The registered callback gets invoked by an asynchronous thread. To
! 81: * parse the event message, the vici_parse*() functions can be used.
! 82: */
! 83:
! 84: #ifndef LIBVICI_H_
! 85: #define LIBVICI_H_
! 86:
! 87: #include <stdio.h>
! 88:
! 89: #ifdef __cplusplus
! 90: extern "C" {
! 91: #endif
! 92:
! 93: /**
! 94: * Opaque vici connection contex.
! 95: */
! 96: typedef struct vici_conn_t vici_conn_t;
! 97:
! 98: /**
! 99: * Opaque vici request message.
! 100: */
! 101: typedef struct vici_req_t vici_req_t;
! 102:
! 103: /**
! 104: * Opaque vici response/event message.
! 105: */
! 106: typedef struct vici_res_t vici_res_t;
! 107:
! 108: /**
! 109: * Vici parse result, as returned by vici_parse().
! 110: */
! 111: typedef enum {
! 112: /** encountered a section start, has a name */
! 113: VICI_PARSE_BEGIN_SECTION,
! 114: /** encountered a section end */
! 115: VICI_PARSE_END_SECTION,
! 116: /** encountered a list start, has a name */
! 117: VICI_PARSE_BEGIN_LIST,
! 118: /** encountered a list element, has a value */
! 119: VICI_PARSE_LIST_ITEM,
! 120: /** encountered a list end */
! 121: VICI_PARSE_END_LIST,
! 122: /** encountered a key/value pair, has a name and a value */
! 123: VICI_PARSE_KEY_VALUE,
! 124: /** encountered valid end of message */
! 125: VICI_PARSE_END,
! 126: /** parse error */
! 127: VICI_PARSE_ERROR,
! 128: } vici_parse_t;
! 129:
! 130: /**
! 131: * Callback function invoked for received event messages.
! 132: *
! 133: * It is not allowed to call vici_submit() from this callback.
! 134: *
! 135: * @param user user data, as passed to vici_connect
! 136: * @param name name of received event
! 137: * @param msg associated event message, destroyed by libvici
! 138: */
! 139: typedef void (*vici_event_cb_t)(void *user, char *name, vici_res_t *msg);
! 140:
! 141: /**
! 142: * Callback function for key/value and list items, invoked by vici_parse_cb().
! 143: *
! 144: * @param user user data, as passed to vici_parse_cb()
! 145: * @param res message currently parsing
! 146: * @param name name of key or list
! 147: * @param value value buffer
! 148: * @param len length of value buffer
! 149: * @return 0 if parsed successfully
! 150: */
! 151: typedef int (*vici_parse_value_cb_t)(void *user, vici_res_t *res, char *name,
! 152: void *value, int len);
! 153:
! 154: /**
! 155: * Callback function for sections, invoked by vici_parse_cb().
! 156: *
! 157: * @param user user data, as passed to vici_parse_cb()
! 158: * @param res message currently parsing
! 159: * @param name name of the section
! 160: * @return 0 if parsed successfully
! 161: */
! 162: typedef int (*vici_parse_section_cb_t)(void *user, vici_res_t *res, char *name);
! 163:
! 164: /**
! 165: * Open a new vici connection.
! 166: *
! 167: * On error, NULL is returned and errno is set appropriately.
! 168: *
! 169: * @param uri URI to connect to, NULL to use system default
! 170: * @return opaque vici connection context, NULL on error
! 171: */
! 172: vici_conn_t* vici_connect(char *uri);
! 173:
! 174: /**
! 175: * Close a vici connection.
! 176: *
! 177: * @param conn connection context
! 178: */
! 179: void vici_disconnect(vici_conn_t *conn);
! 180:
! 181: /**
! 182: * Begin a new vici message request.
! 183: *
! 184: * This function always succeeds.
! 185: *
! 186: * @param name name of request command
! 187: * @return request message, to add contents
! 188: */
! 189: vici_req_t* vici_begin(char *name);
! 190:
! 191: /**
! 192: * Begin a new section in a vici request message.
! 193: *
! 194: * @param req request message to create a new section in
! 195: * @param name name of section to create
! 196: */
! 197: void vici_begin_section(vici_req_t *req, char *name);
! 198:
! 199: /**
! 200: * End a previously opened section.
! 201: *
! 202: * @param req request message to close an open section in
! 203: */
! 204: void vici_end_section(vici_req_t *req);
! 205:
! 206: /**
! 207: * Add a key/value pair, using an as-is blob as value.
! 208: *
! 209: * @param req request message to add key/value pair to
! 210: * @param key key name of key/value pair
! 211: * @param buf pointer to blob to add as value
! 212: * @param len length of value blob to add
! 213: */
! 214: void vici_add_key_value(vici_req_t *req, char *key, void *buf, int len);
! 215:
! 216: /**
! 217: * Add a key/value pair, setting value from a printf() format string.
! 218: *
! 219: * @param req request message to add key/value pair to
! 220: * @param key key name of key/value pair
! 221: * @param fmt format string for value
! 222: * @param ... arguments to format string
! 223: */
! 224: void vici_add_key_valuef(vici_req_t *req, char *key, char *fmt, ...);
! 225:
! 226: /**
! 227: * Begin a list in a request message.
! 228: *
! 229: * After starting a list, only list items can be added until the list gets
! 230: * closed by vici_end_list().
! 231: *
! 232: * @param req request message to begin list in
! 233: * @param name name of list to begin
! 234: */
! 235: void vici_begin_list(vici_req_t *req, char *name);
! 236:
! 237: /**
! 238: * Add a list item to a currently open list, using an as-is blob.
! 239: *
! 240: * @param req request message to add list item to
! 241: * @param buf pointer to blob to add as value
! 242: * @param len length of value blob to add
! 243: */
! 244: void vici_add_list_item(vici_req_t *req, void *buf, int len);
! 245:
! 246: /**
! 247: * Add a list item to a currently open list, using a printf() format string.
! 248: *
! 249: * @param req request message to add list item to
! 250: * @param fmt format string to create value from
! 251: * @param ... arguments to format string
! 252: */
! 253: void vici_add_list_itemf(vici_req_t *req, char *fmt, ...);
! 254:
! 255: /**
! 256: * End a previously opened list in a request message.
! 257: *
! 258: * @param req request message to end list in
! 259: */
! 260: void vici_end_list(vici_req_t *req);
! 261:
! 262: /**
! 263: * Submit a request message, and wait for response.
! 264: *
! 265: * The request messages gets cleaned up by this call and gets invalid.
! 266: * On error, NULL is returned an errno is set to:
! 267: * - EINVAL if the request is invalid/incomplete
! 268: * - ENOENT if the command is unknown
! 269: * - EBADMSG if the response is invalid
! 270: * - Any other IO related errno
! 271: *
! 272: * @param req request message to send
! 273: * @param conn connection context to send message over
! 274: * @return response message, NULL on error
! 275: */
! 276: vici_res_t* vici_submit(vici_req_t *req, vici_conn_t *conn);
! 277:
! 278: /**
! 279: * Cancel a request message started.
! 280: *
! 281: * If a request created by vici_begin() does not get submitted using
! 282: * vici_submit(), it has to get freed using this call.
! 283: *
! 284: * @param req request message to clean up
! 285: */
! 286: void vici_free_req(vici_req_t *req);
! 287:
! 288: /**
! 289: * Dump a message text representation to a FILE stream.
! 290: *
! 291: * On error, errno is set to:
! 292: * - EBADMSG if the message is invalid
! 293: *
! 294: * @param res response message to dump
! 295: * @param label a label to print for this message
! 296: * @param pretty use pretty print with indentation
! 297: * @param out FILE to dump to
! 298: * @return 0 if dumped complete message, 1 on error
! 299: */
! 300: int vici_dump(vici_res_t *res, char *label, int pretty, FILE *out);
! 301:
! 302: /**
! 303: * Parse next element from a vici response message.
! 304: *
! 305: * @param res response message to parse
! 306: * @return parse result
! 307: */
! 308: vici_parse_t vici_parse(vici_res_t *res);
! 309:
! 310: /**
! 311: * Parse name tag / key of a previously parsed element.
! 312: *
! 313: * This call is valid only after vici_parse() returned VICI_PARSE_KEY_VALUE,
! 314: * VICI_PARSE_BEGIN_SECTION or VICI_PARSE_BEGIN_LIST.
! 315: *
! 316: * The string is valid until vici_free_res() is called.
! 317: *
! 318: * On error, errno is set to:
! 319: *- EINVAL if not in valid parser state
! 320: *
! 321: * @param res response message to parse
! 322: * @return name tag / key, NULL on error
! 323: */
! 324: char* vici_parse_name(vici_res_t *res);
! 325:
! 326: /**
! 327: * Compare name tag / key of a previously parsed element.
! 328: *
! 329: * This call is valid only after vici_parse() returned VICI_PARSE_KEY_VALUE,
! 330: * VICI_PARSE_BEGIN_SECTION or VICI_PARSE_BEGIN_LIST.
! 331: *
! 332: * @param res response message to parse
! 333: * @param name string to compare
! 334: * @return 1 if name equals, 0 if not
! 335: */
! 336: int vici_parse_name_eq(vici_res_t *res, char *name);
! 337:
! 338: /**
! 339: * Parse value of a previously parsed element, as a blob.
! 340: *
! 341: * This call is valid only after vici_parse() returned VICI_PARSE_KEY_VALUE or
! 342: * VICI_PARSE_LIST_ITEM.
! 343: *
! 344: * The string is valid until vici_free_res() is called.
! 345: *
! 346: * On error, errno is set to:
! 347: * - EINVAL if not in valid parser state
! 348: *
! 349: * @param res response message to parse
! 350: * @param len pointer receiving value length
! 351: * @return pointer to value, NULL on error
! 352: */
! 353: void* vici_parse_value(vici_res_t *res, int *len);
! 354:
! 355: /**
! 356: * Parse value of a previously parsed element, as a string.
! 357: *
! 358: * This call is valid only after vici_parse() returned VICI_PARSE_KEY_VALUE or
! 359: * VICI_PARSE_LIST_ITEM.
! 360: *
! 361: * This call is successful only if the value contains no non-printable
! 362: * characters. The string is valid until vici_free_res() is called.
! 363: *
! 364: * On error, errno is set to:
! 365: * - EBADMSG if value is not a printable string
! 366: * - EINVAL if not in valid parser state
! 367: *
! 368: * @param res response message to parse
! 369: * @return value as string, NULL on error
! 370: */
! 371: char* vici_parse_value_str(vici_res_t *res);
! 372:
! 373: /**
! 374: * Parse a complete message with callbacks.
! 375: *
! 376: * Any of the callbacks may be NULL to skip this kind of item. Callbacks are
! 377: * invoked for the current section level only. To descent into sections, call
! 378: * vici_parse_cb() from within a section callback.
! 379: *
! 380: * On error, errno is set to:
! 381: * - EBADMSG if message encoding invalid
! 382: * - Any other errno set by the invoked callbacks
! 383: *
! 384: * @param res message to parse
! 385: * @param section callback invoked for each section
! 386: * @param kv callback invoked for key/value pairs
! 387: * @param li callback invoked for list items
! 388: * @param user user data to pass to callbacks
! 389: * @return 0 if parsing successful
! 390: */
! 391: int vici_parse_cb(vici_res_t *res, vici_parse_section_cb_t section,
! 392: vici_parse_value_cb_t kv, vici_parse_value_cb_t li,
! 393: void *user);
! 394:
! 395: /*
! 396: * Find a blob value in a message for a given key.
! 397: *
! 398: * Sections can be selected by prefixing them separated by dots.
! 399: *
! 400: * @param res response message to parse
! 401: * @param len length of returned object
! 402: * @param fmt printf format string of key and sections
! 403: * @param ... arguments to format string
! 404: * @return blob value, having *len bytes, NULL if not found
! 405: */
! 406: void *vici_find(vici_res_t *res, int *len, char *fmt, ...);
! 407:
! 408: /**
! 409: * Find a string value in a message for a given key.
! 410: *
! 411: * Sections can be selected by prefixing them separated by dots.
! 412: *
! 413: * @param res response message to parse
! 414: * @param def default value, if key not found
! 415: * @param fmt printf format string of key and sections
! 416: * @param ... arguments to format string
! 417: * @return string, def if not found
! 418: */
! 419: char* vici_find_str(vici_res_t *res, char *def, char *fmt, ...);
! 420:
! 421: /**
! 422: * Find an integer value in a message for a given key.
! 423: *
! 424: * Sections can be selected by prefixing them separated by dots.
! 425: *
! 426: * @param res response message to parse
! 427: * @param def default value, if key not found
! 428: * @param fmt printf format string of key and sections
! 429: * @param ... arguments to format string
! 430: * @return integer value, def if not found
! 431: */
! 432: int vici_find_int(vici_res_t *res, int def, char *fmt, ...);
! 433:
! 434: /**
! 435: * Clean up a received response message.
! 436: *
! 437: * Event messages get cleaned up by the library, it is not allowed to call
! 438: * vici_free_res() from within a vici_event_cb_t.
! 439: *
! 440: * @param res response message to free
! 441: */
! 442: void vici_free_res(vici_res_t *res);
! 443:
! 444: /**
! 445: * (Un-)Register for events of a given kind.
! 446: *
! 447: * Events callbacks get invoked by a different thread from the libstrongswan
! 448: * thread pool.
! 449: * On failure, errno is set to:
! 450: * - ENOENT if the event name is unknown
! 451: * - EBADMSG if the response is invalid
! 452: * - Any other IO related errno
! 453: *
! 454: * @param conn connection context
! 455: * @param name name of event messages to register to
! 456: * @param cb callback function to register, NULL to unregister
! 457: * @param user user data passed to callback invocations
! 458: * @return 0 if registered successfully
! 459: */
! 460: int vici_register(vici_conn_t *conn, char *name, vici_event_cb_t cb, void *user);
! 461:
! 462: /**
! 463: * Initialize libvici before first time use.
! 464: */
! 465: void vici_init();
! 466:
! 467: /**
! 468: * Deinitialize libvici after use.
! 469: */
! 470: void vici_deinit();
! 471:
! 472: #ifdef __cplusplus
! 473: }
! 474: #endif
! 475:
! 476: #endif /** LIBVICI_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>