diff options
author | Michael Brown | 2017-09-05 23:53:10 +0200 |
---|---|---|
committer | Michael Brown | 2017-09-06 00:23:22 +0200 |
commit | 4674df25ef94d089f60e9991541d6f586a474de7 (patch) | |
tree | 23884fcd7d5e0a385a93bba22eecaac0c5ae4714 /src/core | |
parent | [downloader] Allow underlying downloads to provide detailed job progress (diff) | |
download | ipxe-4674df25ef94d089f60e9991541d6f586a474de7.tar.gz ipxe-4674df25ef94d089f60e9991541d6f586a474de7.tar.xz ipxe-4674df25ef94d089f60e9991541d6f586a474de7.zip |
[monojob] Display job status message, if present
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/monojob.c | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/src/core/monojob.c b/src/core/monojob.c index d426235d..2f066331 100644 --- a/src/core/monojob.c +++ b/src/core/monojob.c @@ -56,6 +56,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 * * @v string Job description to display, or NULL to be silent @@ -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; @@ -123,19 +139,21 @@ 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; } @@ -143,9 +161,7 @@ int monojob_wait ( const char *string, unsigned long timeout ) { 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 ) ); |