]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[parseopt] Add parse_timeout()
authorMichael Brown <mcb30@ipxe.org>
Fri, 1 Nov 2013 02:22:12 +0000 (02:22 +0000)
committerMichael Brown <mcb30@ipxe.org>
Fri, 1 Nov 2013 02:26:19 +0000 (02:26 +0000)
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>
12 files changed:
src/core/parseopt.c
src/hci/commands/menu_cmd.c
src/hci/commands/ping_cmd.c
src/hci/commands/sync_cmd.c
src/hci/tui/menu_ui.c
src/image/script.c
src/include/ipxe/menu.h
src/include/ipxe/parseopt.h
src/include/usr/pingmgmt.h
src/include/usr/prompt.h
src/usr/pingmgmt.c
src/usr/prompt.c

index 38b1f29f9ec6a14ea202a661a7550f71d2e9ba00..514508357c61b928e675ada77ec9714bf631e5a9 100644 (file)
@@ -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
@@ -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
  *
index 0ad53dbd4c843f5b0f0e0b637577d21182b89e93..6ff30083bc42c09e449acce6e1ea8460d39c83c9 100644 (file)
@@ -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 ),
 };
index a042b8faa789df01a965522e7af6d4bd7e29abb2..4959f6a002c67a518daa6f40cbceba44ad3d7e8a 100644 (file)
@@ -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 */
index 221e87395278885fc1ec9acf0fcb1e5665799d1c..ee932939cc14813e639f2e43bdfcb7814ce7da5c 100644 (file)
@@ -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;
        }
index d5636f8b018e03101f969dad4820213cf27fdbda..42f7463fa8dd93340319d8faa02ec317858f4fe5 100644 (file)
@@ -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 )
index 881d51f3d697eb98befc18a9d5fb5c99240fdd3f..8d80241dccb480027d89166a17ac33b713dec158 100644 (file)
@@ -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 */
index 993b027ea997eb1971481a466211805f22d0683d..f2b3caccc1158b69d33b554940f81975b13c4dac 100644 (file)
@@ -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 */
index 108ce04ce527b577fc1a918f006e235ceac610b3..e3b54c8e5e92d88bac080b6583fc44dd7f33b251 100644 (file)
@@ -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 );
index 4a2efc3bd0ac168920827f32a40a73ac93831204..45ad5d3947e5e595bfecf44b1b65fe8ff1fcfac9 100644 (file)
@@ -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 */
index fc1946c7a5cdf197c0527ecf71044eb7863b85f4..57e43d2dc57106124fd1e10d894fb885ce970184 100644 (file)
@@ -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 */
index e455938281cc261a2907ce2b479956e2c1195736..0db10c219307d74b3ca25f811a1737e9ed445592 100644 (file)
@@ -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;
index ede037457185f0039d450bdb41f54cf3532eb325..957b4ab3df0939d9a43a05eed554537948b569f6 100644 (file)
@@ -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++) )