libmultipath: add marginal paths and groups infrastructure
[multipath-tools/.git] / multipathd / cli.h
1 #ifndef _CLI_H_
2 #define _CLI_H_
3
4 #include <stdint.h>
5
6 enum {
7         __LIST,
8         __ADD,
9         __DEL,
10         __SWITCH,
11         __SUSPEND,
12         __RESUME,
13         __REINSTATE,
14         __FAIL,
15         __RESIZE,
16         __RESET,
17         __RELOAD,
18         __FORCEQ,
19         __DISABLEQ,
20         __RESTOREQ,
21         __PATHS,
22         __MAPS,
23         __PATH,
24         __MAP,
25         __GROUP,
26         __RECONFIGURE,
27         __DAEMON,
28         __STATUS,
29         __STATS,
30         __TOPOLOGY,
31         __CONFIG,
32         __BLACKLIST,
33         __DEVICES,
34         __RAW,
35         __WILDCARDS,
36         __QUIT,
37         __SHUTDOWN,
38         __GETPRSTATUS,
39         __SETPRSTATUS,
40         __UNSETPRSTATUS,
41         __FMT,
42         __JSON,
43         __GETPRKEY,
44         __SETPRKEY,
45         __UNSETPRKEY,
46         __KEY,
47         __LOCAL,
48         __SETMARGINAL,
49         __UNSETMARGINAL,
50 };
51
52 #define LIST            (1 << __LIST)
53 #define ADD             (1 << __ADD)
54 #define DEL             (1 << __DEL)
55 #define SWITCH          (1 << __SWITCH)
56 #define SUSPEND         (1 << __SUSPEND)
57 #define RESUME          (1 << __RESUME)
58 #define REINSTATE       (1 << __REINSTATE)
59 #define FAIL            (1 << __FAIL)
60 #define RESIZE          (1 << __RESIZE)
61 #define RESET           (1 << __RESET)
62 #define RELOAD          (1 << __RELOAD)
63 #define FORCEQ          (1 << __FORCEQ)
64 #define DISABLEQ        (1 << __DISABLEQ)
65 #define RESTOREQ        (1 << __RESTOREQ)
66 #define PATHS           (1 << __PATHS)
67 #define MAPS            (1 << __MAPS)
68 #define PATH            (1 << __PATH)
69 #define MAP             (1 << __MAP)
70 #define GROUP           (1 << __GROUP)
71 #define RECONFIGURE     (1 << __RECONFIGURE)
72 #define DAEMON          (1 << __DAEMON)
73 #define STATUS          (1 << __STATUS)
74 #define STATS           (1 << __STATS)
75 #define TOPOLOGY        (1 << __TOPOLOGY)
76 #define CONFIG          (1 << __CONFIG)
77 #define BLACKLIST       (1 << __BLACKLIST)
78 #define DEVICES         (1 << __DEVICES)
79 #define RAW             (1 << __RAW)
80 #define COUNT           (1 << __COUNT)
81 #define WILDCARDS       (1 << __WILDCARDS)
82 #define QUIT            (1 << __QUIT)
83 #define SHUTDOWN        (1 << __SHUTDOWN)
84 #define GETPRSTATUS     (1ULL << __GETPRSTATUS)
85 #define SETPRSTATUS     (1ULL << __SETPRSTATUS)
86 #define UNSETPRSTATUS   (1ULL << __UNSETPRSTATUS)
87 #define FMT             (1ULL << __FMT)
88 #define JSON            (1ULL << __JSON)
89 #define GETPRKEY        (1ULL << __GETPRKEY)
90 #define SETPRKEY        (1ULL << __SETPRKEY)
91 #define UNSETPRKEY      (1ULL << __UNSETPRKEY)
92 #define KEY             (1ULL << __KEY)
93 #define LOCAL           (1ULL << __LOCAL)
94 #define SETMARGINAL     (1ULL << __SETMARGINAL)
95 #define UNSETMARGINAL   (1ULL << __UNSETMARGINAL)
96
97 #define INITIAL_REPLY_LEN       1200
98
99 #define REALLOC_REPLY(r, a, m)                                  \
100         do {                                                    \
101                 if ((a)) {                                      \
102                         char *tmp = (r);                        \
103                                                                 \
104                         if (m >= MAX_REPLY_LEN) {               \
105                                 condlog(1, "Warning: max reply length exceeded"); \
106                                 free(tmp);                      \
107                                 (r) = NULL;                     \
108                         } else {                                \
109                                 (r) = REALLOC((r), (m) * 2);    \
110                                 if ((r)) {                      \
111                                         memset((r) + (m), 0, (m)); \
112                                         (m) *= 2;               \
113                                 }                               \
114                                 else                            \
115                                         free(tmp);              \
116                         }                                       \
117                 }                                               \
118         } while (0)
119
120 struct key {
121         char * str;
122         char * param;
123         uint64_t code;
124         int has_param;
125 };
126
127 struct handler {
128         uint64_t fingerprint;
129         int locked;
130         int (*fn)(void *, char **, int *, void *);
131 };
132
133 int alloc_handlers (void);
134 int add_handler (uint64_t fp, int (*fn)(void *, char **, int *, void *));
135 int set_handler_callback (uint64_t fp, int (*fn)(void *, char **, int *, void *));
136 int set_unlocked_handler_callback (uint64_t fp, int (*fn)(void *, char **, int *, void *));
137 int parse_cmd (char * cmd, char ** reply, int * len, void *, int);
138 int load_keys (void);
139 char * get_keyparam (vector v, uint64_t code);
140 void free_keys (vector vec);
141 void free_handlers (void);
142 int cli_init (void);
143 void cli_exit(void);
144 char * key_generator (const char * str, int state);
145
146 #endif /* _CLI_H_ */