aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/monojob.c28
-rw-r--r--src/include/ipxe/monojob.h2
-rw-r--r--src/usr/dhcpmgmt.c4
-rw-r--r--src/usr/fcmgmt.c2
-rw-r--r--src/usr/imgmgmt.c2
-rw-r--r--src/usr/imgtrust.c2
-rw-r--r--src/usr/nslookup.c2
-rw-r--r--src/usr/pingmgmt.c2
8 files changed, 26 insertions, 18 deletions
diff --git a/src/core/monojob.c b/src/core/monojob.c
index d262f70..94ed74c 100644
--- a/src/core/monojob.c
+++ b/src/core/monojob.c
@@ -55,12 +55,12 @@ struct interface monojob = INTF_INIT ( monojob_intf_desc );
* Wait for single foreground job to complete
*
* @v string Job description to display, or NULL to be silent
+ * @v timeout Timeout period, in ticks (0=indefinite)
* @ret rc Job final status code
*/
-int monojob_wait ( const char *string ) {
+int monojob_wait ( const char *string, unsigned long timeout ) {
struct job_progress progress;
- int key;
- int rc;
+ unsigned long start;
unsigned long last_keycheck;
unsigned long last_progress;
unsigned long now;
@@ -69,11 +69,13 @@ int monojob_wait ( const char *string ) {
unsigned long total;
unsigned int percentage;
int shown_percentage = 0;
+ int key;
+ int rc;
if ( string )
printf ( "%s...", string );
monojob_rc = -EINPROGRESS;
- last_keycheck = last_progress = currticks();
+ last_keycheck = last_progress = start = currticks();
while ( monojob_rc == -EINPROGRESS ) {
/* Allow job to progress */
@@ -83,20 +85,25 @@ int monojob_wait ( const char *string ) {
/* Check for keypresses. This can be time-consuming,
* so check only once per clock tick.
*/
- if ( now != last_keycheck ) {
+ elapsed = ( now - last_keycheck );
+ if ( elapsed ) {
if ( iskey() ) {
key = getchar();
- switch ( key ) {
- case CTRL_C:
- monojob_close ( &monojob, -ECANCELED );
- break;
- default:
+ if ( key == CTRL_C ) {
+ monojob_rc = -ECANCELED;
break;
}
}
last_keycheck = now;
}
+ /* Check for timeout, if applicable */
+ elapsed = ( now - start );
+ if ( timeout && ( elapsed >= timeout ) ) {
+ monojob_rc = -ETIMEDOUT;
+ break;
+ }
+
/* Display progress, if applicable */
elapsed = ( now - last_progress );
if ( string && ( elapsed >= TICKS_PER_SEC ) ) {
@@ -118,6 +125,7 @@ int monojob_wait ( const char *string ) {
}
}
rc = monojob_rc;
+ monojob_close ( &monojob, rc );
if ( shown_percentage )
printf ( "\b\b\b\b \b\b\b\b" );
diff --git a/src/include/ipxe/monojob.h b/src/include/ipxe/monojob.h
index 3d8b31c..aedc37e 100644
--- a/src/include/ipxe/monojob.h
+++ b/src/include/ipxe/monojob.h
@@ -13,6 +13,6 @@ struct interface;
extern struct interface monojob;
-extern int monojob_wait ( const char *string );
+extern int monojob_wait ( const char *string, unsigned long timeout );
#endif /* _IPXE_MONOJOB_H */
diff --git a/src/usr/dhcpmgmt.c b/src/usr/dhcpmgmt.c
index 10d8ecf..7b8e537 100644
--- a/src/usr/dhcpmgmt.c
+++ b/src/usr/dhcpmgmt.c
@@ -52,7 +52,7 @@ int dhcp ( struct net_device *netdev ) {
printf ( "DHCP (%s %s)", netdev->name,
netdev->ll_protocol->ntoa ( netdev->ll_addr ) );
if ( ( rc = start_dhcp ( &monojob, netdev ) ) == 0 )
- rc = monojob_wait ( "" );
+ rc = monojob_wait ( "", 0 );
return rc;
}
@@ -63,7 +63,7 @@ int pxebs ( struct net_device *netdev, unsigned int pxe_type ) {
/* Perform PXE Boot Server Discovery */
printf ( "PXEBS (%s type %d)", netdev->name, pxe_type );
if ( ( rc = start_pxebs ( &monojob, netdev, pxe_type ) ) == 0 )
- rc = monojob_wait ( "" );
+ rc = monojob_wait ( "", 0 );
return rc;
}
diff --git a/src/usr/fcmgmt.c b/src/usr/fcmgmt.c
index 2657ba0..a30f37a 100644
--- a/src/usr/fcmgmt.c
+++ b/src/usr/fcmgmt.c
@@ -112,5 +112,5 @@ int fcels ( struct fc_port *port, struct fc_port_id *peer_port_id,
}
/* Wait for ELS to complete */
- return monojob_wait ( "" );
+ return monojob_wait ( "", 0 );
}
diff --git a/src/usr/imgmgmt.c b/src/usr/imgmgmt.c
index ef4e2c3..ecf9d31 100644
--- a/src/usr/imgmgmt.c
+++ b/src/usr/imgmgmt.c
@@ -72,7 +72,7 @@ int imgdownload ( struct uri *uri, struct image **image ) {
}
/* Wait for download to complete */
- if ( ( rc = monojob_wait ( uri_string_redacted ) ) != 0 )
+ if ( ( rc = monojob_wait ( uri_string_redacted, 0 ) ) != 0 )
goto err_monojob_wait;
/* Register image */
diff --git a/src/usr/imgtrust.c b/src/usr/imgtrust.c
index afb4152..c49eb7f 100644
--- a/src/usr/imgtrust.c
+++ b/src/usr/imgtrust.c
@@ -77,7 +77,7 @@ int imgverify ( struct image *image, struct image *signature,
list_for_each_entry ( info, &sig->info, list ) {
if ( ( rc = create_validator ( &monojob, info->chain ) ) != 0 )
goto err_create_validator;
- if ( ( rc = monojob_wait ( NULL ) ) != 0 )
+ if ( ( rc = monojob_wait ( NULL, 0 ) ) != 0 )
goto err_validator_wait;
}
diff --git a/src/usr/nslookup.c b/src/usr/nslookup.c
index cb6d8d2..b691962 100644
--- a/src/usr/nslookup.c
+++ b/src/usr/nslookup.c
@@ -186,7 +186,7 @@ int nslookup ( const char *name, const char *setting_name ) {
/* Perform name resolution */
if ( ( rc = resolv_setting ( &monojob, name, setting_name ) ) == 0 )
- rc = monojob_wait ( NULL );
+ rc = monojob_wait ( NULL, 0 );
if ( rc != 0 ) {
printf ( "Could not resolve %s: %s\n", name, strerror ( rc ) );
return rc;
diff --git a/src/usr/pingmgmt.c b/src/usr/pingmgmt.c
index 0db10c2..2d4db49 100644
--- a/src/usr/pingmgmt.c
+++ b/src/usr/pingmgmt.c
@@ -71,7 +71,7 @@ int ping ( const char *hostname, unsigned long timeout, size_t len ) {
}
/* Wait for ping to complete */
- if ( ( rc = monojob_wait ( NULL ) ) != 0 ) {
+ if ( ( rc = monojob_wait ( NULL, 0 ) ) != 0 ) {
printf ( "Finished: %s\n", strerror ( rc ) );
return rc;
}