now checks if a search entry is a directory and returns B_IS_A_DIRECTORY in case it's the sole entry for this name (btw getenv(PATH) doesn't return the current PATH)

fixes bug #569


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17372 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2006-05-08 20:07:01 +00:00
parent fb36570967
commit ce91cbc42d
+16 -7
View File
@@ -125,6 +125,7 @@ search_executable_in_path_list(const char *name, const char *pathList,
int pathListLen, char *pathBuffer, int pathBufferLen) int pathListLen, char *pathBuffer, int pathBufferLen)
{ {
const char *pathListEnd = pathList + pathListLen; const char *pathListEnd = pathList + pathListLen;
status_t status = B_ENTRY_NOT_FOUND;
//TRACE(("rld.so: search_container_in_path_list() %s in %.*s\n", name, //TRACE(("rld.so: search_container_in_path_list() %s in %.*s\n", name,
// pathListLen, pathList)); // pathListLen, pathList));
@@ -139,14 +140,23 @@ search_executable_in_path_list(const char *name, const char *pathList,
fd = try_open_executable(pathList, pathEnd - pathList, name, pathBuffer, fd = try_open_executable(pathList, pathEnd - pathList, name, pathBuffer,
pathBufferLen); pathBufferLen);
if (fd >= 0) if (fd >= 0) {
return fd; // see if it's a dir
struct stat stat;
status = _kern_read_stat(fd, NULL, true, &stat, sizeof(struct stat));
if (status == B_OK) {
if (!S_ISDIR(stat.st_mode))
return fd;
status = B_IS_A_DIRECTORY;
}
_kern_close(fd);
}
pathListLen = pathListEnd - pathEnd - 1; pathListLen = pathListEnd - pathEnd - 1;
pathList = pathEnd + 1; pathList = pathEnd + 1;
} }
return B_ENTRY_NOT_FOUND; return status;
} }
@@ -155,7 +165,7 @@ open_executable(char *name, image_type type, const char *rpath)
{ {
const char *paths; const char *paths;
char buffer[PATH_MAX]; char buffer[PATH_MAX];
int fd = -1; int fd = B_ENTRY_NOT_FOUND;
if (strchr(name, '/')) { if (strchr(name, '/')) {
// the name already contains a path, we don't have to search for it // the name already contains a path, we don't have to search for it
@@ -194,10 +204,9 @@ open_executable(char *name, image_type type, const char *rpath)
// we found it, copy path! // we found it, copy path!
//TRACE(("rld.so: open_container(%s): found at %s\n", name, buffer)); //TRACE(("rld.so: open_container(%s): found at %s\n", name, buffer));
strlcpy(name, buffer, PATH_MAX); strlcpy(name, buffer, PATH_MAX);
return fd;
} }
return B_ENTRY_NOT_FOUND; return fd;
} }