doveadm-fs.c revision a601cdf61506674a681195acfe57c9864bd3f7ac
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen/* Copyright (c) 2013 Dovecot authors, see the included COPYING file */
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic void fs_cmd_help(doveadm_command_t *cmd);
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainenstatic void cmd_fs_delete(int argc, char *argv[]);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic struct fs *
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainencmd_fs_init(int *argc, char **argv[], int own_arg_count, doveadm_command_t *cmd)
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen ssl_set.ca_dir = doveadm_settings->ssl_client_ca_dir;
56d1345c43bbd28c36b7faa85e4163bd9e874290Timo Sirainen ssl_set.ca_file = doveadm_settings->ssl_client_ca_file;
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen if (fs_init((*argv)[1], (*argv)[2], &fs_set, &fs, &error) < 0)
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen const unsigned char *data;
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen fs = cmd_fs_init(&argc, &argv, 1, cmd_fs_get);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen file = fs_file_init(fs, argv[0], FS_OPEN_MODE_READONLY);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen while ((ret = i_stream_read_data(input, &data, &size, 0)) > 0) {
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen i_error("%s doesn't exist", fs_file_path(file));
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen i_error("read(%s) failed: %m", fs_file_path(file));
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen fs = cmd_fs_init(&argc, &argv, 2, cmd_fs_put);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen file = fs_file_init(fs, dest_path, FS_OPEN_MODE_REPLACE);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen input = i_stream_create_file(src_path, IO_BLOCK_SIZE);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen if ((ret = o_stream_send_istream(output, input)) < 0) {
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen if (fs_write_stream_finish(file, &output) < 0) {
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen i_error("fs_write_stream_finish() failed: %s",
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic void cmd_fs_copy(int argc, char *argv[])
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen fs = cmd_fs_init(&argc, &argv, 2, cmd_fs_copy);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen src_file = fs_file_init(fs, src_path, FS_OPEN_MODE_READONLY);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen dest_file = fs_file_init(fs, dest_path, FS_OPEN_MODE_REPLACE);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic void cmd_fs_stat(int argc, char *argv[])
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen fs = cmd_fs_init(&argc, &argv, 1, cmd_fs_stat);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen file = fs_file_init(fs, argv[0], FS_OPEN_MODE_READONLY);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen i_error("%s doesn't exist", fs_file_path(file));
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen fs_file_path(file), fs_file_last_error(file));
a601cdf61506674a681195acfe57c9864bd3f7acTimo Sirainenstatic void cmd_fs_metadata(int argc, char *argv[])
a601cdf61506674a681195acfe57c9864bd3f7acTimo Sirainen const struct fs_metadata *m;
a601cdf61506674a681195acfe57c9864bd3f7acTimo Sirainen fs = cmd_fs_init(&argc, &argv, 1, cmd_fs_metadata);
a601cdf61506674a681195acfe57c9864bd3f7acTimo Sirainen file = fs_file_init(fs, argv[0], FS_OPEN_MODE_READONLY);
a601cdf61506674a681195acfe57c9864bd3f7acTimo Sirainen i_error("%s doesn't exist", fs_file_path(file));
a601cdf61506674a681195acfe57c9864bd3f7acTimo Sirainen fs_file_path(file), fs_file_last_error(file));
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainenstatic void cmd_fs_delete_dir_recursive(struct fs *fs, const char *path)
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainen /* delete subdirs first. all fs backends can't handle recursive
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainen lookups, so save the list first. */
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainen iter = fs_iter_init(fs, path, FS_ITER_FLAG_DIRS);
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainen while ((fname = fs_iter_next(iter)) != NULL) {
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainen /* delete files */
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainen while ((fname = fs_iter_next(iter)) != NULL) T_BEGIN {
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainen file = fs_file_init(fs, t_strdup_printf("%s/%s", path, fname),
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainen fs_file_path(file), fs_file_last_error(file));
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainenstatic void cmd_fs_delete_recursive(int argc, char *argv[])
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainen fs = cmd_fs_init(&argc, &argv, 1, cmd_fs_delete);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic void cmd_fs_delete(int argc, char *argv[])
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen fs = cmd_fs_init(&argc, &argv, 1, cmd_fs_delete);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen file = fs_file_init(fs, argv[0], FS_OPEN_MODE_READONLY);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen i_error("%s doesn't exist", fs_file_path(file));
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen fs_file_path(file), fs_file_last_error(file));
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic void cmd_fs_iter_full(int argc, char *argv[], enum fs_iter_flags flags,
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic void cmd_fs_iter(int argc, char *argv[])
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic void cmd_fs_iter_dirs(int argc, char *argv[])
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen cmd_fs_iter_full(argc, argv, FS_ITER_FLAG_DIRS, cmd_fs_iter_dirs);
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen { cmd_fs_get, "fs get", "<fs-driver> <fs-args> <path>" },
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen { cmd_fs_put, "fs put", "<fs-driver> <fs-args> <input path> <path>" },
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen { cmd_fs_copy, "fs copy", "<fs-driver> <fs-args> <source path> <dest path>" },
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen { cmd_fs_stat, "fs stat", "<fs-driver> <fs-args> <path>" },
a601cdf61506674a681195acfe57c9864bd3f7acTimo Sirainen { cmd_fs_metadata, "fs metadata", "<fs-driver> <fs-args> <path>" },
ca096c557fac1cf87dd5f129c202b2c1d990ff59Timo Sirainen { cmd_fs_delete, "fs delete", "[-R] <fs-driver> <fs-args> <path>" },
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen { cmd_fs_iter, "fs iter", "<fs-driver> <fs-args> <path>" },
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen { cmd_fs_iter_dirs, "fs iter-dirs", "<fs-driver> <fs-args> <path>" },
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainenstatic void fs_cmd_help(doveadm_command_t *cmd)
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen unsigned int i;
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen for (i = 0; i < N_ELEMENTS(doveadm_cmd_fs); i++) {
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen unsigned int i;
51f750db859e62e2c58a61806b53e0adb13e0775Timo Sirainen for (i = 0; i < N_ELEMENTS(doveadm_cmd_fs); i++)