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
/* 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;
}
/**