summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorMichael Brown2017-09-05 23:53:10 +0200
committerMichael Brown2017-09-06 00:23:22 +0200
commit4674df25ef94d089f60e9991541d6f586a474de7 (patch)
tree23884fcd7d5e0a385a93bba22eecaac0c5ae4714 /src/core
parent[downloader] Allow underlying downloads to provide detailed job progress (diff)
downloadipxe-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.c34
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 ) );