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