summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2013-11-01 03:22:12 +0100
committerMichael Brown2013-11-01 03:26:19 +0100
commit5e1fa5cd4090f229a40903f13abf328e86271717 (patch)
tree77a6302aeeb86f6c86fe95fb757a952a4ef7490e
parent[ipv6] Add ndp_tx_router_solicitation() to send router solicitations (diff)
downloadipxe-5e1fa5cd4090f229a40903f13abf328e86271717.tar.gz
ipxe-5e1fa5cd4090f229a40903f13abf328e86271717.tar.xz
ipxe-5e1fa5cd4090f229a40903f13abf328e86271717.zip
[parseopt] Add parse_timeout()
Parsing a timeout value (specified in milliseconds) into an internal timeout value measured in timer ticks is a common operation. Provide a parse_timeout() value to carry out this conversion automatically. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/core/parseopt.c22
-rw-r--r--src/hci/commands/menu_cmd.c4
-rw-r--r--src/hci/commands/ping_cmd.c7
-rw-r--r--src/hci/commands/sync_cmd.c9
-rw-r--r--src/hci/tui/menu_ui.c6
-rw-r--r--src/image/script.c4
-rw-r--r--src/include/ipxe/menu.h2
-rw-r--r--src/include/ipxe/parseopt.h1
-rw-r--r--src/include/usr/pingmgmt.h2
-rw-r--r--src/include/usr/prompt.h2
-rw-r--r--src/usr/pingmgmt.c7
-rw-r--r--src/usr/prompt.c7
12 files changed, 46 insertions, 27 deletions
diff --git a/src/core/parseopt.c b/src/core/parseopt.c
index 38b1f29f..51450835 100644
--- a/src/core/parseopt.c
+++ b/src/core/parseopt.c
@@ -30,6 +30,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/menu.h>
#include <ipxe/settings.h>
#include <ipxe/params.h>
+#include <ipxe/timer.h>
#include <ipxe/parseopt.h>
/** @file
@@ -96,6 +97,27 @@ int parse_integer ( char *text, unsigned int *value ) {
}
/**
+ * Parse timeout value (in ms)
+ *
+ * @v text Text
+ * @ret value Integer value
+ * @ret rc Return status code
+ */
+int parse_timeout ( char *text, unsigned long *value ) {
+ unsigned int value_ms;
+ int rc;
+
+ /* Parse raw integer value */
+ if ( ( rc = parse_integer ( text, &value_ms ) ) != 0 )
+ return rc;
+
+ /* Convert to a number of timer ticks */
+ *value = ( ( value_ms * TICKS_PER_SEC ) / 1000 );
+
+ return 0;
+}
+
+/**
* Parse network device name
*
* @v text Text
diff --git a/src/hci/commands/menu_cmd.c b/src/hci/commands/menu_cmd.c
index 0ad53dbd..6ff30083 100644
--- a/src/hci/commands/menu_cmd.c
+++ b/src/hci/commands/menu_cmd.c
@@ -194,7 +194,7 @@ struct choose_options {
/** Menu name */
char *menu;
/** Timeout */
- unsigned int timeout;
+ unsigned long timeout;
/** Default selection */
char *select;
/** Keep menu */
@@ -208,7 +208,7 @@ static struct option_descriptor choose_opts[] = {
OPTION_DESC ( "default", 'd', required_argument,
struct choose_options, select, parse_string ),
OPTION_DESC ( "timeout", 't', required_argument,
- struct choose_options, timeout, parse_integer ),
+ struct choose_options, timeout, parse_timeout ),
OPTION_DESC ( "keep", 'k', no_argument,
struct choose_options, keep, parse_flag ),
};
diff --git a/src/hci/commands/ping_cmd.c b/src/hci/commands/ping_cmd.c
index a042b8fa..4959f6a0 100644
--- a/src/hci/commands/ping_cmd.c
+++ b/src/hci/commands/ping_cmd.c
@@ -27,6 +27,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <getopt.h>
#include <ipxe/command.h>
#include <ipxe/parseopt.h>
+#include <ipxe/timer.h>
#include <usr/pingmgmt.h>
/** @file
@@ -39,14 +40,14 @@ FILE_LICENCE ( GPL2_OR_LATER );
#define PING_DEFAULT_SIZE 64
/** Default timeout */
-#define PING_DEFAULT_TIMEOUT 1000
+#define PING_DEFAULT_TIMEOUT TICKS_PER_SEC
/** "ping" options */
struct ping_options {
/** Payload length */
unsigned int size;
/** Timeout (in ms) */
- unsigned int timeout;
+ unsigned long timeout;
};
/** "ping" option list */
@@ -54,7 +55,7 @@ static struct option_descriptor ping_opts[] = {
OPTION_DESC ( "size", 's', required_argument,
struct ping_options, size, parse_integer ),
OPTION_DESC ( "timeout", 't', required_argument,
- struct ping_options, timeout, parse_integer ),
+ struct ping_options, timeout, parse_timeout ),
};
/** "ping" command descriptor */
diff --git a/src/hci/commands/sync_cmd.c b/src/hci/commands/sync_cmd.c
index 221e8739..ee932939 100644
--- a/src/hci/commands/sync_cmd.c
+++ b/src/hci/commands/sync_cmd.c
@@ -24,7 +24,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <getopt.h>
#include <ipxe/command.h>
#include <ipxe/parseopt.h>
-#include <ipxe/timer.h>
#include <ipxe/pending.h>
/** @file
@@ -36,13 +35,13 @@ FILE_LICENCE ( GPL2_OR_LATER );
/** "sync" options */
struct sync_options {
/** Timeout */
- unsigned int timeout;
+ unsigned long timeout;
};
/** "sync" option list */
static struct option_descriptor sync_opts[] = {
OPTION_DESC ( "timeout", 't', required_argument,
- struct sync_options, timeout, parse_integer ),
+ struct sync_options, timeout, parse_timeout ),
};
/** "sync" command descriptor */
@@ -59,7 +58,6 @@ static struct command_descriptor sync_cmd =
*/
static int sync_exec ( int argc, char **argv ) {
struct sync_options opts;
- unsigned long timeout;
int rc;
/* Parse options */
@@ -67,8 +65,7 @@ static int sync_exec ( int argc, char **argv ) {
return rc;
/* Wait for pending operations to complete */
- timeout = ( ( opts.timeout * TICKS_PER_SEC ) / 1000 );
- if ( ( rc = pending_wait ( timeout ) ) != 0 ) {
+ if ( ( rc = pending_wait ( opts.timeout ) ) != 0 ) {
printf ( "Operations did not complete: %s\n", strerror ( rc ) );
return rc;
}
diff --git a/src/hci/tui/menu_ui.c b/src/hci/tui/menu_ui.c
index d5636f8b..42f7463f 100644
--- a/src/hci/tui/menu_ui.c
+++ b/src/hci/tui/menu_ui.c
@@ -303,11 +303,11 @@ static int menu_loop ( struct menu_ui *ui, struct menu_item **selected ) {
* Show menu
*
* @v menu Menu
- * @v wait_ms Time to wait, in milliseconds (0=indefinite)
+ * @v timeout Timeout period, in ticks (0=indefinite)
* @ret selected Selected item
* @ret rc Return status code
*/
-int show_menu ( struct menu *menu, unsigned int timeout_ms,
+int show_menu ( struct menu *menu, unsigned long timeout,
const char *select, struct menu_item **selected ) {
struct menu_item *item;
struct menu_ui ui;
@@ -318,7 +318,7 @@ int show_menu ( struct menu *menu, unsigned int timeout_ms,
/* Initialise UI */
memset ( &ui, 0, sizeof ( ui ) );
ui.menu = menu;
- ui.timeout = ( ( timeout_ms * TICKS_PER_SEC ) / 1000 );
+ ui.timeout = timeout;
list_for_each_entry ( item, &menu->items, list ) {
if ( item->label ) {
if ( ! labelled_count )
diff --git a/src/image/script.c b/src/image/script.c
index 881d51f3..8d80241d 100644
--- a/src/image/script.c
+++ b/src/image/script.c
@@ -361,7 +361,7 @@ struct prompt_options {
/** Key to wait for */
unsigned int key;
/** Timeout */
- unsigned int timeout;
+ unsigned long timeout;
};
/** "prompt" option list */
@@ -369,7 +369,7 @@ static struct option_descriptor prompt_opts[] = {
OPTION_DESC ( "key", 'k', required_argument,
struct prompt_options, key, parse_key ),
OPTION_DESC ( "timeout", 't', required_argument,
- struct prompt_options, timeout, parse_integer ),
+ struct prompt_options, timeout, parse_timeout ),
};
/** "prompt" command descriptor */
diff --git a/src/include/ipxe/menu.h b/src/include/ipxe/menu.h
index 993b027e..f2b3cacc 100644
--- a/src/include/ipxe/menu.h
+++ b/src/include/ipxe/menu.h
@@ -43,7 +43,7 @@ extern struct menu_item * add_menu_item ( struct menu *menu, const char *label,
int is_default );
extern void destroy_menu ( struct menu *menu );
extern struct menu * find_menu ( const char *name );
-extern int show_menu ( struct menu *menu, unsigned int timeout_ms,
+extern int show_menu ( struct menu *menu, unsigned long timeout,
const char *select, struct menu_item **selected );
#endif /* _IPXE_MENU_H */
diff --git a/src/include/ipxe/parseopt.h b/src/include/ipxe/parseopt.h
index 108ce04c..e3b54c8e 100644
--- a/src/include/ipxe/parseopt.h
+++ b/src/include/ipxe/parseopt.h
@@ -126,6 +126,7 @@ struct named_setting {
extern int parse_string ( char *text, char **value );
extern int parse_integer ( char *text, unsigned int *value );
+extern int parse_timeout ( char *text, unsigned long *value );
extern int parse_netdev ( char *text, struct net_device **netdev );
extern int parse_menu ( char *text, struct menu **menu );
extern int parse_flag ( char *text __unused, int *flag );
diff --git a/src/include/usr/pingmgmt.h b/src/include/usr/pingmgmt.h
index 4a2efc3b..45ad5d39 100644
--- a/src/include/usr/pingmgmt.h
+++ b/src/include/usr/pingmgmt.h
@@ -11,6 +11,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <stdint.h>
-extern int ping ( const char *hostname, unsigned long timeout_ms, size_t len );
+extern int ping ( const char *hostname, unsigned long timeout, size_t len );
#endif /* _USR_PINGMGMT_H */
diff --git a/src/include/usr/prompt.h b/src/include/usr/prompt.h
index fc1946c7..57e43d2d 100644
--- a/src/include/usr/prompt.h
+++ b/src/include/usr/prompt.h
@@ -9,6 +9,6 @@
FILE_LICENCE ( GPL2_OR_LATER );
-extern int prompt ( const char *text, unsigned int wait_ms, int key );
+extern int prompt ( const char *text, unsigned long timeout, int key );
#endif /* _USR_PROMPT_H */
diff --git a/src/usr/pingmgmt.c b/src/usr/pingmgmt.c
index e4559382..0db10c21 100644
--- a/src/usr/pingmgmt.c
+++ b/src/usr/pingmgmt.c
@@ -56,16 +56,15 @@ static void ping_callback ( struct sockaddr *peer, unsigned int sequence,
* Ping a host
*
* @v hostname Hostname
- * @v timeout_ms Timeout between pings, in ms
+ * @v timeout Timeout between pings, in ticks
* @v len Payload length
* @ret rc Return status code
*/
-int ping ( const char *hostname, unsigned long timeout_ms, size_t len ) {
+int ping ( const char *hostname, unsigned long timeout, size_t len ) {
int rc;
/* Create pinger */
- if ( ( rc = create_pinger ( &monojob, hostname,
- ( ( timeout_ms * TICKS_PER_SEC ) / 1000 ),
+ if ( ( rc = create_pinger ( &monojob, hostname, timeout,
len, ping_callback ) ) != 0 ) {
printf ( "Could not start ping: %s\n", strerror ( rc ) );
return rc;
diff --git a/src/usr/prompt.c b/src/usr/prompt.c
index ede03745..957b4ab3 100644
--- a/src/usr/prompt.c
+++ b/src/usr/prompt.c
@@ -28,28 +28,27 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <errno.h>
#include <stdio.h>
#include <ipxe/console.h>
-#include <ipxe/timer.h>
#include <usr/prompt.h>
/**
* Prompt for keypress
*
* @v text Prompt string
- * @v wait_ms Time to wait, in milliseconds (0=indefinite)
+ * @v timeout Timeout period, in ticks (0=indefinite)
* @v key Key to wait for (0=any key)
* @ret rc Return status code
*
* Returns success if the specified key was pressed within the
* specified timeout period.
*/
-int prompt ( const char *text, unsigned int wait_ms, int key ) {
+int prompt ( const char *text, unsigned long timeout, int key ) {
int key_pressed;
/* Display prompt */
printf ( "%s", text );
/* Wait for key */
- key_pressed = getkey ( ( wait_ms * TICKS_PER_SEC ) / 1000 );
+ key_pressed = getkey ( timeout );
/* Clear the prompt line */
while ( *(text++) )