|
@@ -59,18 +59,22 @@ static int stop_state;
|
59
|
59
|
int execv ( const char *command, char * const argv[] ) {
|
60
|
60
|
struct command *cmd;
|
61
|
61
|
int argc;
|
|
62
|
+ int rc;
|
62
|
63
|
|
63
|
64
|
/* Count number of arguments */
|
64
|
65
|
for ( argc = 0 ; argv[argc] ; argc++ ) {}
|
65
|
66
|
|
66
|
67
|
/* An empty command is deemed to do nothing, successfully */
|
67
|
|
- if ( command == NULL )
|
68
|
|
- return 0;
|
|
68
|
+ if ( command == NULL ) {
|
|
69
|
+ rc = 0;
|
|
70
|
+ goto done;
|
|
71
|
+ }
|
69
|
72
|
|
70
|
73
|
/* Sanity checks */
|
71
|
74
|
if ( argc == 0 ) {
|
72
|
75
|
DBG ( "%s: empty argument list\n", command );
|
73
|
|
- return -EINVAL;
|
|
76
|
+ rc = -EINVAL;
|
|
77
|
+ goto done;
|
74
|
78
|
}
|
75
|
79
|
|
76
|
80
|
/* Reset getopt() library ready for use by the command. This
|
|
@@ -82,12 +86,24 @@ int execv ( const char *command, char * const argv[] ) {
|
82
|
86
|
|
83
|
87
|
/* Hand off to command implementation */
|
84
|
88
|
for_each_table_entry ( cmd, COMMANDS ) {
|
85
|
|
- if ( strcmp ( command, cmd->name ) == 0 )
|
86
|
|
- return cmd->exec ( argc, ( char ** ) argv );
|
|
89
|
+ if ( strcmp ( command, cmd->name ) == 0 ) {
|
|
90
|
+ rc = cmd->exec ( argc, ( char ** ) argv );
|
|
91
|
+ goto done;
|
|
92
|
+ }
|
87
|
93
|
}
|
88
|
94
|
|
89
|
95
|
printf ( "%s: command not found\n", command );
|
90
|
|
- return -ENOEXEC;
|
|
96
|
+ rc = -ENOEXEC;
|
|
97
|
+
|
|
98
|
+ done:
|
|
99
|
+ /* Store error number, if an error occurred */
|
|
100
|
+ if ( rc ) {
|
|
101
|
+ errno = rc;
|
|
102
|
+ if ( errno < 0 )
|
|
103
|
+ errno = -errno;
|
|
104
|
+ }
|
|
105
|
+
|
|
106
|
+ return rc;
|
91
|
107
|
}
|
92
|
108
|
|
93
|
109
|
/**
|