Add a generic interface for parsing the text protocol.
[collectd.git] / src / utils_cmds.h
1 /**
2  * collectd - src/utils_cmds.h
3  * Copyright (C) 2016 Sebastian 'tokkee' Harl
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21  * DEALINGS IN THE SOFTWARE.
22  *
23  * Authors:
24  *   Sebastian 'tokkee' Harl <sh at tokkee.org>
25  **/
26
27 #ifndef UTILS_CMDS_H
28 #define UTILS_CMDS_H 1
29
30 #include "plugin.h"
31
32 #include <stdarg.h>
33
34 typedef enum {
35         CMD_UNKNOWN = 0,
36         CMD_PUTVAL  = 1,
37 } cmd_type_t;
38 #define CMD_TO_STRING(type) \
39         ((type) == CMD_PUTVAL) ? "PUTVAL" \
40                 : "UNKNOWN"
41
42 typedef struct {
43         /* The raw identifier as provided by the user. */
44         char *identifier;
45
46         /* An array of the fully parsed identifier and all value lists, and their
47          * options as provided by the user. */
48         value_list_t *vl;
49         size_t vl_num;
50 } cmd_putval_t;
51
52 /*
53  * NAME
54  *   cmd_t
55  *
56  * DESCRIPTION
57  *   The representation of a fully parsed command.
58  */
59 typedef struct {
60         cmd_type_t type;
61         union {
62                 cmd_putval_t putval;
63         } cmd;
64 } cmd_t;
65
66 /*
67  * NAME
68  *   cmd_status_t
69  *
70  * DESCRIPTION
71  *   Status codes describing the parse result.
72  */
73 typedef enum {
74         CMD_OK              =  0,
75         CMD_ERROR           = -1,
76         CMD_PARSE_ERROR     = -2,
77         CMD_UNKNOWN_COMMAND = -3,
78 } cmd_status_t;
79
80 /*
81  * NAME
82  *   cmd_error_handler_t
83  *
84  * DESCRIPTION
85  *   An error handler describes a callback to be invoked when the parser
86  *   encounters an error. The user data pointer will be passed to the callback
87  *   as the first argument.
88  */
89 typedef struct {
90         void (*cb) (void *, cmd_status_t, const char *, va_list);
91         void *ud;
92 } cmd_error_handler_t;
93
94 /*
95  * NAME:
96  *   cmd_error
97  *
98  * DESCRIPTION
99  *   Reports an error via the specified error handler (if set).
100  */
101 void cmd_error (cmd_status_t status, cmd_error_handler_t *err,
102                 const char *format, ...);
103
104 /*
105  * NAME
106  *   cmd_parse
107  *
108  * DESCRIPTION
109  *   Parse a command string and populate a command object.
110  *
111  * PARAMETERS
112  *   `buffer'  The command string to be parsed.
113  *   `ret_cmd' The parse result will be stored at this location.
114  *   `err'     An optional error handler to invoke on error.
115  *
116  * RETURN VALUE
117  *   CMD_OK on success or the respective error code otherwise.
118  */
119 cmd_status_t cmd_parse (char *buffer,
120                 cmd_t *ret_cmd, cmd_error_handler_t *err);
121
122 void cmd_destroy (cmd_t *cmd);
123
124 /*
125  * NAME
126  *   cmd_error_fh
127  *
128  * DESCRIPTION
129  *   An error callback writing the message to an open file handle using the
130  *   format expected by the unixsock or exec plugins.
131  *
132  * PARAMETERS
133  *   `ud'     Error handler user-data pointer. This must be an open
134  *            file-handle (FILE *).
135  *   `status' The error status code.
136  *   `format' Printf-style format string.
137  *   `ap'     Variable argument list providing the arguments for the format
138  *            string.
139  */
140 void cmd_error_fh (void *ud, cmd_status_t status,
141                 const char *format, va_list ap);
142
143 #endif /* UTILS_CMDS_H */