doveadm-mail.h revision e4ba52b8290d366b5763df03be6709af3da0bc57
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#ifndef DOVEADM_MAIL_H
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen#define DOVEADM_MAIL_H
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
be5c76fabc7439fd33bc799bc3ab3f570799977bTimo Sirainen#include <stdio.h>
ee6df9526e9716b3f1734d85b566e00fc41208bcTimo Sirainen#include "doveadm.h"
137ea7ca34005345aa2304a940149b7f3774d727Timo Sirainen#include "doveadm-util.h"
e76073ebaf90fa29abfdc364873acf78983949aaTimo Sirainen#include "module-context.h"
1e21e6be70994b1aa9e52ca0e2f51afefca6d0dfTimo Sirainen#include "mail-error.h"
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen#include "mail-storage-service.h"
3b94ff5951db4d4eddb7a80ed4e3f61207202635Timo Sirainen
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainenstruct mailbox;
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainenstruct mailbox_list;
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainenstruct mail_storage;
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainenstruct mail_user;
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainenstruct doveadm_mail_cmd_context;
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainenstruct doveadm_mail_cmd_vfuncs {
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen /* Parse one getopt() parameter. This is called for each parameter. */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen bool (*parse_arg)(struct doveadm_mail_cmd_context *ctx, int c);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen /* Usually not needed. The preinit() is called just after parsing all
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen parameters, but before any userdb lookups are done. This allows the
22535a9e685e29214082878e37a267157044618eTimo Sirainen preinit() to alter the userdb lookup behavior (especially
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen service_flags). */
f3d506e525a720f214020ca0f989a1966b30edaeTimo Sirainen void (*preinit)(struct doveadm_mail_cmd_context *ctx);
74674a53a72dab535c61f455b2246ef2797844eaTimo Sirainen /* Initialize the command. Most importantly if the function prints
74674a53a72dab535c61f455b2246ef2797844eaTimo Sirainen anything, this should initialize the headers. It shouldn't however
74674a53a72dab535c61f455b2246ef2797844eaTimo Sirainen do any actual work. The init() is called also when doveadm is
74674a53a72dab535c61f455b2246ef2797844eaTimo Sirainen performing the work via doveadm-server, which could be running
c5383a0ed56a188a7d5efaaa4c6f8243af432d65Timo Sirainen remotely with completely different Dovecot configuration. */
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen void (*init)(struct doveadm_mail_cmd_context *ctx,
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen const char *const args[]);
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen /* Usually not needed. When iterating through multiple users, use this
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen function to get the next username. Overriding this is usually done
3cf67672fdc87583cb23ce088c95bb5dee60e74dTimo Sirainen only when there's a known username filter, such as the expire
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen plugin. */
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen int (*get_next_user)(struct doveadm_mail_cmd_context *ctx,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen const char **username_r);
e48d89622047bd8bbd0475b881ca9377d592f535Timo Sirainen /* Usually not needed. This is called between
2d8f66596f445dd8b399b7032c3f0e9202015b63Timo Sirainen mail_storage_service_lookup() and mail_storage_service_next() for
2d8f66596f445dd8b399b7032c3f0e9202015b63Timo Sirainen each user. */
2d8f66596f445dd8b399b7032c3f0e9202015b63Timo Sirainen int (*prerun)(struct doveadm_mail_cmd_context *ctx,
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen struct mail_storage_service_user *service_user,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen const char **error_r);
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen /* This is the main function which performs all the work for the
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen command. This is called once per each user. */
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen int (*run)(struct doveadm_mail_cmd_context *ctx,
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen struct mail_user *mail_user);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen /* Deinitialize the command. Called once at the end - even if
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen preinit() or init() was never called. */
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen void (*deinit)(struct doveadm_mail_cmd_context *ctx);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen};
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainenstruct doveadm_mail_cmd_module_register {
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen unsigned int id;
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen};
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen
f3d506e525a720f214020ca0f989a1966b30edaeTimo Sirainenunion doveadm_mail_cmd_module_context {
b42f37ae6f65ed986315b6885568d32115e589b1Timo Sirainen struct doveadm_mail_cmd_vfuncs super;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen struct doveadm_mail_cmd_module_register *reg;
3b94ff5951db4d4eddb7a80ed4e3f61207202635Timo Sirainen};
66d2db642fe24d555d113ba463e446b038d476efTimo Sirainen
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstruct doveadm_mail_cmd_context {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen pool_t pool;
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen const struct doveadm_mail_cmd *cmd;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen const char *const *args;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen /* args including -options */
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen const char *const *full_args;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen /* connection via doveadm-server */
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen struct client_connection *conn;
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen const char *getopt_args;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen const struct doveadm_settings *set;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen enum mail_storage_service_flags service_flags;
a10ed8c47534b4c6b6bf2711ccfe577e720a47b4Timo Sirainen struct mail_storage_service_ctx *storage_service;
12aad74464367f7e8be11eafe1af985bf7b1adecTimo Sirainen struct mail_storage_service_input storage_service_input;
e48d89622047bd8bbd0475b881ca9377d592f535Timo Sirainen /* search args aren't set for all mail commands */
04052d7cacaa866a3f00afb4e104fa46c04c1dd7Timo Sirainen struct mail_search_args *search_args;
f3d506e525a720f214020ca0f989a1966b30edaeTimo Sirainen struct istream *users_list_input;
849969f639a00eab26791db3cb1b66430420c0cdTimo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen struct ip_addr cur_client_ip;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen const char *cur_username;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct mail_storage_service_user *cur_service_user;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct mail_user *cur_mail_user;
be5c76fabc7439fd33bc799bc3ab3f570799977bTimo Sirainen struct doveadm_mail_cmd_vfuncs v;
be5c76fabc7439fd33bc799bc3ab3f570799977bTimo Sirainen
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen struct istream *cmd_input;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen int cmd_input_fd;
43a66a0b16299bd4f7615acd85e98bd3832c54d5Timo Sirainen
1e21e6be70994b1aa9e52ca0e2f51afefca6d0dfTimo Sirainen ARRAY(union doveadm_mail_cmd_module_context *) module_contexts;
1e21e6be70994b1aa9e52ca0e2f51afefca6d0dfTimo Sirainen
25757faf029c369a8318349dafe952e2358df1d8Timo Sirainen /* if non-zero, exit with this code */
int exit_code;
/* This command is being called by a remote doveadm client. */
unsigned int proxying:1;
/* We're handling only a single user */
unsigned int iterate_single_user:1;
/* We're going through all users (not set for wildcard usernames) */
unsigned int iterate_all_users:1;
};
struct doveadm_mail_cmd {
struct doveadm_mail_cmd_context *(*alloc)(void);
const char *name;
const char *usage_args;
};
ARRAY_DEFINE_TYPE(doveadm_mail_cmd, struct doveadm_mail_cmd);
extern ARRAY_TYPE(doveadm_mail_cmd) doveadm_mail_cmds;
extern void (*hook_doveadm_mail_init)(struct doveadm_mail_cmd_context *ctx);
extern struct doveadm_mail_cmd_module_register doveadm_mail_cmd_module_register;
extern char doveadm_mail_cmd_hide;
bool doveadm_is_killed(void);
bool doveadm_mail_try_run(const char *cmd_name, int argc, char *argv[]);
void doveadm_mail_register_cmd(const struct doveadm_mail_cmd *cmd);
const struct doveadm_mail_cmd *doveadm_mail_cmd_find(const char *cmd_name);
void doveadm_mail_usage(string_t *out);
void doveadm_mail_help(const struct doveadm_mail_cmd *cmd) ATTR_NORETURN;
void doveadm_mail_help_name(const char *cmd_name) ATTR_NORETURN;
void doveadm_mail_try_help_name(const char *cmd_name);
bool doveadm_mail_has_subcommands(const char *cmd_name);
void doveadm_mail_init(void);
void doveadm_mail_deinit(void);
const struct doveadm_mail_cmd *
doveadm_mail_cmd_find_from_argv(const char *cmd_name, int *argc,
const char *const **argv);
struct doveadm_mail_cmd_context *
doveadm_mail_cmd_init(const struct doveadm_mail_cmd *cmd,
const struct doveadm_settings *set);
int doveadm_mail_single_user(struct doveadm_mail_cmd_context *ctx,
const struct mail_storage_service_input *input,
const char **error_r);
int doveadm_mail_server_user(struct doveadm_mail_cmd_context *ctx,
const struct mail_storage_service_input *input,
const char **error_r);
void doveadm_mail_server_flush(void);
/* Request input stream to be read (from stdin). This must be called from
the command's init() function. */
void doveadm_mail_get_input(struct doveadm_mail_cmd_context *ctx);
struct mailbox *
doveadm_mailbox_find(struct mail_user *user, const char *mailbox);
struct mail_search_args *
doveadm_mail_build_search_args(const char *const args[]);
void doveadm_mailbox_args_check(const char *const args[]);
struct mail_search_args *
doveadm_mail_mailbox_search_args_build(const char *const args[]);
void expunge_search_args_check(struct mail_search_args *args, const char *cmd);
struct doveadm_mail_cmd_context *
doveadm_mail_cmd_alloc_size(size_t size);
#define doveadm_mail_cmd_alloc(type) \
(type *)doveadm_mail_cmd_alloc_size(sizeof(type))
void doveadm_mail_failed_error(struct doveadm_mail_cmd_context *ctx,
enum mail_error error);
void doveadm_mail_failed_storage(struct doveadm_mail_cmd_context *ctx,
struct mail_storage *storage);
void doveadm_mail_failed_mailbox(struct doveadm_mail_cmd_context *ctx,
struct mailbox *box);
void doveadm_mail_failed_list(struct doveadm_mail_cmd_context *ctx,
struct mailbox_list *list);
extern struct doveadm_mail_cmd cmd_expunge;
extern struct doveadm_mail_cmd cmd_save;
extern struct doveadm_mail_cmd cmd_search;
extern struct doveadm_mail_cmd cmd_fetch;
extern struct doveadm_mail_cmd cmd_flags_add;
extern struct doveadm_mail_cmd cmd_flags_remove;
extern struct doveadm_mail_cmd cmd_flags_replace;
extern struct doveadm_mail_cmd cmd_import;
extern struct doveadm_mail_cmd cmd_index;
extern struct doveadm_mail_cmd cmd_altmove;
extern struct doveadm_mail_cmd cmd_copy;
extern struct doveadm_mail_cmd cmd_deduplicate;
extern struct doveadm_mail_cmd cmd_move;
extern struct doveadm_mail_cmd cmd_mailbox_list;
extern struct doveadm_mail_cmd cmd_mailbox_create;
extern struct doveadm_mail_cmd cmd_mailbox_delete;
extern struct doveadm_mail_cmd cmd_mailbox_rename;
extern struct doveadm_mail_cmd cmd_mailbox_subscribe;
extern struct doveadm_mail_cmd cmd_mailbox_unsubscribe;
extern struct doveadm_mail_cmd cmd_mailbox_status;
extern struct doveadm_mail_cmd cmd_mailbox_metadata_set;
extern struct doveadm_mail_cmd cmd_mailbox_metadata_unset;
extern struct doveadm_mail_cmd cmd_mailbox_metadata_get;
extern struct doveadm_mail_cmd cmd_mailbox_metadata_list;
extern struct doveadm_mail_cmd cmd_batch;
#endif