* Wait for single foreground job to complete
*
* @v string Job description to display, or NULL to be silent
+ * @v timeout Timeout period, in ticks (0=indefinite)
* @ret rc Job final status code
*/
-int monojob_wait ( const char *string ) {
+int monojob_wait ( const char *string, unsigned long timeout ) {
struct job_progress progress;
- int key;
- int rc;
+ unsigned long start;
unsigned long last_keycheck;
unsigned long last_progress;
unsigned long now;
unsigned long total;
unsigned int percentage;
int shown_percentage = 0;
+ int key;
+ int rc;
if ( string )
printf ( "%s...", string );
monojob_rc = -EINPROGRESS;
- last_keycheck = last_progress = currticks();
+ last_keycheck = last_progress = start = currticks();
while ( monojob_rc == -EINPROGRESS ) {
/* Allow job to progress */
/* Check for keypresses. This can be time-consuming,
* so check only once per clock tick.
*/
- if ( now != last_keycheck ) {
+ elapsed = ( now - last_keycheck );
+ if ( elapsed ) {
if ( iskey() ) {
key = getchar();
- switch ( key ) {
- case CTRL_C:
- monojob_close ( &monojob, -ECANCELED );
- break;
- default:
+ if ( key == CTRL_C ) {
+ monojob_rc = -ECANCELED;
break;
}
}
last_keycheck = now;
}
+ /* Check for timeout, if applicable */
+ elapsed = ( now - start );
+ if ( timeout && ( elapsed >= timeout ) ) {
+ monojob_rc = -ETIMEDOUT;
+ break;
+ }
+
/* Display progress, if applicable */
elapsed = ( now - last_progress );
if ( string && ( elapsed >= TICKS_PER_SEC ) ) {
}
}
rc = monojob_rc;
+ monojob_close ( &monojob, rc );
if ( shown_percentage )
printf ( "\b\b\b\b \b\b\b\b" );
extern struct interface monojob;
-extern int monojob_wait ( const char *string );
+extern int monojob_wait ( const char *string, unsigned long timeout );
#endif /* _IPXE_MONOJOB_H */
printf ( "DHCP (%s %s)", netdev->name,
netdev->ll_protocol->ntoa ( netdev->ll_addr ) );
if ( ( rc = start_dhcp ( &monojob, netdev ) ) == 0 )
- rc = monojob_wait ( "" );
+ rc = monojob_wait ( "", 0 );
return rc;
}
/* Perform PXE Boot Server Discovery */
printf ( "PXEBS (%s type %d)", netdev->name, pxe_type );
if ( ( rc = start_pxebs ( &monojob, netdev, pxe_type ) ) == 0 )
- rc = monojob_wait ( "" );
+ rc = monojob_wait ( "", 0 );
return rc;
}
}
/* Wait for ELS to complete */
- return monojob_wait ( "" );
+ return monojob_wait ( "", 0 );
}
}
/* Wait for download to complete */
- if ( ( rc = monojob_wait ( uri_string_redacted ) ) != 0 )
+ if ( ( rc = monojob_wait ( uri_string_redacted, 0 ) ) != 0 )
goto err_monojob_wait;
/* Register image */
list_for_each_entry ( info, &sig->info, list ) {
if ( ( rc = create_validator ( &monojob, info->chain ) ) != 0 )
goto err_create_validator;
- if ( ( rc = monojob_wait ( NULL ) ) != 0 )
+ if ( ( rc = monojob_wait ( NULL, 0 ) ) != 0 )
goto err_validator_wait;
}
/* Perform name resolution */
if ( ( rc = resolv_setting ( &monojob, name, setting_name ) ) == 0 )
- rc = monojob_wait ( NULL );
+ rc = monojob_wait ( NULL, 0 );
if ( rc != 0 ) {
printf ( "Could not resolve %s: %s\n", name, strerror ( rc ) );
return rc;
}
/* Wait for ping to complete */
- if ( ( rc = monojob_wait ( NULL ) ) != 0 ) {
+ if ( ( rc = monojob_wait ( NULL, 0 ) ) != 0 ) {
printf ( "Finished: %s\n", strerror ( rc ) );
return rc;
}