From ba3633782bd36831ca5471d792e626b7e8344e0c Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 22 Jun 2011 16:40:13 +0100 Subject: [PATCH] [xfer] Send xfer_window_changed() after xfer_vredirect() Modify the default action for xfer_vredirect() to automatically send xfer_window_changed() messages to both the new child and the parent interfaces. This will allow the elimination of processes that simply poll on xfer_window() to determine when a redirection has completed successfully. Signed-off-by: Michael Brown --- src/core/xfer.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/core/xfer.c b/src/core/xfer.c index a755d438..4d7d6b43 100644 --- a/src/core/xfer.c +++ b/src/core/xfer.c @@ -54,6 +54,7 @@ static struct xfer_metadata dummy_metadata; * @ret rc Return status code */ int xfer_vredirect ( struct interface *intf, int type, va_list args ) { + struct interface tmp = INTF_INIT ( null_intf_desc ); struct interface *dest; xfer_vredirect_TYPE ( void * ) *op = intf_get_dest_op_no_passthru ( intf, xfer_vredirect, &dest ); @@ -66,8 +67,22 @@ int xfer_vredirect ( struct interface *intf, int type, va_list args ) { if ( op ) { rc = op ( object, type, args ); } else { - /* Default is to reopen the interface as instructed */ + /* Default is to reopen the interface as instructed, + * then send xfer_window_changed() messages to both + * new child and parent interfaces. Since our + * original child interface is likely to be closed and + * unplugged as a result of the call to + * xfer_vreopen(), we create a temporary interface in + * order to be able to send xfer_window_changed() to + * the parent. + */ + intf_plug ( &tmp, dest ); rc = xfer_vreopen ( dest, type, args ); + if ( rc == 0 ) { + xfer_window_changed ( dest ); + xfer_window_changed ( &tmp ); + } + intf_unplug ( &tmp ); } if ( rc != 0 ) {