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>