diff --git a/src/core/parseopt.c b/src/core/parseopt.c index 38b1f29f9e..514508357c 100644 --- a/src/core/parseopt.c +++ b/src/core/parseopt.c @@ -30,6 +30,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include #include +#include #include /** @file @@ -95,6 +96,27 @@ int parse_integer ( char *text, unsigned int *value ) { return 0; } +/** + * 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 * diff --git a/src/hci/commands/menu_cmd.c b/src/hci/commands/menu_cmd.c index 0ad53dbd4c..6ff30083bc 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 a042b8faa7..4959f6a002 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 #include #include +#include #include /** @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 221e873952..ee932939cc 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 #include #include -#include #include /** @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 d5636f8b01..42f7463fa8 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 881d51f3d6..8d80241dcc 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 993b027ea9..f2b3caccc1 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 108ce04ce5..e3b54c8e5e 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 4a2efc3bd0..45ad5d3947 100644 --- a/src/include/usr/pingmgmt.h +++ b/src/include/usr/pingmgmt.h @@ -11,6 +11,6 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include -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 fc1946c7a5..57e43d2dc5 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 e455938281..0db10c2193 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 ede0374571..957b4ab3df 100644 --- a/src/usr/prompt.c +++ b/src/usr/prompt.c @@ -28,28 +28,27 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include #include -#include #include /** * 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++) )