Patch from kaliber: use path of executable instead of the command. Thanks!

this fixes bug #1773 and #1824. I tested only #1773.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24131 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2008-02-26 00:03:51 +00:00
parent 46ea5b1e49
commit 30cce27770
3 changed files with 10 additions and 7 deletions
+1 -1
View File
@@ -22,7 +22,7 @@ extern "C" {
#endif #endif
status_t __parse_invoke_line(char *invoker, char ***_newArgs, status_t __parse_invoke_line(char *invoker, char ***_newArgs,
char * const **_oldArgs, int32 *_argCount); char * const **_oldArgs, int32 *_argCount, const char *arg0);
status_t __get_next_image_dependency(image_id id, uint32 *cookie, status_t __get_next_image_dependency(image_id id, uint32 *cookie,
const char **_name); const char **_name);
status_t __test_executable(const char *path, char *invoker); status_t __test_executable(const char *path, char *invoker);
+6 -3
View File
@@ -33,7 +33,7 @@ load_image(int32 argCount, const char **args, const char **environ)
if (invoker[0]) { if (invoker[0]) {
status = __parse_invoke_line(invoker, &newArgs, status = __parse_invoke_line(invoker, &newArgs,
(char * const **)&args, &argCount); (char * const **)&args, &argCount, args[1]);
if (status < B_OK) if (status < B_OK)
return status; return status;
} }
@@ -146,7 +146,7 @@ next_argument(char **_start, bool separate)
status_t status_t
__parse_invoke_line(char *invoker, char ***_newArgs, __parse_invoke_line(char *invoker, char ***_newArgs,
char * const **_oldArgs, int32 *_argCount) char * const **_oldArgs, int32 *_argCount, const char *arg0)
{ {
int32 i, count = 0; int32 i, count = 0;
char *arg = invoker; char *arg = invoker;
@@ -169,7 +169,10 @@ __parse_invoke_line(char *invoker, char ***_newArgs,
newArgs[i] = arg; newArgs[i] = arg;
} }
for (i = 0; i < *_argCount; i++) { for (i = 0; i < *_argCount; i++) {
newArgs[i + count] = (char *)(*_oldArgs)[i]; if (i == 0)
newArgs[i + count] = arg0;
else
newArgs[i + count] = (char *)(*_oldArgs)[i];
} }
newArgs[i + count] = NULL; newArgs[i + count] = NULL;
+3 -3
View File
@@ -72,14 +72,14 @@ execve(const char *path, char * const args[], char * const environment[])
// test validity of executable + support for scripts // test validity of executable + support for scripts
{ {
status_t status = __test_executable(args[0], invoker); status_t status = __test_executable(path, invoker);
if (status < B_OK) { if (status < B_OK) {
errno = status; errno = status;
return -1; return -1;
} }
if (invoker[0]) { if (invoker[0]) {
status = __parse_invoke_line(invoker, &newArgs, &args, &argCount); status = __parse_invoke_line(invoker, &newArgs, &args, &argCount, path);
if (status < B_OK) { if (status < B_OK) {
errno = status; errno = status;
return -1; return -1;
@@ -94,7 +94,7 @@ execve(const char *path, char * const args[], char * const environment[])
// don't care and pass everything to the kernel - it will have to // don't care and pass everything to the kernel - it will have to
// do the right thing :) // do the right thing :)
errno = _kern_exec(path, argCount, args, envCount, environment); errno = _kern_exec(path, argCount, newArgs ? newArgs : args, envCount, environment);
// if this call returns, something definitely went wrong // if this call returns, something definitely went wrong
free(newArgs); free(newArgs);