]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[readline] Allow readline_history() to return a meaningful status
authorMichael Brown <mcb30@ipxe.org>
Thu, 25 Oct 2012 06:21:49 +0000 (23:21 -0700)
committerMichael Brown <mcb30@ipxe.org>
Thu, 25 Oct 2012 06:24:43 +0000 (23:24 -0700)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/hci/commands/nvo_cmd.c
src/hci/readline.c
src/hci/shell.c
src/include/ipxe/errfile.h
src/include/readline/readline.h

index b3775d098d7f43d3a11c2ed2fa0c35b7ac84cd7a..f255bbf5742bfc2d0b23b21b2194ee5e22c2a844 100644 (file)
@@ -213,15 +213,19 @@ static int read_value ( const char *name, char **args __unused, char **value ) {
 
        /* Read existing value */
        if ( ( rc = fetchf_named_setting_copy ( name, &existing ) ) < 0 )
-               return rc;
+               goto err_existing;
 
        /* Read new value */
-       *value = readline_history ( NULL, existing, NULL );
+       if ( ( rc = readline_history ( NULL, existing, NULL, value ) ) != 0 )
+               goto err_new;
 
-       /* Free existing value */
-       free ( existing );
+       /* Success */
+       rc = 0;
 
-       return 0;
+ err_new:
+       free ( existing );
+ err_existing:
+       return rc;
 }
 
 /**
index a199fb0e183d4c4b17361f085f483849a4e3f3f8..d67980b2cbef68534cd0858656dd59bb859bc4b8 100644 (file)
@@ -22,6 +22,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
+#include <errno.h>
 #include <ipxe/console.h>
 #include <ipxe/keys.h>
 #include <ipxe/editstring.h>
@@ -244,18 +245,22 @@ void history_free ( struct readline_history *history ) {
  * @v prefill          Prefill string, or NULL for no prefill
  * @v history          History buffer, or NULL for no history
  * @ret line           Line read from console (excluding terminating newline)
+ * @ret rc             Return status code
  *
  * The returned line is allocated with malloc(); the caller must
  * eventually call free() to release the storage.
  */
-char * readline_history ( const char *prompt, const char *prefill,
-                         struct readline_history *history ) {
+int readline_history ( const char *prompt, const char *prefill,
+                      struct readline_history *history, char **line ) {
        char buf[READLINE_MAX];
        struct edit_string string;
        int key;
        int move_by;
        const char *new_string;
-       char *line;
+       int rc;
+
+       /* Avoid returning uninitialised data on error */
+       *line = NULL;
 
        /* Display prompt, if applicable */
        if ( prompt )
@@ -280,12 +285,11 @@ char * readline_history ( const char *prompt, const char *prefill,
                switch ( key ) {
                case CR:
                case LF:
-                       line = strdup ( buf );
-                       if ( ! line )
-                               printf ( "\nOut of memory" );
+                       *line = strdup ( buf );
+                       rc = ( ( *line ) ? 0 : -ENOMEM );
                        goto done;
                case CTRL_C:
-                       line = NULL;
+                       rc = -ECANCELED;
                        goto done;
                case KEY_UP:
                        move_by = 1;
@@ -311,11 +315,12 @@ char * readline_history ( const char *prompt, const char *prefill,
  done:
        putchar ( '\n' );
        if ( history ) {
-               if ( line && line[0] )
-                       history_append ( history, line );
+               if ( *line && (*line)[0] )
+                       history_append ( history, *line );
                history_cleanup ( history );
        }
-       return line;
+       assert ( ( rc == 0 ) ^ ( *line == NULL ) );
+       return rc;
 }
 
 /**
@@ -328,5 +333,8 @@ char * readline_history ( const char *prompt, const char *prefill,
  * eventually call free() to release the storage.
  */
 char * readline ( const char *prompt ) {
-       return readline_history ( prompt, NULL, NULL );
+       char *line;
+
+       readline_history ( prompt, NULL, NULL, &line );
+       return line;
 }
index f4cf9bc8d555379725737ad018b2f85af2e912eb..b62086769aa6745e4ff4d07db8da0ce6237a01ed 100644 (file)
@@ -86,7 +86,7 @@ int shell ( void ) {
 
        /* Read and execute commands */
        do {
-               line = readline_history ( shell_prompt, NULL, &history );
+               readline_history ( shell_prompt, NULL, &history, &line );
                if ( line ) {
                        rc = system ( line );
                        free ( line );
index dd63225d525494db6b674c70523e5574143bfdf0..514e1f8aef00475e017aedfd7f58635636330f09 100644 (file)
@@ -264,6 +264,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #define ERRFILE_ocsp                 ( ERRFILE_OTHER | 0x002f0000 )
 #define ERRFILE_nslookup             ( ERRFILE_OTHER | 0x00300000 )
 #define ERRFILE_efi_snp_hii          ( ERRFILE_OTHER | 0x00310000 )
+#define ERRFILE_readline             ( ERRFILE_OTHER | 0x00320000 )
 
 /** @} */
 
index 8b1599753d2a13ad55867bba46c888208d5554cf..0449a3f98307e9824d0863ad1ab73d2ac02e0e7f 100644 (file)
@@ -50,9 +50,8 @@ struct readline_history {
 };
 
 extern void history_free ( struct readline_history *history );
-extern char * __malloc readline_history ( const char *prompt,
-                                         const char *prefill,
-                                         struct readline_history *history );
+extern int readline_history ( const char *prompt, const char *prefill,
+                             struct readline_history *history, char **line );
 extern char * __malloc readline ( const char *prompt );
 
 #endif /* _READLINE_H */