]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[xfer] Send xfer_window_changed() after xfer_vredirect()
authorMichael Brown <mcb30@ipxe.org>
Wed, 22 Jun 2011 15:40:13 +0000 (16:40 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 28 Jun 2011 13:45:08 +0000 (14:45 +0100)
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 <mcb30@ipxe.org>
src/core/xfer.c

index a755d438a350b8f6a0849d20994850ed2460a8cd..4d7d6b43eae11ab9f804687c2b88c353ac02928c 100644 (file)
@@ -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 ) {