mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Instead of a single exists(), differentiate between files, modules,
executable files, and directories. When expecting a module, we also look for the .pyc or .pyo file.
This commit is contained in:
parent
73bacfc3d7
commit
d29806c37e
1 changed files with 70 additions and 13 deletions
|
@ -164,14 +164,71 @@ reduce(dir)
|
||||||
--i;
|
--i;
|
||||||
dir[i] = '\0';
|
dir[i] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef S_ISREG
|
||||||
|
#define S_ISREG(x) (((x) & S_IFMT) == S_IFREG)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef S_ISDIR
|
||||||
|
#define S_ISDIR(x) (((x) & S_IFMT) == S_IFDIR)
|
||||||
|
#endif
|
||||||
|
|
||||||
static int
|
static int
|
||||||
exists(filename)
|
isfile(filename) /* Is file, not directory */
|
||||||
char *filename;
|
char *filename;
|
||||||
{
|
{
|
||||||
struct stat buf;
|
struct stat buf;
|
||||||
return stat(filename, &buf) == 0;
|
if (stat(filename, &buf) != 0)
|
||||||
|
return 0;
|
||||||
|
if (!S_ISREG(buf.st_mode))
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
ismodule(filename) /* Is module -- check for .pyc/.pyo too */
|
||||||
|
char *filename;
|
||||||
|
{
|
||||||
|
if (isfile(filename))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Check for the compiled version of prefix. */
|
||||||
|
if (strlen(filename) < MAXPATHLEN) {
|
||||||
|
strcat(filename, Py_OptimizeFlag ? "o" : "c");
|
||||||
|
if (isfile(filename))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
isxfile(filename) /* Is executable file */
|
||||||
|
char *filename;
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
if (stat(filename, &buf) != 0)
|
||||||
|
return 0;
|
||||||
|
if (!S_ISREG(buf.st_mode))
|
||||||
|
return 0;
|
||||||
|
if ((buf.st_mode & 0111) == 0)
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
isdir(filename) /* Is directory */
|
||||||
|
char *filename;
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
if (stat(filename, &buf) != 0)
|
||||||
|
return 0;
|
||||||
|
if (!S_ISDIR(buf.st_mode))
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -207,7 +264,7 @@ search_for_prefix(argv0_path, home)
|
||||||
/* Check to see if argv[0] is in the build directory */
|
/* Check to see if argv[0] is in the build directory */
|
||||||
strcpy(prefix, argv0_path);
|
strcpy(prefix, argv0_path);
|
||||||
joinpath(prefix, "Modules/Setup");
|
joinpath(prefix, "Modules/Setup");
|
||||||
if (exists(prefix)) {
|
if (isfile(prefix)) {
|
||||||
/* Check VPATH to see if argv0_path is in the build directory.
|
/* Check VPATH to see if argv0_path is in the build directory.
|
||||||
* Complication: the VPATH passed in is relative to the
|
* Complication: the VPATH passed in is relative to the
|
||||||
* Modules build directory and points to the Modules source
|
* Modules build directory and points to the Modules source
|
||||||
|
@ -225,7 +282,7 @@ search_for_prefix(argv0_path, home)
|
||||||
reduce(prefix);
|
reduce(prefix);
|
||||||
joinpath(prefix, "Lib");
|
joinpath(prefix, "Lib");
|
||||||
joinpath(prefix, LANDMARK);
|
joinpath(prefix, LANDMARK);
|
||||||
if (exists(prefix))
|
if (ismodule(prefix))
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,7 +295,7 @@ search_for_prefix(argv0_path, home)
|
||||||
*delim = '\0';
|
*delim = '\0';
|
||||||
joinpath(prefix, lib_python);
|
joinpath(prefix, lib_python);
|
||||||
joinpath(prefix, LANDMARK);
|
joinpath(prefix, LANDMARK);
|
||||||
if (exists(prefix))
|
if (ismodule(prefix))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -248,7 +305,7 @@ search_for_prefix(argv0_path, home)
|
||||||
n = strlen(prefix);
|
n = strlen(prefix);
|
||||||
joinpath(prefix, lib_python);
|
joinpath(prefix, lib_python);
|
||||||
joinpath(prefix, LANDMARK);
|
joinpath(prefix, LANDMARK);
|
||||||
if (exists(prefix))
|
if (ismodule(prefix))
|
||||||
return 1;
|
return 1;
|
||||||
prefix[n] = '\0';
|
prefix[n] = '\0';
|
||||||
reduce(prefix);
|
reduce(prefix);
|
||||||
|
@ -258,7 +315,7 @@ search_for_prefix(argv0_path, home)
|
||||||
strcpy(prefix, PREFIX);
|
strcpy(prefix, PREFIX);
|
||||||
joinpath(prefix, lib_python);
|
joinpath(prefix, lib_python);
|
||||||
joinpath(prefix, LANDMARK);
|
joinpath(prefix, LANDMARK);
|
||||||
if (exists(prefix))
|
if (ismodule(prefix))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Fail */
|
/* Fail */
|
||||||
|
@ -276,7 +333,7 @@ search_for_exec_prefix(argv0_path, home)
|
||||||
/* Check to see if argv[0] is in the build directory */
|
/* Check to see if argv[0] is in the build directory */
|
||||||
strcpy(exec_prefix, argv0_path);
|
strcpy(exec_prefix, argv0_path);
|
||||||
joinpath(exec_prefix, "Modules/Setup");
|
joinpath(exec_prefix, "Modules/Setup");
|
||||||
if (exists(exec_prefix)) {
|
if (isfile(exec_prefix)) {
|
||||||
reduce(exec_prefix);
|
reduce(exec_prefix);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -291,7 +348,7 @@ search_for_exec_prefix(argv0_path, home)
|
||||||
strcpy(exec_prefix, home);
|
strcpy(exec_prefix, home);
|
||||||
joinpath(exec_prefix, lib_python);
|
joinpath(exec_prefix, lib_python);
|
||||||
joinpath(exec_prefix, "lib-dynload");
|
joinpath(exec_prefix, "lib-dynload");
|
||||||
if (exists(exec_prefix))
|
if (isdir(exec_prefix))
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -301,7 +358,7 @@ search_for_exec_prefix(argv0_path, home)
|
||||||
n = strlen(exec_prefix);
|
n = strlen(exec_prefix);
|
||||||
joinpath(exec_prefix, lib_python);
|
joinpath(exec_prefix, lib_python);
|
||||||
joinpath(exec_prefix, "lib-dynload");
|
joinpath(exec_prefix, "lib-dynload");
|
||||||
if (exists(exec_prefix))
|
if (isdir(exec_prefix))
|
||||||
return 1;
|
return 1;
|
||||||
exec_prefix[n] = '\0';
|
exec_prefix[n] = '\0';
|
||||||
reduce(exec_prefix);
|
reduce(exec_prefix);
|
||||||
|
@ -311,7 +368,7 @@ search_for_exec_prefix(argv0_path, home)
|
||||||
strcpy(exec_prefix, EXEC_PREFIX);
|
strcpy(exec_prefix, EXEC_PREFIX);
|
||||||
joinpath(exec_prefix, lib_python);
|
joinpath(exec_prefix, lib_python);
|
||||||
joinpath(exec_prefix, "lib-dynload");
|
joinpath(exec_prefix, "lib-dynload");
|
||||||
if (exists(exec_prefix))
|
if (isdir(exec_prefix))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Fail */
|
/* Fail */
|
||||||
|
@ -361,7 +418,7 @@ calculate_path()
|
||||||
strcpy(progpath, path);
|
strcpy(progpath, path);
|
||||||
|
|
||||||
joinpath(progpath, prog);
|
joinpath(progpath, prog);
|
||||||
if (exists(progpath))
|
if (isxfile(progpath))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!delim) {
|
if (!delim) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue