Skip to content

Commit

Permalink
[test] Allow self-tests to report exit status when running under Linux
Browse files Browse the repository at this point in the history
Allow the return status from an embedded image to propagate out to the
eventual return status from main().  When running under Linux, this
allows the pass/fail result of unit tests to be observable without
having to visually inspect the console output.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Aug 21, 2015
1 parent fb4ce72 commit f58ebbd
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 18 deletions.
9 changes: 6 additions & 3 deletions src/core/main.c
Expand Up @@ -26,6 +26,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
* @ret rc Return status code
*/
__asmcall int main ( void ) {
int rc;

/* Perform one-time-only initialisation (e.g. heap) */
initialise();
Expand All @@ -35,9 +36,11 @@ __asmcall int main ( void ) {
startup();
printf ( "ok\n" );

ipxe ( NULL );
/* Attempt to boot */
if ( ( rc = ipxe ( NULL ) ) != 0 )
goto err_ipxe;

err_ipxe:
shutdown_exit();

return 0;
return rc;
}
2 changes: 1 addition & 1 deletion src/include/usr/autoboot.h
Expand Up @@ -35,7 +35,7 @@ extern int uriboot ( struct uri *filename, struct uri *root_path, int drive,
extern struct uri *
fetch_next_server_and_filename ( struct settings *settings );
extern int netboot ( struct net_device *netdev );
extern void ipxe ( struct net_device *netdev );
extern int ipxe ( struct net_device *netdev );

extern int pxe_menu_boot ( struct net_device *netdev );

Expand Down
12 changes: 5 additions & 7 deletions src/interface/efi/efi_snp.c
Expand Up @@ -871,6 +871,7 @@ efi_snp_load_file ( EFI_LOAD_FILE_PROTOCOL *load_file,
struct efi_snp_device *snpdev =
container_of ( load_file, struct efi_snp_device, load_file );
struct net_device *netdev = snpdev->netdev;
int rc;

/* Fail unless this is a boot attempt */
if ( ! booting ) {
Expand All @@ -886,16 +887,13 @@ efi_snp_load_file ( EFI_LOAD_FILE_PROTOCOL *load_file,
efi_watchdog_start();

/* Boot from network device */
ipxe ( netdev );
if ( ( rc = ipxe ( netdev ) ) != 0 )
goto err_ipxe;

/* Stop watchdog holdoff timer */
err_ipxe:
efi_watchdog_stop();

/* Release network devices for use via SNP */
efi_snp_release();

/* Assume boot process was aborted */
return EFI_ABORTED;
return EFIRC ( rc );
}

/** Load file protocol */
Expand Down
18 changes: 11 additions & 7 deletions src/usr/autoboot.c
Expand Up @@ -542,11 +542,13 @@ static int shell_banner ( void ) {
* Main iPXE flow of execution
*
* @v netdev Network device, or NULL
* @ret rc Return status code
*/
void ipxe ( struct net_device *netdev ) {
int ipxe ( struct net_device *netdev ) {
struct feature *feature;
struct image *image;
char *scriptlet;
int rc;

/*
* Print welcome banner
Expand All @@ -570,28 +572,30 @@ void ipxe ( struct net_device *netdev ) {
/* Boot system */
if ( ( image = first_image() ) != NULL ) {
/* We have an embedded image; execute it */
image_exec ( image );
return image_exec ( image );
} else if ( shell_banner() ) {
/* User wants shell; just give them a shell */
shell();
return shell();
} else {
fetch_string_setting_copy ( NULL, &scriptlet_setting,
&scriptlet );
if ( scriptlet ) {
/* User has defined a scriptlet; execute it */
system ( scriptlet );
rc = system ( scriptlet );
free ( scriptlet );
return rc;
} else {
/* Try booting. If booting fails, offer the
* user another chance to enter the shell.
*/
if ( netdev ) {
netboot ( netdev );
rc = netboot ( netdev );
} else {
autoboot();
rc = autoboot();
}
if ( shell_banner() )
shell();
rc = shell();
return rc;
}
}
}

0 comments on commit f58ebbd

Please sign in to comment.