Skip to content

Commit

Permalink
[monojob] Display job status message, if present
Browse files Browse the repository at this point in the history
Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Sep 5, 2017
1 parent a258b08 commit 4674df2
Showing 1 changed file with 25 additions and 9 deletions.
34 changes: 25 additions & 9 deletions src/core/monojob.c
Expand Up @@ -55,6 +55,22 @@ static struct interface_descriptor monojob_intf_desc =

struct interface monojob = INTF_INIT ( monojob_intf_desc );

/**
* Clear previously displayed message
*
* @v len Length of previously displayed message
*/
static void monojob_clear ( size_t len ) {
unsigned int i;

for ( i = 0 ; i < len ; i++ )
putchar ( '\b' );
for ( i = 0 ; i < len ; i++ )
putchar ( ' ' );
for ( i = 0 ; i < len ; i++ )
putchar ( '\b' );
}

/**
* Wait for single foreground job to complete
*
Expand All @@ -73,7 +89,7 @@ int monojob_wait ( const char *string, unsigned long timeout ) {
unsigned long scaled_completed;
unsigned long scaled_total;
unsigned int percentage;
int shown_percentage = 0;
size_t clear_len = 0;
int ongoing_rc;
int key;
int rc;
Expand Down Expand Up @@ -123,29 +139,29 @@ int monojob_wait ( const char *string, unsigned long timeout ) {
/* Display progress, if applicable */
elapsed = ( now - last_display );
if ( string && ( elapsed >= TICKS_PER_SEC ) ) {
if ( shown_percentage )
printf ( "\b\b\b\b \b\b\b\b" );
monojob_clear ( clear_len );
/* Normalise progress figures to avoid overflow */
scaled_completed = ( progress.completed / 128 );
scaled_total = ( progress.total / 128 );
if ( scaled_total ) {
percentage = ( ( 100 * scaled_completed ) /
scaled_total );
printf ( "%3d%%", percentage );
shown_percentage = 1;
clear_len = printf ( "%3d%%", percentage );
} else {
printf ( "." );
shown_percentage = 0;
clear_len = 0;
}
if ( progress.message[0] ) {
clear_len += printf ( " [%s]",
progress.message );
}
last_display = now;
}
}
rc = monojob_rc;
monojob_close ( &monojob, rc );

if ( shown_percentage )
printf ( "\b\b\b\b \b\b\b\b" );

monojob_clear ( clear_len );
if ( string ) {
if ( rc ) {
printf ( " %s\n", strerror ( rc ) );
Expand Down

0 comments on commit 4674df2

Please sign in to comment.