iPXE
Functions | Variables
monojob.c File Reference

Single foreground job. More...

#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <ipxe/process.h>
#include <ipxe/console.h>
#include <ipxe/keys.h>
#include <ipxe/job.h>
#include <ipxe/monojob.h>
#include <ipxe/timer.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
static void monojob_close (struct interface *intf, int rc)
static void monojob_clear (size_t len)
 Clear previously displayed message.
int monojob_wait (const char *string, unsigned long timeout)
 Wait for single foreground job to complete.

Variables

static int monojob_rc
static struct interface_operation monojob_intf_op []
static struct interface_descriptor monojob_intf_desc
struct interface monojob = INTF_INIT ( monojob_intf_desc )

Detailed Description

Single foreground job.

Definition in file monojob.c.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
static void monojob_close ( struct interface intf,
int  rc 
) [static]

Definition at line 44 of file monojob.c.

References intf_restart(), monojob_rc, and rc.

Referenced by monojob_wait().

                                                             {
        monojob_rc = rc;
        intf_restart ( intf, rc );
}
static void monojob_clear ( size_t  len) [static]

Clear previously displayed message.

Parameters:
lenLength of previously displayed message

Definition at line 63 of file monojob.c.

References len, and putchar().

Referenced by monojob_wait().

                                         {
        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' );
}
int monojob_wait ( const char *  string,
unsigned long  timeout 
)

Wait for single foreground job to complete.

Parameters:
stringJob description to display, or NULL to be silent
timeoutTimeout period, in ticks (0=indefinite)
Return values:
rcJob final status code

Definition at line 81 of file monojob.c.

References job_progress::completed, CTRL_C, currticks(), ECANCELED, EINPROGRESS, ETIMEDOUT, getchar(), iskey(), job_progress(), key, job_progress::message, monojob_clear(), monojob_close(), monojob_rc, printf(), rc, step(), strerror(), TICKS_PER_SEC, and job_progress::total.

Referenced by fcels(), ifpoller_wait(), imgdownload(), imgverify(), nslookup(), ntp(), ping(), pxebs(), and sync().

                                                               {
        struct job_progress progress;
        unsigned long last_check;
        unsigned long last_progress;
        unsigned long last_display;
        unsigned long now;
        unsigned long elapsed;
        unsigned long completed = 0;
        unsigned long scaled_completed;
        unsigned long scaled_total;
        unsigned int percentage;
        size_t clear_len = 0;
        int ongoing_rc;
        int key;
        int rc;

        if ( string )
                printf ( "%s...", string );
        monojob_rc = -EINPROGRESS;
        last_check = last_progress = last_display = currticks();
        while ( monojob_rc == -EINPROGRESS ) {

                /* Allow job to progress */
                step();
                now = currticks();

                /* Continue until a timer tick occurs (to minimise
                 * time wasted checking for progress and keypresses).
                 */
                elapsed = ( now - last_check );
                if ( ! elapsed )
                        continue;
                last_check = now;

                /* Check for keypresses */
                if ( iskey() ) {
                        key = getchar();
                        if ( key == CTRL_C ) {
                                monojob_rc = -ECANCELED;
                                break;
                        }
                }

                /* Monitor progress */
                ongoing_rc = job_progress ( &monojob, &progress );

                /* Reset timeout if progress has been made */
                if ( completed != progress.completed )
                        last_progress = now;
                completed = progress.completed;

                /* Check for timeout, if applicable */
                elapsed = ( now - last_progress );
                if ( timeout && ( elapsed >= timeout ) ) {
                        monojob_rc = ( ongoing_rc ? ongoing_rc : -ETIMEDOUT );
                        break;
                }

                /* Display progress, if applicable */
                elapsed = ( now - last_display );
                if ( string && ( elapsed >= TICKS_PER_SEC ) ) {
                        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 );
                                clear_len = printf ( "%3d%%", percentage );
                        } else {
                                printf ( "." );
                                clear_len = 0;
                        }
                        if ( progress.message[0] ) {
                                clear_len += printf ( " [%s]",
                                                      progress.message );
                        }
                        last_display = now;
                }
        }
        rc = monojob_rc;
        monojob_close ( &monojob, rc );

        monojob_clear ( clear_len );
        if ( string ) {
                if ( rc ) {
                        printf ( " %s\n", strerror ( rc ) );
                } else {
                        printf ( " ok\n" );
                }
        }

        return rc;
}

Variable Documentation

int monojob_rc [static]

Definition at line 42 of file monojob.c.

Referenced by monojob_close(), and monojob_wait().

Initial value:

Definition at line 49 of file monojob.c.

Initial value:

Definition at line 53 of file monojob.c.

Definition at line 56 of file monojob.c.

Referenced by fcels(), ifpoller_wait(), imgdownload(), imgverify(), nslookup(), ntp(), ping(), pxebs(), and sync().