* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
+#include <string.h>
+#include <stdio.h>
#include <errno.h>
#include <gpxe/process.h>
#include <console.h>
/**
* Wait for single foreground job to complete
*
+ * @v string Job description to display
* @ret rc Job final status code
*/
-int monojob_wait ( void ) {
+int monojob_wait ( const char *string ) {
int key;
+ int rc;
+ printf ( "%s... ", string );
monojob_rc = -EINPROGRESS;
while ( monojob_rc == -EINPROGRESS ) {
step();
switch ( key ) {
case CTRL_C:
job_kill ( &monojob );
- return -ECANCELED;
- break;
+ rc = -ECANCELED;
+ goto done;
default:
break;
}
}
}
- return monojob_rc;
+ rc = monojob_rc;
+
+done:
+ if ( rc ) {
+ printf ( "%s\n", strerror ( rc ) );
+ } else {
+ printf ( "ok\n" );
+ }
+ return rc;
}
struct job_interface;
extern struct job_interface monojob;
-extern int monojob_wait ( void );
+extern int monojob_wait ( const char *string );
#endif /* _GPXE_MONOJOB_H */
return -ENOMEM;
}
if ( ( rc = imgfetch ( image, filename,
- register_and_autoexec_image ) ) != 0 ) {
+ register_and_autoload_image ) ) != 0 ) {
+ printf ( "Could not load %s: %s\n",
+ filename, strerror ( rc ) );
+ goto done;
+ }
+ if ( ( rc = imgexec ( image ) ) != 0 ) {
printf ( "Could not boot %s: %s\n",
filename, strerror ( rc ) );
- image_put ( image );
- return rc;
+ goto done;
}
+ done:
image_put ( image );
- return 0;
+ return rc;
}
/**
}
/* Perform DHCP */
- printf ( "DHCP (%s %s)...", netdev->name, netdev_hwaddr ( netdev ) );
+ printf ( "DHCP (%s %s)", netdev->name, netdev_hwaddr ( netdev ) );
if ( ( rc = start_dhcp ( &monojob, netdev, dhcp_success ) ) == 0 )
- rc = monojob_wait();
-
- if ( rc == 0 ) {
- printf ( "done\n" );
- } else {
- printf ( "failed (%s)\n", strerror ( rc ) );
- }
+ rc = monojob_wait ( "" );
return rc;
}
if ( ( rc = create_downloader ( &monojob, image, image_register,
LOCATION_URI, uri ) ) == 0 )
- rc = monojob_wait();
+ rc = monojob_wait ( uri_string );
uri_put ( uri );
return rc;