be84ef846646a8ea5db299ae2d2831efa8958810
[oonf.git] / src-api / tools / olsr_telnet.h
1
2 /*
3  * The olsr.org Optimized Link-State Routing daemon(olsrd)
4  * Copyright (c) 2004-2013, the olsr.org team - see HISTORY file
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name of olsr.org, olsrd nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *
34  * Visit http://www.olsr.org for more information.
35  *
36  * If you find this software useful feel free to make a donation
37  * to the project. For more information see the website or contact
38  * the copyright holders.
39  *
40  */
41
42 #ifndef OLSR_TELNET_H_
43 #define OLSR_TELNET_H_
44
45 #include "common/common_types.h"
46 #include "common/avl.h"
47 #include "common/list.h"
48 #include "common/netaddr_acl.h"
49 #include "core/olsr_stream_socket.h"
50
51 enum olsr_telnet_result {
52   TELNET_RESULT_ACTIVE,
53   TELNET_RESULT_CONTINOUS,
54   TELNET_RESULT_INTERNAL_ERROR,
55   TELNET_RESULT_QUIT,
56
57   /*
58    * this one is used internally for the telnet API,
59    * it should not be returned by a command handler
60    */
61   _TELNET_RESULT_UNKNOWN_COMMAND,
62 };
63
64 /*
65  * represents a cleanup handler that must be called when the
66  * telnet core is shut down.
67  */
68 struct olsr_telnet_cleanup {
69   /* pointer to telnet data */
70   struct olsr_telnet_data *data;
71
72   /* callback for cleanup */
73   void (*cleanup_handler)(struct olsr_telnet_cleanup *);
74
75   /* custom data pointer for cleanup handler */
76   void *custom;
77
78   /* node for list of cleanup handlers */
79   struct list_entity node;
80 };
81
82 /*
83  * represents the data part of a telnet connection to a client
84  */
85 struct olsr_telnet_data {
86   /* address of remote communication partner */
87   struct netaddr *remote;
88
89   /* output buffer for telnet commands */
90   struct autobuf *out;
91
92   /* current telnet command and parameters */
93   const char *command;
94   const char *parameter;
95
96   /* remember if echo mode is active */
97   bool show_echo;
98
99   /* millisecond timeout between commands */
100   uint32_t timeout_value;
101
102   /* callback and data to stop a continous output txt command */
103   void (*stop_handler)(struct olsr_telnet_data *);
104   void *stop_data[4];
105
106   struct list_entity cleanup_list;
107 };
108
109 /*
110  * represents a full telnet session including socket
111  */
112 struct olsr_telnet_session {
113   struct olsr_stream_session session;
114   struct olsr_telnet_data data;
115 };
116
117 typedef enum olsr_telnet_result (*olsr_telnethandler)
118     (struct olsr_telnet_data *con);
119
120 #if !defined(REMOVE_HELPTEXT)
121 #define TELNET_CMD(cmd, cb, helptext, args...) { .command = (cmd), .handler = (cb), .help = helptext, ##args }
122 #else
123 #define TELNET_CMD(cmd, cb, helptext, args...) { .command = (cmd), .handler = (cb), .help = "", ##args }
124 #endif
125
126 /* represents a telnet command */
127 struct olsr_telnet_command {
128   /* name of telnet command */
129   const char *command;
130
131   /* help text for telnet command, NULL if it uses a custom help handler */
132   const char *help;
133
134   /* access control list for telnet command, NULL if not used */
135   struct netaddr_acl *acl;
136
137   /* handler for telnet command */
138   olsr_telnethandler handler;
139
140   /* handler for help text */
141   olsr_telnethandler help_handler;
142
143   /* node for tree of telnet commands */
144   struct avl_node _node;
145 };
146
147 EXPORT extern struct oonf_subsystem oonf_telnet_subsystem;
148
149 EXPORT struct avl_tree telnet_cmd_tree;
150
151 EXPORT int olsr_telnet_add(struct olsr_telnet_command *command);
152 EXPORT void olsr_telnet_remove(struct olsr_telnet_command *command);
153
154 EXPORT void olsr_telnet_stop(struct olsr_telnet_data *data);
155
156 EXPORT enum olsr_telnet_result olsr_telnet_execute(
157     const char *cmd, const char *para,
158     struct autobuf *out, struct netaddr *remote);
159
160 /**
161  * Add a cleanup handler to a telnet session
162  * @param data pointer to telnet data
163  * @param cleanup pointer to initialized cleanup handler
164  */
165 static INLINE void
166 olsr_telnet_add_cleanup(struct olsr_telnet_data *data,
167     struct olsr_telnet_cleanup *cleanup) {
168   cleanup->data = data;
169   list_add_tail(&data->cleanup_list, &cleanup->node);
170 }
171
172 /**
173  * Removes a cleanup handler to a telnet session
174  * @param cleanup pointer to cleanup handler
175  */
176 static INLINE void
177 olsr_telnet_remove_cleanup(struct olsr_telnet_cleanup *cleanup) {
178   list_remove(&cleanup->node);
179 }
180
181 /**
182  * Flushs the output stream of a telnet session. This will be only
183  * necessary for continous output.
184  * @param data pointer to telnet data
185  */
186 static INLINE void
187 olsr_telnet_flush_session(struct olsr_telnet_data *data) {
188   struct olsr_telnet_session *session;
189
190   session = container_of(data, struct olsr_telnet_session, data);
191   olsr_stream_flush(&session->session);
192 }
193
194 #endif /* OLSR_TELNET_H_ */