route get/set working, remotecontrol plugin updated
[oonf.git] / src / core / olsr_telnet.h
1 /*
2  * olsr_telnet.h
3  *
4  *  Created on: Sep 7, 2011
5  *      Author: rogge
6  */
7
8 #ifndef OLSR_TELNET_H_
9 #define OLSR_TELNET_H_
10
11 #include "common/common_types.h"
12 #include "common/avl.h"
13 #include "common/list.h"
14 #include "olsr_netaddr_acl.h"
15 #include "olsr_stream_socket.h"
16
17 enum olsr_telnet_result {
18   TELNET_RESULT_ACTIVE,
19   TELNET_RESULT_CONTINOUS,
20   TELNET_RESULT_INTERNAL_ERROR,
21   TELNET_RESULT_QUIT,
22
23   /*
24    * this one is used internally for the telnet API,
25    * it should not be returned by a command handler
26    */
27   _TELNET_RESULT_UNKNOWN_COMMAND,
28 };
29
30 struct olsr_telnet_cleanup {
31   struct list_entity node;
32   struct olsr_telnet_data *data;
33
34   void (*cleanup_handler)(struct olsr_telnet_cleanup *);
35   void *custom;
36 };
37
38 struct olsr_telnet_data {
39   /* address of remote communication partner */
40   struct netaddr *remote;
41
42   /* output buffer for telnet commands */
43   struct autobuf *out;
44
45   /* current telnet command and parameters */
46   const char *command;
47   const char *parameter;
48
49   /* remember if echo mode is active */
50   bool show_echo;
51
52   /* millisecond timeout between commands */
53   uint32_t timeout_value;
54
55   /* callback and data to stop a continous output txt command */
56   void (*stop_handler)(struct olsr_telnet_data *);
57   void *stop_data[4];
58
59   struct list_entity cleanup_list;
60 };
61
62 struct olsr_telnet_session {
63   struct olsr_stream_session session;
64   struct olsr_telnet_data data;
65 };
66
67 typedef enum olsr_telnet_result (*olsr_telnethandler)
68     (struct olsr_telnet_data *con);
69
70 #if !defined(REMOVE_HELPTEXT)
71 #define TELNET_CMD(cmd, cb, helptext, args...) { .command = (cmd), .handler = (cb), .help = helptext, ##args }
72 #else
73 #define TELNET_CMD(cmd, cb, helptext, args...) { .command = (cmd), .handler = (cb), .help = "", ##args }
74 #endif
75
76 struct olsr_telnet_command {
77   struct avl_node node;
78   const char *command;
79
80   const char *help;
81
82   struct olsr_netaddr_acl *acl;
83
84   olsr_telnethandler handler;
85   olsr_telnethandler help_handler;
86 };
87
88 #define FOR_ALL_TELNET_COMMANDS(cmd, ptr) avl_for_each_element_safe(&telnet_cmd_tree, cmd, node, ptr)
89 EXPORT struct avl_tree telnet_cmd_tree;
90
91 EXPORT int olsr_telnet_init(void) __attribute__((warn_unused_result));
92 EXPORT void olsr_telnet_cleanup(void);
93
94 EXPORT int olsr_telnet_add(struct olsr_telnet_command *command);
95 EXPORT void olsr_telnet_remove(struct olsr_telnet_command *command);
96
97 EXPORT void olsr_telnet_stop(struct olsr_telnet_data *data);
98
99 EXPORT enum olsr_telnet_result olsr_telnet_execute(
100     const char *cmd, const char *para,
101     struct autobuf *out, struct netaddr *remote);
102
103 /**
104  * Add a cleanup handler to a telnet session
105  * @param data pointer to telnet data
106  * @param cleanup pointer to initialized cleanup handler
107  */
108 static INLINE void
109 olsr_telnet_add_cleanup(struct olsr_telnet_data *data,
110     struct olsr_telnet_cleanup *cleanup) {
111   cleanup->data = data;
112   list_add_tail(&data->cleanup_list, &cleanup->node);
113 }
114
115 /**
116  * Removes a cleanup handler to a telnet session
117  * @param cleanup pointer to cleanup handler
118  */
119 static INLINE void
120 olsr_telnet_remove_cleanup(struct olsr_telnet_cleanup *cleanup) {
121   list_remove(&cleanup->node);
122 }
123
124 /**
125  * Flushs the output stream of a telnet session. This will be only
126  * necessary for continous output.
127  * @param data pointer to telnet data
128  */
129 static INLINE void
130 olsr_telnet_flush_session(struct olsr_telnet_data *data) {
131   struct olsr_telnet_session *session;
132
133   session = container_of(data, struct olsr_telnet_session, data);
134   olsr_stream_flush(&session->session);
135 }
136
137 #endif /* OLSR_TELNET_H_ */