9f692f2849b50360bdaef957a05aedd127c21eea
[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   TELNET_RESULT_UNKNOWN_COMMAND,
23 };
24
25 struct olsr_telnet_cleanup {
26   struct list_entity node;
27   struct olsr_telnet_data *data;
28
29   void (*cleanup_handler)(struct olsr_telnet_cleanup *);
30   void *custom;
31 };
32
33 struct olsr_telnet_data {
34   /* address of remote communication partner */
35   struct netaddr *remote;
36
37   /* output buffer for telnet commands */
38   struct autobuf *out;
39
40   /* current telnet command and parameters */
41   const char *command;
42   const char *parameter;
43
44   /* remember if echo mode is active */
45   bool show_echo;
46
47   /* millisecond timeout between commands */
48   uint32_t timeout_value;
49
50   /* callback and data to stop a continous output txt command */
51   void (*stop_handler)(struct olsr_telnet_data *);
52   void *stop_data[4];
53
54   struct list_entity cleanup_list;
55 };
56
57 struct olsr_telnet_session {
58   struct olsr_stream_session session;
59   struct olsr_telnet_data data;
60 };
61
62 typedef enum olsr_telnet_result (*olsr_telnethandler)
63     (struct olsr_telnet_data *con);
64
65 #if !defined(REMOVE_HELPTEXT)
66 #define TELNET_CMD(cmd, cb, helptext, args...) { .command = (cmd), .handler = (cb), .help = helptext, ##args }
67 #else
68 #define TELNET_CMD(cmd, cb, helptext, args...) { .command = (cmd), .handler = (cb), .help = "", ##args }
69 #endif
70
71 struct olsr_telnet_command {
72   struct avl_node node;
73   const char *command;
74
75   const char *help;
76
77   struct olsr_netaddr_acl *acl;
78
79   olsr_telnethandler handler;
80   olsr_telnethandler help_handler;
81 };
82
83 #define FOR_ALL_TELNET_COMMANDS(cmd, ptr) avl_for_each_element_safe(&telnet_cmd_tree, cmd, node, ptr)
84 EXPORT struct avl_tree telnet_cmd_tree;
85
86 EXPORT int olsr_telnet_init(void) __attribute__((warn_unused_result));
87 EXPORT void olsr_telnet_cleanup(void);
88
89 EXPORT int olsr_telnet_add(struct olsr_telnet_command *command);
90 EXPORT void olsr_telnet_remove(struct olsr_telnet_command *command);
91
92 EXPORT void olsr_telnet_stop(struct olsr_telnet_data *data);
93
94 EXPORT enum olsr_telnet_result olsr_telnet_execute(
95     const char *cmd, const char *para,
96     struct autobuf *out, struct netaddr *remote);
97
98 /**
99  * Add a cleanup handler to a telnet session
100  * @param data pointer to telnet data
101  * @param cleanup pointer to initialized cleanup handler
102  */
103 static INLINE void
104 olsr_telnet_add_cleanup(struct olsr_telnet_data *data,
105     struct olsr_telnet_cleanup *cleanup) {
106   cleanup->data = data;
107   list_add_tail(&data->cleanup_list, &cleanup->node);
108 }
109
110 /**
111  * Removes a cleanup handler to a telnet session
112  * @param cleanup pointer to cleanup handler
113  */
114 static INLINE void
115 olsr_telnet_remove_cleanup(struct olsr_telnet_cleanup *cleanup) {
116   list_remove(&cleanup->node);
117 }
118
119 #endif /* OLSR_TELNET_H_ */