diff options
-rw-r--r-- | src/core/interface.c | 69 | ||||
-rw-r--r-- | src/include/ipxe/interface.h | 5 |
2 files changed, 74 insertions, 0 deletions
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 @@ -291,6 +291,41 @@ void intf_shutdown ( struct interface *intf, int rc ) { } /** + * 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 * * @v intf Object interface @@ -317,6 +352,40 @@ void intf_restart ( struct interface *intf, int rc ) { } /** + * 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 * * @v intf 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 <stddef.h> +#include <stdarg.h> #include <ipxe/refcnt.h> /** 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 ) ); |