Annotation of embedaddon/strongswan/src/libcharon/plugins/vici/libvici.h, revision 1.1.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>