doveadm-fs.c revision f98a0796910657153726088fb936737cc585cd63
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2013-2015 Dovecot authors, see the included COPYING file */
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekstatic void fs_cmd_help(doveadm_command_t *cmd);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekstatic void cmd_fs_delete(int argc, char *argv[]);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekstatic struct fs *
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekcmd_fs_init(int *argc, char **argv[], int own_arg_count, doveadm_command_t *cmd)
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek ssl_set.ca_dir = doveadm_settings->ssl_client_ca_dir;
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek ssl_set.ca_file = doveadm_settings->ssl_client_ca_file;
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek fs_set.base_dir = doveadm_settings->base_dir;
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek if (fs_init((*argv)[1], (*argv)[2], &fs_set, &fs, &error) < 0)
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekstatic void cmd_fs_get(int argc, char *argv[])
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek const unsigned char *data;
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek fs = cmd_fs_init(&argc, &argv, 1, cmd_fs_get);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek file = fs_file_init(fs, argv[0], FS_OPEN_MODE_READONLY);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek input = fs_read_stream(file, IO_BLOCK_SIZE);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek while ((ret = i_stream_read_data(input, &data, &size, 0)) > 0) {
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek i_error("%s doesn't exist", fs_file_path(file));
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek i_error("read(%s) failed: %m", fs_file_path(file));
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekstatic void cmd_fs_put(int argc, char *argv[])
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek while ((c = getopt(argc, argv, "h:")) > 0) {
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek hash = buffer_create_dynamic(pool_datastack_create(), 32);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek i_fatal("Invalid -h parameter: Hash not in hex");
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek fs = cmd_fs_init(&argc, &argv, 2, cmd_fs_put);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek file = fs_file_init(fs, dest_path, FS_OPEN_MODE_REPLACE);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek else if (hash->used == hash_method_md5.digest_size) {
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek if ((props & FS_PROPERTY_WRITE_HASH_MD5) == 0)
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek i_fatal("fs backend doesn't support MD5 hashes");
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek hash_method_lookup(hash_method_md5.name), hash->data);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek } else if (hash->used == hash_method_sha256.digest_size) {
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek if ((props & FS_PROPERTY_WRITE_HASH_SHA256) == 0)
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek i_fatal("fs backend doesn't support SHA256 hashes");
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek hash_method_lookup(hash_method_sha256.name), hash->data);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek input = i_stream_create_file(src_path, IO_BLOCK_SIZE);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek if ((ret = o_stream_send_istream(output, input)) < 0) {
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek i_error("write(%s) failed: %m", dest_path);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek i_error("read(%s) failed: %m", src_path);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek if (fs_write_stream_finish(file, &output) < 0) {
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek i_error("fs_write_stream_finish() failed: %s",
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipekstatic void cmd_fs_copy(int argc, char *argv[])
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek fs = cmd_fs_init(&argc, &argv, 2, cmd_fs_copy);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek src_file = fs_file_init(fs, src_path, FS_OPEN_MODE_READONLY);
c536bf22651c97ad0369864897f1920625e53ea9Josef 'Jeff' Sipek dest_file = fs_file_init(fs, dest_path, FS_OPEN_MODE_REPLACE);
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainenstatic void cmd_fs_stat(int argc, char *argv[])
33750ba29b605a925af5aed58d3f3735422b1e25Phil Carmody fs = cmd_fs_init(&argc, &argv, 1, cmd_fs_stat);
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen file = fs_file_init(fs, argv[0], FS_OPEN_MODE_READONLY);
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen i_error("%s doesn't exist", fs_file_path(file));
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen fs_file_path(file), fs_file_last_error(file));
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainenstatic void cmd_fs_metadata(int argc, char *argv[])
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen const struct fs_metadata *m;
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen fs = cmd_fs_init(&argc, &argv, 1, cmd_fs_metadata);
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen file = fs_file_init(fs, argv[0], FS_OPEN_MODE_READONLY);
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen i_error("%s doesn't exist", fs_file_path(file));
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen fs_file_path(file), fs_file_last_error(file));
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainenstatic bool cmd_fs_delete_ctx_run(struct fs_delete_ctx *ctx)
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen unsigned int i;
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen if (ctx->files[i].file == NULL || ctx->files[i].finished)
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainen else if (fs_delete(ctx->files[i].file) == 0) {
3bb59b47d47cba85a92df67823b0e49d2c383307Timo Sirainencmd_fs_delete_dir_recursive(struct fs *fs, unsigned int async_count,
} T_END;
goto retry;
} T_END;
const char *path;
unsigned int path_len;
unsigned int async_count = 0;
if (recursive) {
const char *fname;
i_unreached();
void doveadm_register_fs_commands(void)