]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[cmdline] Store exit status of failed command in errno
authorMichael Brown <mcb30@ipxe.org>
Thu, 12 Jul 2012 14:28:09 +0000 (15:28 +0100)
committerMichael Brown <mcb30@ipxe.org>
Thu, 12 Jul 2012 14:42:29 +0000 (15:42 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/exec.c

index 139cf7a846ab8e7d626fae1db28b9d463c31b6fe..5b3d1489a18c7dbaac8f4d85496b4229cfd3d349 100644 (file)
@@ -59,18 +59,22 @@ static int stop_state;
 int execv ( const char *command, char * const argv[] ) {
        struct command *cmd;
        int argc;
+       int rc;
 
        /* Count number of arguments */
        for ( argc = 0 ; argv[argc] ; argc++ ) {}
 
        /* An empty command is deemed to do nothing, successfully */
-       if ( command == NULL )
-               return 0;
+       if ( command == NULL ) {
+               rc = 0;
+               goto done;
+       }
 
        /* Sanity checks */
        if ( argc == 0 ) {
                DBG ( "%s: empty argument list\n", command );
-               return -EINVAL;
+               rc = -EINVAL;
+               goto done;
        }
 
        /* Reset getopt() library ready for use by the command.  This
@@ -82,12 +86,24 @@ int execv ( const char *command, char * const argv[] ) {
 
        /* Hand off to command implementation */
        for_each_table_entry ( cmd, COMMANDS ) {
-               if ( strcmp ( command, cmd->name ) == 0 )
-                       return cmd->exec ( argc, ( char ** ) argv );
+               if ( strcmp ( command, cmd->name ) == 0 ) {
+                       rc = cmd->exec ( argc, ( char ** ) argv );
+                       goto done;
+               }
        }
 
        printf ( "%s: command not found\n", command );
-       return -ENOEXEC;
+       rc = -ENOEXEC;
+
+ done:
+       /* Store error number, if an error occurred */
+       if ( rc ) {
+               errno = rc;
+               if ( errno < 0 )
+                       errno = -errno;
+       }
+
+       return rc;
 }
 
 /**