dovecot-2.2: doveadm fs delete: Support giving multiple filename...
dovecot at dovecot.org
dovecot at dovecot.org
Thu Aug 27 16:40:55 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/17220b7e1378
changeset: 19028:17220b7e1378
user: Timo Sirainen <tss at iki.fi>
date: Thu Aug 27 18:39:58 2015 +0200
description:
doveadm fs delete: Support giving multiple filename parameters.
diffstat:
src/doveadm/doveadm-fs.c | 104 ++++++++++++++++++++++++++++------------------
1 files changed, 64 insertions(+), 40 deletions(-)
diffs (181 lines):
diff -r 7ecf4d436a46 -r 17220b7e1378 src/doveadm/doveadm-fs.c
--- a/src/doveadm/doveadm-fs.c Thu Aug 27 17:38:12 2015 +0200
+++ b/src/doveadm/doveadm-fs.c Thu Aug 27 18:39:58 2015 +0200
@@ -26,8 +26,13 @@
struct fs *fs;
const char *error;
- if (*argc != 3 + own_arg_count)
- fs_cmd_help(cmd);
+ if (own_arg_count > 0) {
+ if (*argc != 3 + own_arg_count)
+ fs_cmd_help(cmd);
+ } else {
+ if (*argc <= 3)
+ fs_cmd_help(cmd);
+ }
memset(&ssl_set, 0, sizeof(ssl_set));
ssl_set.ca_dir = doveadm_settings->ssl_client_ca_dir;
@@ -242,6 +247,10 @@
else if (errno == EAGAIN) {
if (ret == 0)
ret = 1;
+ } else if (errno == ENOENT) {
+ i_error("%s doesn't exist", fs_file_path(ctx->files[i]));
+ doveadm_exit_code = DOVEADM_EX_NOTFOUND;
+ ret = -1;
} else {
i_error("fs_delete(%s) failed: %s",
fs_file_path(ctx->files[i]),
@@ -253,8 +262,8 @@
return ret;
}
-static int doveadm_fs_delete_recursive_fname(struct fs_delete_ctx *ctx,
- const char *fname)
+static int doveadm_fs_delete_async_fname(struct fs_delete_ctx *ctx,
+ const char *fname)
{
unsigned int i;
int ret;
@@ -278,11 +287,28 @@
doveadm_exit_code = EX_TEMPFAIL;
return -1;;
}
- return doveadm_fs_delete_recursive_fname(ctx, fname);
+ return doveadm_fs_delete_async_fname(ctx, fname);
}
return 0;
}
+static void doveadm_fs_delete_async_finish(struct fs_delete_ctx *ctx)
+{
+ unsigned int i;
+
+ while (doveadm_exit_code == 0 && cmd_fs_delete_ctx_run(ctx) > 0) {
+ if (fs_wait_async(ctx->fs) < 0) {
+ i_error("fs_wait_async() failed: %s", fs_last_error(ctx->fs));
+ doveadm_exit_code = EX_TEMPFAIL;
+ break;
+ }
+ }
+ for (i = 0; i < ctx->files_count; i++) {
+ if (ctx->files[i] != NULL)
+ fs_file_deinit(&ctx->files[i]);
+ }
+}
+
static void
cmd_fs_delete_dir_recursive(struct fs *fs, unsigned int async_count,
const char *path_prefix)
@@ -291,7 +317,6 @@
ARRAY_TYPE(const_string) fnames;
struct fs_delete_ctx ctx;
const char *fname, *const *fnamep;
- unsigned int i;
int ret;
memset(&ctx, 0, sizeof(ctx));
@@ -341,22 +366,12 @@
array_foreach(&fnames, fnamep) {
T_BEGIN {
- ret = doveadm_fs_delete_recursive_fname(&ctx, *fnamep);
+ ret = doveadm_fs_delete_async_fname(&ctx, *fnamep);
} T_END;
if (ret < 0)
break;
}
- while (doveadm_exit_code == 0 && cmd_fs_delete_ctx_run(&ctx) > 0) {
- if (fs_wait_async(fs) < 0) {
- i_error("fs_wait_async() failed: %s", fs_last_error(fs));
- doveadm_exit_code = EX_TEMPFAIL;
- break;
- }
- }
- for (i = 0; i < ctx.files_count; i++) {
- if (ctx.files[i] != NULL)
- fs_file_deinit(&ctx.files[i]);
- }
+ doveadm_fs_delete_async_finish(&ctx);
}
static void
@@ -387,10 +402,35 @@
fs_deinit(&fs);
}
+static void cmd_fs_delete_paths(int argc, char *argv[],
+ unsigned int async_count)
+{
+ struct fs *fs;
+ struct fs_delete_ctx ctx;
+ unsigned int i;
+ int ret;
+
+ fs = cmd_fs_init(&argc, &argv, 0, cmd_fs_delete);
+
+ memset(&ctx, 0, sizeof(ctx));
+ ctx.fs = fs;
+ ctx.path_prefix = "";
+ ctx.files_count = I_MAX(async_count, 1);
+ ctx.files = t_new(struct fs_file *, ctx.files_count);
+
+ for (i = 0; argv[i] != NULL; i++) {
+ T_BEGIN {
+ ret = doveadm_fs_delete_async_fname(&ctx, argv[i]);
+ } T_END;
+ if (ret < 0)
+ break;
+ }
+ doveadm_fs_delete_async_finish(&ctx);
+ fs_deinit(&fs);
+}
+
static void cmd_fs_delete(int argc, char *argv[])
{
- struct fs *fs;
- struct fs_file *file;
bool recursive = FALSE;
unsigned int async_count = 0;
int c;
@@ -410,26 +450,10 @@
}
argc -= optind-1; argv += optind-1;
- if (recursive) {
+ if (recursive)
cmd_fs_delete_recursive(argc, argv, async_count);
- return;
- }
-
- fs = cmd_fs_init(&argc, &argv, 1, cmd_fs_delete);
-
- file = fs_file_init(fs, argv[0], FS_OPEN_MODE_READONLY);
- if (fs_delete(file) == 0)
- ;
- else if (errno == ENOENT) {
- i_error("%s doesn't exist", fs_file_path(file));
- doveadm_exit_code = DOVEADM_EX_NOTFOUND;
- } else {
- i_error("fs_delete(%s) failed: %s",
- fs_file_path(file), fs_file_last_error(file));
- doveadm_exit_code = EX_TEMPFAIL;
- }
- fs_file_deinit(&file);
- fs_deinit(&fs);
+ else
+ cmd_fs_delete_paths(argc, argv, async_count);
}
static void cmd_fs_iter_full(int argc, char *argv[], enum fs_iter_flags flags,
@@ -468,7 +492,7 @@
{ cmd_fs_copy, "fs copy", "<fs-driver> <fs-args> <source path> <dest path>" },
{ cmd_fs_stat, "fs stat", "<fs-driver> <fs-args> <path>" },
{ cmd_fs_metadata, "fs metadata", "<fs-driver> <fs-args> <path>" },
- { cmd_fs_delete, "fs delete", "[-R] [-n <count>] <fs-driver> <fs-args> <path>" },
+ { cmd_fs_delete, "fs delete", "[-R] [-n <count>] <fs-driver> <fs-args> <path> [<path> ...]" },
{ cmd_fs_iter, "fs iter", "<fs-driver> <fs-args> <path>" },
{ cmd_fs_iter_dirs, "fs iter-dirs", "<fs-driver> <fs-args> <path>" },
};
More information about the dovecot-cvs
mailing list