]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[monojob] Display job status message, if present
authorMichael Brown <mcb30@ipxe.org>
Tue, 5 Sep 2017 21:53:10 +0000 (22:53 +0100)
committerMichael Brown <mcb30@ipxe.org>
Tue, 5 Sep 2017 22:23:22 +0000 (23:23 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/monojob.c

index d426235d60d7a955d1a3c5cd63d3c6243ae2780b..2f066331c2160657eb641c7ccf3a773dd354b9a2 100644 (file)
@@ -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
  *
@@ -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 ) );