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