Files
ipxe/src/core/monojob.c
Michael Brown 702e0be44e [ui] Add progress dots while waiting on any foreground job
Print one dot per second while waiting in monojob.c (e.g. for DHCP,
for file downloads, etc.), to inform user that the system has not
locked up.

Patch contributed by Andrew Schran <aschran@google.com>, minor
modification by me.
2008-07-24 20:08:31 +01:00

99 lines
2.2 KiB
C

/*
* Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <gpxe/process.h>
#include <console.h>
#include <gpxe/keys.h>
#include <gpxe/job.h>
#include <gpxe/monojob.h>
#include <gpxe/timer.h>
/** @file
*
* Single foreground job
*
*/
static int monojob_rc;
static void monojob_done ( struct job_interface *job __unused, int rc ) {
monojob_rc = rc;
}
/** Single foreground job operations */
static struct job_interface_operations monojob_operations = {
.done = monojob_done,
.kill = ignore_job_kill,
.progress = ignore_job_progress,
};
/** Single foreground job */
struct job_interface monojob = {
.intf = {
.dest = &null_job.intf,
.refcnt = NULL,
},
.op = &monojob_operations,
};
/**
* Wait for single foreground job to complete
*
* @v string Job description to display
* @ret rc Job final status code
*/
int monojob_wait ( const char *string ) {
int key;
int rc;
tick_t last_progress_dot;
printf ( "%s.", string );
monojob_rc = -EINPROGRESS;
last_progress_dot = currticks();
while ( monojob_rc == -EINPROGRESS ) {
step();
if ( iskey() ) {
key = getchar();
switch ( key ) {
case CTRL_C:
job_kill ( &monojob );
rc = -ECANCELED;
goto done;
default:
break;
}
}
if ( ( currticks() - last_progress_dot ) > TICKS_PER_SEC ) {
printf ( "." );
last_progress_dot = currticks();
}
}
rc = monojob_rc;
done:
if ( rc ) {
printf ( " %s\n", strerror ( rc ) );
} else {
printf ( " ok\n" );
}
return rc;
}