Annotation of embedaddon/strongswan/src/libcharon/plugins/vici/vici_message.h, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2015 Tobias Brunner
                      3:  * HSR Hochschule fuer Technik Rapperswil
                      4:  *
                      5:  * Copyright (C) 2014 Martin Willi
                      6:  * Copyright (C) 2014 revosec AG
                      7:  *
                      8:  * This program is free software; you can redistribute it and/or modify it
                      9:  * under the terms of the GNU General Public License as published by the
                     10:  * Free Software Foundation; either version 2 of the License, or (at your
                     11:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     12:  *
                     13:  * This program is distributed in the hope that it will be useful, but
                     14:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     15:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     16:  * for more details.
                     17:  */
                     18: 
                     19: /**
                     20:  * @defgroup vici_message vici_message
                     21:  * @{ @ingroup vici
                     22:  */
                     23: 
                     24: #ifndef VICI_MESSAGE_H_
                     25: #define VICI_MESSAGE_H_
                     26: 
                     27: #include <library.h>
                     28: 
                     29: typedef struct vici_message_t vici_message_t;
                     30: typedef struct vici_parse_context_t vici_parse_context_t;
                     31: typedef enum vici_type_t vici_type_t;
                     32: 
                     33: /**
                     34:  * Vici message encoding types
                     35:  */
                     36: enum vici_type_t {
                     37:        /** never used in an argument list, needed by dump as initial value */
                     38:        VICI_START =         0,
                     39: 
                     40:        /** begin of new section, argument is section name as char* */
                     41:        VICI_SECTION_START = 1,
                     42:        /** end of current section, no arguments */
                     43:        VICI_SECTION_END =   2,
                     44:        /** key/value, arguments are key as char*, value as chunk_t */
                     45:        VICI_KEY_VALUE =     3,
                     46:        /** list start, argument is list name as char* */
                     47:        VICI_LIST_START =    4,
                     48:        /** list item, argument is item value as chunk_t */
                     49:        VICI_LIST_ITEM =     5,
                     50:        /** end of list, no arguments */
                     51:        VICI_LIST_END =      6,
                     52: 
                     53:        /** end of argument list, no arguments (never encoded) */
                     54:        VICI_END =           7
                     55: };
                     56: 
                     57: /**
                     58:  * Callback function for key/value and list items, invoked by parse().
                     59:  *
                     60:  * @param user         user data, as passed to parse()
                     61:  * @param message      message currently parsing
                     62:  * @param name         name of key or list
                     63:  * @param value                parsed value
                     64:  * @return                     TRUE if parsed successfully
                     65:  */
                     66: typedef bool (*vici_value_cb_t)(void *user, vici_message_t *message,
                     67:                                                                char *name, chunk_t value);
                     68: 
                     69: /**
                     70:  * Callback function for sections, invoked by parse().
                     71:  *
                     72:  * @param user         user data, as passed to parse()
                     73:  * @param message      message currently parsing
                     74:  * @param ctx          parse context, to pass to recursive parse() invocations.
                     75:  * @param name         name of the section
                     76:  * @return                     TRUE if parsed successfully
                     77:  */
                     78: typedef bool (*vici_section_cb_t)(void *user, vici_message_t *message,
                     79:                                                                  vici_parse_context_t *ctx, char *name);
                     80: 
                     81: /**
                     82:  * Names for vici encoding types
                     83:  */
                     84: extern enum_name_t *vici_type_names;
                     85: 
                     86: /**
                     87:  * Vici message representation, encoding/decoding routines.
                     88:  */
                     89: struct vici_message_t {
                     90: 
                     91:        /**
                     92:         * Create an enumerator over message contents.
                     93:         *
                     94:         * The enumerator takes a fixed list of arguments, but depending on the
                     95:         * type may set not all of them. It returns VICI_END as last argument
                     96:         * to indicate the message end, and returns FALSE if parsing the message
                     97:         * failed.
                     98:         *
                     99:         * @return              enumerator over (vici_type_t, char*, chunk_t)
                    100:         */
                    101:        enumerator_t* (*create_enumerator)(vici_message_t *this);
                    102: 
                    103:        /**
                    104:         * Get the value of a key/value pair as a string.
                    105:         *
                    106:         * @param def   default value if not found
                    107:         * @param fmt   printf style format string for key, with sections
                    108:         * @param ...   arguments to fmt string
                    109:         * @return              string
                    110:         */
                    111:        char* (*get_str)(vici_message_t *this, char *def, char *fmt, ...);
                    112: 
                    113:        /**
                    114:         * Get the value of a key/value pair as a string, va_list variant.
                    115:         *
                    116:         * @param def   default value if not found
                    117:         * @param fmt   printf style format string for key, with sections
                    118:         * @param args  arguments to fmt string
                    119:         * @return              string
                    120:         */
                    121:        char* (*vget_str)(vici_message_t *this, char *def, char *fmt, va_list args);
                    122: 
                    123:        /**
                    124:         * Get the value of a key/value pair as integer.
                    125:         *
                    126:         * @param def   default value if not found
                    127:         * @param fmt   printf style format string for key, with sections
                    128:         * @param ...   arguments to fmt string
                    129:         * @return              value
                    130:         */
                    131:        int (*get_int)(vici_message_t *this, int def, char *fmt, ...);
                    132: 
                    133:        /**
                    134:         * Get the value of a key/value pair as integer, va_list variant
                    135:         *
                    136:         * @param def   default value if not found
                    137:         * @param fmt   printf style format string for key, with sections
                    138:         * @param args  arguments to fmt string
                    139:         * @return              value
                    140:         */
                    141:        int (*vget_int)(vici_message_t *this, int def, char *fmt, va_list args);
                    142: 
                    143:        /**
                    144:         * Get the value of a key/value pair as boolean.
                    145:         *
                    146:         * @param def   default value if not found
                    147:         * @param fmt   printf style format string for key, with sections
                    148:         * @param ...   arguments to fmt string
                    149:         * @return              value
                    150:         */
                    151:        bool (*get_bool)(vici_message_t *this, bool def, char *fmt, ...);
                    152: 
                    153:        /**
                    154:         * Get the value of a key/value pair as boolean, va_list variant
                    155:         *
                    156:         * @param def   default value if not found
                    157:         * @param fmt   printf style format string for key, with sections
                    158:         * @param args  arguments to fmt string
                    159:         * @return              value
                    160:         */
                    161:        bool (*vget_bool)(vici_message_t *this, bool def, char *fmt, va_list args);
                    162: 
                    163:        /**
                    164:         * Get the raw value of a key/value pair.
                    165:         *
                    166:         * @param def   default value if not found
                    167:         * @param fmt   printf style format string for key, with sections
                    168:         * @param ...   arguments to fmt string
                    169:         * @return              value
                    170:         */
                    171:        chunk_t (*get_value)(vici_message_t *this, chunk_t def, char *fmt, ...);
                    172: 
                    173:        /**
                    174:         * Get the raw value of a key/value pair, va_list variant.
                    175:         *
                    176:         * @param def   default value if not found
                    177:         * @param fmt   printf style format string for key, with sections
                    178:         * @param args  arguments to fmt string
                    179:         * @return              value
                    180:         */
                    181:        chunk_t (*vget_value)(vici_message_t *this, chunk_t def,
                    182:                                                 char *fmt, va_list args);
                    183: 
                    184:        /**
                    185:         * Get encoded message.
                    186:         *
                    187:         * @return              message data, points to internal data
                    188:         */
                    189:        chunk_t (*get_encoding)(vici_message_t *this);
                    190: 
                    191:        /**
                    192:         * Parse a message using callback functions.
                    193:         *
                    194:         * Any of the callbacks may be NULL to skip this kind of item. Callbacks are
                    195:         * invoked for the current section level only. To descent into sections,
                    196:         * call parse() from within a section callback using the provided parse
                    197:         * context.
                    198:         *
                    199:         * @param ctx           parse context, NULL for root level
                    200:         * @param section       callback invoked for each section
                    201:         * @param kv            callback invoked for key/value pairs
                    202:         * @param li            callback invoked for list items
                    203:         * @param user          user data to pass to callbacks
                    204:         * @return                      TRUE if parsed successfully
                    205:         */
                    206:        bool (*parse)(vici_message_t *this, vici_parse_context_t *ctx,
                    207:                                  vici_section_cb_t section, vici_value_cb_t kv,
                    208:                                  vici_value_cb_t li, void *user);
                    209: 
                    210:        /**
                    211:         * Dump a message text representation to a FILE stream.
                    212:         *
                    213:         * @param label         label to print for message
                    214:         * @param pretty        use pretty print with indentation
                    215:         * @param out           FILE stream to dump to
                    216:         * @return                      TRUE if message valid
                    217:         */
                    218:        bool (*dump)(vici_message_t *this, char *label, bool pretty, FILE *out);
                    219: 
                    220:        /**
                    221:         * Destroy a vici_message_t.
                    222:         */
                    223:        void (*destroy)(vici_message_t *this);
                    224: };
                    225: 
                    226: /**
                    227:  * Create a vici_message from encoded data.
                    228:  *
                    229:  * @param data                 message encoding
                    230:  * @param cleanup              TRUE to free data during
                    231:  * @return                             message representation
                    232:  */
                    233: vici_message_t *vici_message_create_from_data(chunk_t data, bool cleanup);
                    234: 
                    235: /**
                    236:  * Create a vici_message from an enumerator.
                    237:  *
                    238:  * The enumerator uses the same signature as the enumerator returned
                    239:  * by create_enumerator(), and gets destroyed by this function. It should
                    240:  * return VICI_END to close the message, return FALSE to indicate a failure.
                    241:  *
                    242:  * @param enumerator   enumerator over (vici_type_t, char*, chunk_t)
                    243:  * @return                             message representation, NULL on error
                    244:  */
                    245: vici_message_t *vici_message_create_from_enumerator(enumerator_t *enumerator);
                    246: 
                    247: /**
                    248:  * Create vici message from a variable argument list.
                    249:  *
                    250:  * @param type                 first type beginning message
                    251:  * @param ...                  vici_type_t and args, terminated by VICI_END
                    252:  * @return                             message representation, NULL on error
                    253:  */
                    254: vici_message_t *vici_message_create_from_args(vici_type_t type, ...);
                    255: 
                    256: /**
                    257:  * Check if a chunk has a printable string, and print it to buf.
                    258:  *
                    259:  * @param chunk                        chunk containing potential string
                    260:  * @param buf                  buffer to write string to
                    261:  * @param size                 size of buf
                    262:  * @return                             TRUE if printable and string written to buf
                    263:  */
                    264: bool vici_stringify(chunk_t chunk, char *buf, size_t size);
                    265: 
                    266: /**
                    267:  * Verify the occurrence of a given type for given section/list nesting
                    268:  */
                    269: bool vici_verify_type(vici_type_t type, u_int section, bool list);
                    270: 
                    271: #endif /** VICI_MESSAGE_H_ @}*/

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>