diff --git a/src/core/interface.c b/src/core/interface.c index f7802be0..402aa454 100644 --- a/src/core/interface.c +++ b/src/core/interface.c @@ -290,6 +290,41 @@ void intf_shutdown ( struct interface *intf, int rc ) { intf_unplug ( &tmp ); } +/** + * Shut down multiple object interfaces + * + * @v intfs Object interfaces + * @v rc Reason for close + */ +void intfs_vshutdown ( va_list intfs, int rc ) { + struct interface *intf; + va_list tmp; + + /* Nullify all interfaces to avoid potential loops */ + va_copy ( tmp, intfs ); + while ( ( intf = va_arg ( tmp, struct interface * ) ) ) + intf_nullify ( intf ); + va_end ( tmp ); + + /* Shut down all interfaces */ + while ( ( intf = va_arg ( intfs, struct interface * ) ) ) + intf_shutdown ( intf, rc ); +} + +/** + * Shut down multiple object interfaces + * + * @v rc Reason for close + * @v ... Object interfaces + */ +void intfs_shutdown ( int rc, ... ) { + va_list intfs; + + va_start ( intfs, rc ); + intfs_vshutdown ( intfs, rc ); + va_end ( intfs ); +} + /** * Shut down and restart an object interface * @@ -316,6 +351,40 @@ void intf_restart ( struct interface *intf, int rc ) { intf_reinit ( intf ); } +/** + * Shut down and restart multiple object interfaces + * + * @v intfs Object interfaces + * @v rc Reason for close + */ +void intfs_vrestart ( va_list intfs, int rc ) { + struct interface *intf; + va_list tmp; + + /* Shut down all interfaces */ + va_copy ( tmp, intfs ); + intfs_vshutdown ( tmp, rc ); + va_end ( tmp ); + + /* Reinitialise all interfaces */ + while ( ( intf = va_arg ( intfs, struct interface * ) ) ) + intf_reinit ( intf ); +} + +/** + * Shut down and restart multiple object interfaces + * + * @v rc Reason for close + * @v ... Object interfaces + */ +void intfs_restart ( int rc, ... ) { + va_list intfs; + + va_start ( intfs, rc ); + intfs_vrestart ( intfs, rc ); + va_end ( intfs ); +} + /** * Poke an object interface * diff --git a/src/include/ipxe/interface.h b/src/include/ipxe/interface.h index ebb1b691..b65002c8 100644 --- a/src/include/ipxe/interface.h +++ b/src/include/ipxe/interface.h @@ -10,6 +10,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include +#include #include /** An object interface operation */ @@ -148,7 +149,11 @@ extern void intf_close ( struct interface *intf, int rc ); typeof ( void ( object_type, int rc ) ) extern void intf_shutdown ( struct interface *intf, int rc ); +extern void intfs_vshutdown ( va_list intfs, int rc ); +extern void intfs_shutdown ( int rc, ... ) __attribute__ (( sentinel )); extern void intf_restart ( struct interface *intf, int rc ); +extern void intfs_vrestart ( va_list intfs, int rc ); +extern void intfs_restart ( int rc, ... ) __attribute__ (( sentinel )); extern void intf_poke ( struct interface *intf, void ( type ) ( struct interface *intf ) );