diff options
author | Michael Brown <mcb30@ipxe.org> | 2013-11-01 01:55:13 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2013-11-01 16:26:02 +0000 |
commit | d1be9f4acc9d4367fb6dc793495f0cc819b5a514 (patch) | |
tree | 6865cbc8e41c0b052aa704f0a41b7eaecd0f2f0a | |
parent | 5674a3c087bf1bde65b61b6b0ca26035dd47baa3 (diff) | |
download | ipxe-d1be9f4acc9d4367fb6dc793495f0cc819b5a514.tar.gz |
[monojob] Add timeout parameter to monojob_wait()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/core/monojob.c | 28 | ||||
-rw-r--r-- | src/include/ipxe/monojob.h | 2 | ||||
-rw-r--r-- | src/usr/dhcpmgmt.c | 4 | ||||
-rw-r--r-- | src/usr/fcmgmt.c | 2 | ||||
-rw-r--r-- | src/usr/imgmgmt.c | 2 | ||||
-rw-r--r-- | src/usr/imgtrust.c | 2 | ||||
-rw-r--r-- | src/usr/nslookup.c | 2 | ||||
-rw-r--r-- | src/usr/pingmgmt.c | 2 |
8 files changed, 26 insertions, 18 deletions
diff --git a/src/core/monojob.c b/src/core/monojob.c index d262f70b2..94ed74c0f 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 3d8b31c0e..aedc37eca 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 10d8ecfa5..7b8e53701 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 2657ba0cf..a30f37a71 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 ef4e2c366..ecf9d31d4 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 afb41529f..c49eb7f27 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 cb6d8d2b1..b691962ef 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 0db10c219..2d4db491f 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; } |