dovecot-2.1: dsync: Prefix remote dsync's error messages with "r...

dovecot at dovecot.org dovecot at dovecot.org
Fri Mar 2 14:06:24 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/523a6f3e0713
changeset: 14214:523a6f3e0713
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Mar 02 14:06:18 2012 +0200
description:
dsync: Prefix remote dsync's error messages with "remote:".

diffstat:

 src/doveadm/dsync/doveadm-dsync.c |  60 +++++++++++++++++++++++++++++---------
 1 files changed, 45 insertions(+), 15 deletions(-)

diffs (121 lines):

diff -r d4922e80ca05 -r 523a6f3e0713 src/doveadm/dsync/doveadm-dsync.c
--- a/src/doveadm/dsync/doveadm-dsync.c	Fri Mar 02 13:56:37 2012 +0200
+++ b/src/doveadm/dsync/doveadm-dsync.c	Fri Mar 02 14:06:18 2012 +0200
@@ -31,7 +31,8 @@
 	const char *const *remote_cmd_args;
 	const char *local_location;
 
-	int fd_in, fd_out;
+	int fd_in, fd_out, fd_err;
+	struct io *io_err;
 
 	unsigned int lock_timeout;
 
@@ -42,39 +43,61 @@
 static const char *ssh_cmd = "ssh";
 static bool legacy_dsync = FALSE;
 
-static void run_cmd(const char *const *args, int *fd_in_r, int *fd_out_r)
+static void remote_error_input(struct dsync_cmd_context *ctx)
 {
-	int fd_in[2], fd_out[2];
+	char buf[1024];
+	ssize_t ret;
 
-	if (pipe(fd_in) < 0 || pipe(fd_out) < 0)
+	ret = read(ctx->fd_err, buf, sizeof(buf)-1);
+	if (ret == -1) {
+		io_remove(&ctx->io_err);
+		return;
+	}
+	if (ret > 0) {
+		buf[ret-1] = '\0';
+		i_error("remote: %s", buf);
+	}
+}
+
+static void
+run_cmd(struct dsync_cmd_context *ctx, const char *const *args)
+{
+	int fd_in[2], fd_out[2], fd_err[2];
+
+	if (pipe(fd_in) < 0 || pipe(fd_out) < 0 || pipe(fd_err) < 0)
 		i_fatal("pipe() failed: %m");
 
 	switch (fork()) {
 	case -1:
 		i_fatal("fork() failed: %m");
-		break;
 	case 0:
 		/* child, which will execute the proxy server. stdin/stdout
 		   goes to pipes which we'll pass to proxy client. */
 		if (dup2(fd_in[0], STDIN_FILENO) < 0 ||
-		    dup2(fd_out[1], STDOUT_FILENO) < 0)
+		    dup2(fd_out[1], STDOUT_FILENO) < 0 ||
+		    dup2(fd_err[1], STDERR_FILENO) < 0)
 			i_fatal("dup2() failed: %m");
 
 		(void)close(fd_in[0]);
 		(void)close(fd_in[1]);
 		(void)close(fd_out[0]);
 		(void)close(fd_out[1]);
+		(void)close(fd_err[0]);
+		(void)close(fd_err[1]);
 
 		execvp_const(args[0], args);
-		break;
 	default:
 		/* parent */
-		(void)close(fd_in[0]);
-		(void)close(fd_out[1]);
-		*fd_in_r = fd_out[0];
-		*fd_out_r = fd_in[1];
 		break;
 	}
+
+	(void)close(fd_in[0]);
+	(void)close(fd_out[1]);
+	(void)close(fd_err[1]);
+	ctx->fd_in = fd_out[0];
+	ctx->fd_out = fd_in[1];
+	ctx->fd_err = fd_err[0];
+	ctx->io_err = io_add(ctx->fd_err, IO_READ, remote_error_input, ctx);
 }
 
 static void
@@ -318,6 +341,12 @@
 	}
 	dsync_worker_deinit(&worker1);
 	dsync_worker_deinit(&worker2);
+	if (ctx->io_err != NULL)
+		io_remove(&ctx->io_err);
+	if (ctx->fd_err != -1) {
+		(void)close(ctx->fd_err);
+		ctx->fd_err = -1;
+	}
 	return ret;
 }
 
@@ -327,6 +356,10 @@
 	struct dsync_cmd_context *ctx = (struct dsync_cmd_context *)_ctx;
 	const char *username = "";
 
+	ctx->fd_in = STDIN_FILENO;
+	ctx->fd_out = STDOUT_FILENO;
+	ctx->fd_err = -1;
+
 	if (args[0] == NULL)
 		doveadm_mail_help_name(_ctx->cmd->name);
 
@@ -351,10 +384,7 @@
 	if (ctx->remote_cmd_args != NULL) {
 		/* do this before mail_storage_service_next() in case it
 		   drops process privileges */
-		run_cmd(ctx->remote_cmd_args, &ctx->fd_in, &ctx->fd_out);
-	} else {
-		ctx->fd_in = STDIN_FILENO;
-		ctx->fd_out = STDOUT_FILENO;
+		run_cmd(ctx, ctx->remote_cmd_args);
 	}
 }
 


More information about the dovecot-cvs mailing list