david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

[cmdline] Store exit status of failed command in errno

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown 2012-07-12 15:28:09 +01:00
parent e84e19d4ed
commit 5b4958388d
1 changed files with 22 additions and 6 deletions

View File

@ -59,18 +59,22 @@ static int stop_state;
int execv ( const char *command, char * const argv[] ) { int execv ( const char *command, char * const argv[] ) {
struct command *cmd; struct command *cmd;
int argc; int argc;
int rc;
/* Count number of arguments */ /* Count number of arguments */
for ( argc = 0 ; argv[argc] ; argc++ ) {} for ( argc = 0 ; argv[argc] ; argc++ ) {}
/* An empty command is deemed to do nothing, successfully */ /* An empty command is deemed to do nothing, successfully */
if ( command == NULL ) if ( command == NULL ) {
return 0; rc = 0;
goto done;
}
/* Sanity checks */ /* Sanity checks */
if ( argc == 0 ) { if ( argc == 0 ) {
DBG ( "%s: empty argument list\n", command ); DBG ( "%s: empty argument list\n", command );
return -EINVAL; rc = -EINVAL;
goto done;
} }
/* Reset getopt() library ready for use by the command. This /* 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 */ /* Hand off to command implementation */
for_each_table_entry ( cmd, COMMANDS ) { for_each_table_entry ( cmd, COMMANDS ) {
if ( strcmp ( command, cmd->name ) == 0 ) if ( strcmp ( command, cmd->name ) == 0 ) {
return cmd->exec ( argc, ( char ** ) argv ); rc = cmd->exec ( argc, ( char ** ) argv );
goto done;
}
} }
printf ( "%s: command not found\n", command ); 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;
} }
/** /**