1 #ifndef DOVEADM_CMD_H
2 #define DOVEADM_CMD_H
3 
4 #include "net.h"
5 
6 #define DOVEADM_CMD_PARAMS_START .parameters = (const struct doveadm_cmd_param[]){
7 #define DOVEADM_CMD_PARAM(optP, nameP, typeP, flagP ) { .short_opt = optP, .name = nameP, .type = typeP, .flags = flagP },
8 #define DOVEADM_CMD_PARAMS_END { .short_opt = '\0', .name = NULL, .type = CMD_PARAM_BOOL, .flags = CMD_PARAM_FLAG_NONE } }
9 
10 struct doveadm_cmd_ver2;
11 struct doveadm_cmd_context;
12 struct doveadm_mail_cmd_context;
13 
14 typedef void doveadm_command_t(int argc, char *argv[]);
15 
16 typedef enum {
17 	CMD_PARAM_BOOL = 0, /* value will contain 1 (not pointer) */
18 	CMD_PARAM_INT64,    /* ditto but contains number (not pointer) */
19 	CMD_PARAM_IP,	   /* value contains struct ip_addr */
20 	CMD_PARAM_STR,     /* value contains const char* */
21 	CMD_PARAM_ARRAY,   /* value contains const char*[] */
22 	CMD_PARAM_ISTREAM  /* value contains struct istream* */
23 } doveadm_cmd_param_t;
24 
25 typedef enum {
26 	CMD_PARAM_FLAG_NONE		= 0x0,
27 	CMD_PARAM_FLAG_POSITIONAL 	= 0x1,
28 	CMD_PARAM_FLAG_DO_NOT_EXPOSE	= 0x2,
29 } doveadm_cmd_param_flag_t;
30 
31 typedef enum {
32 	CMD_FLAG_NONE			= 0x0,
33 	CMD_FLAG_HIDDEN			= 0x1,
34 	CMD_FLAG_NO_PRINT		= 0x2,
35 	/* Don't parse any -options for the command. */
36 	CMD_FLAG_NO_OPTIONS		= 0x4,
37 	/* Prevent GNU getopt() from finding options after the first
38 	   non-option is seen (e.g. "-1 arg -2" would parse -1 but not -2
39 	   as option). */
40 	CMD_FLAG_NO_UNORDERED_OPTIONS	= 0x8,
41 } doveadm_cmd_flag_t;
42 
43 struct doveadm_cmd_param {
44 	char short_opt;
45 	const char *name;
46 	doveadm_cmd_param_t type;
47 	bool value_set;
48 	struct {
49 		bool v_bool;
50 		int64_t v_int64;
51 		const char* v_string;
52 		ARRAY_TYPE(const_string) v_array;
53 		struct ip_addr v_ip;
54 		struct istream* v_istream;
55 	} value;
56 	doveadm_cmd_param_flag_t flags;
57 };
58 ARRAY_DEFINE_TYPE(doveadm_cmd_param_arr_t, struct doveadm_cmd_param);
59 
60 typedef void doveadm_command_ver2_t(struct doveadm_cmd_context *cctx);
61 
62 struct doveadm_cmd_ver2 {
63 	doveadm_command_ver2_t *cmd;
64 	struct doveadm_mail_cmd_context *(*mail_cmd)(void);
65 	const char *name;
66 	const char *usage;
67 	doveadm_cmd_flag_t flags;
68 	const struct doveadm_cmd_param *parameters;
69 };
70 
71 struct doveadm_cmd_context {
72 	const struct doveadm_cmd_ver2 *cmd; /* for help */
73 
74 	int argc;
75 	const struct doveadm_cmd_param *argv;
76 
77 	const char *username;
78 	struct ip_addr local_ip, remote_ip;
79 	in_port_t local_port, remote_port;
80 
81 	enum doveadm_client_type conn_type;
82 	struct istream *input;
83 	struct ostream *output;
84 };
85 
86 ARRAY_DEFINE_TYPE(doveadm_cmd_ver2, struct doveadm_cmd_ver2);
87 extern ARRAY_TYPE(doveadm_cmd_ver2) doveadm_cmds_ver2;
88 
89 void doveadm_register_auth_commands(void);
90 void doveadm_register_auth_server_commands(void);
91 void doveadm_register_director_commands(void);
92 void doveadm_register_proxy_commands(void);
93 void doveadm_register_log_commands(void);
94 void doveadm_register_instance_commands(void);
95 void doveadm_register_mount_commands(void);
96 void doveadm_register_replicator_commands(void);
97 void doveadm_register_dict_commands(void);
98 void doveadm_register_fs_commands(void);
99 
100 void doveadm_cmds_init(void);
101 void doveadm_cmds_deinit(void);
102 
103 void doveadm_cmd_ver2_to_mail_cmd_wrapper(struct doveadm_cmd_context *cctx);
104 
105 void doveadm_cmd_register_ver2(struct doveadm_cmd_ver2 *cmd);
106 const struct doveadm_cmd_ver2 *
107 doveadm_cmd_find_with_args_ver2(const char *cmd_name, int *argc,
108 				const char *const *argv[]);
109 const struct doveadm_cmd_ver2 *doveadm_cmd_find_ver2(const char *cmd_name);
110 /* Returns FALSE if cmd_name doesn't exist, TRUE if it exists. */
111 bool doveadm_cmd_try_run_ver2(const char *cmd_name,
112 	int argc, const char *const argv[],
113 	struct doveadm_cmd_context *cctx);
114 /* Returns 0 if success, -1 if parameters were invalid. */
115 int doveadm_cmd_run_ver2(int argc, const char *const argv[],
116 	struct doveadm_cmd_context *cctx);
117 
118 bool doveadm_cmd_param_bool(const struct doveadm_cmd_context *cctx,
119 			    const char *name, bool *value_r);
120 bool doveadm_cmd_param_int64(const struct doveadm_cmd_context *cctx,
121 			     const char *name, int64_t *value_r);
122 bool doveadm_cmd_param_str(const struct doveadm_cmd_context *cctx,
123 			   const char *name, const char **value_r);
124 bool doveadm_cmd_param_ip(const struct doveadm_cmd_context *cctx,
125 			  const char *name, struct ip_addr *value_r);
126 bool doveadm_cmd_param_array(const struct doveadm_cmd_context *cctx,
127 			     const char *name, const char *const **value_r);
128 bool doveadm_cmd_param_istream(const struct doveadm_cmd_context *cctx,
129 			       const char *name, struct istream **value_r);
130 
131 void doveadm_cmd_params_clean(ARRAY_TYPE(doveadm_cmd_param_arr_t) *pargv);
132 void doveadm_cmd_params_null_terminate_arrays(ARRAY_TYPE(doveadm_cmd_param_arr_t) *pargv);
133 
134 extern struct doveadm_cmd_ver2 doveadm_cmd_dump;
135 extern struct doveadm_cmd_ver2 doveadm_cmd_service_stop_ver2;
136 extern struct doveadm_cmd_ver2 doveadm_cmd_service_status_ver2;
137 extern struct doveadm_cmd_ver2 doveadm_cmd_process_status_ver2;
138 extern struct doveadm_cmd_ver2 doveadm_cmd_stop_ver2;
139 extern struct doveadm_cmd_ver2 doveadm_cmd_reload_ver2;
140 extern struct doveadm_cmd_ver2 doveadm_cmd_stats_dump_ver2;
141 extern struct doveadm_cmd_ver2 doveadm_cmd_stats_add_ver2;
142 extern struct doveadm_cmd_ver2 doveadm_cmd_stats_remove_ver2;
143 extern struct doveadm_cmd_ver2 doveadm_cmd_mailbox_mutf7;
144 extern struct doveadm_cmd_ver2 doveadm_cmd_oldstats_reset_ver2;
145 extern struct doveadm_cmd_ver2 doveadm_cmd_oldstats_dump_ver2;
146 extern struct doveadm_cmd_ver2 doveadm_cmd_oldstats_top_ver2;
147 extern struct doveadm_cmd_ver2 doveadm_cmd_penalty_ver2;
148 extern struct doveadm_cmd_ver2 doveadm_cmd_pw;
149 extern struct doveadm_cmd_ver2 doveadm_cmd_kick_ver2;
150 extern struct doveadm_cmd_ver2 doveadm_cmd_who_ver2;
151 extern struct doveadm_cmd_ver2 doveadm_cmd_sis_deduplicate;
152 extern struct doveadm_cmd_ver2 doveadm_cmd_sis_find;
153 extern struct doveadm_cmd_ver2 doveadm_cmd_zlibconnect;
154 
155 #endif
156