[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 <mcb30@ipxe.org>
This commit is contained in:
parent
c68bf14559
commit
ba3633782b
@ -54,6 +54,7 @@ static struct xfer_metadata dummy_metadata;
|
|||||||
* @ret rc Return status code
|
* @ret rc Return status code
|
||||||
*/
|
*/
|
||||||
int xfer_vredirect ( struct interface *intf, int type, va_list args ) {
|
int xfer_vredirect ( struct interface *intf, int type, va_list args ) {
|
||||||
|
struct interface tmp = INTF_INIT ( null_intf_desc );
|
||||||
struct interface *dest;
|
struct interface *dest;
|
||||||
xfer_vredirect_TYPE ( void * ) *op =
|
xfer_vredirect_TYPE ( void * ) *op =
|
||||||
intf_get_dest_op_no_passthru ( intf, xfer_vredirect, &dest );
|
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 ) {
|
if ( op ) {
|
||||||
rc = op ( object, type, args );
|
rc = op ( object, type, args );
|
||||||
} else {
|
} 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 );
|
rc = xfer_vreopen ( dest, type, args );
|
||||||
|
if ( rc == 0 ) {
|
||||||
|
xfer_window_changed ( dest );
|
||||||
|
xfer_window_changed ( &tmp );
|
||||||
|
}
|
||||||
|
intf_unplug ( &tmp );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( rc != 0 ) {
|
if ( rc != 0 ) {
|
||||||
|
Reference in New Issue
Block a user