bpo-32030: Cleanup "path config" code (#4663) · python/cpython@b64de46 (original) (raw)
1
1
`/* Return the initial module search path. */
`
2
2
``
3
3
`#include "Python.h"
`
``
4
`+
#include "internal/pystate.h"
`
4
5
`#include "osdefs.h"
`
5
6
``
6
7
`#include <sys/types.h>
`
`@@ -114,14 +115,6 @@ extern "C" {
`
114
115
` ? _Py_INIT_USER_ERR("cannot decode " #NAME) \
`
115
116
` : _Py_INIT_NO_MEMORY()
`
116
117
``
117
``
-
118
``
`-
typedef struct {
`
119
``
`-
wchar_t *prefix;
`
120
``
`-
wchar_t *exec_prefix;
`
121
``
`-
wchar_t *program_name;
`
122
``
`-
wchar_t *module_search_path;
`
123
``
`-
} PyPathConfig;
`
124
``
-
125
118
`typedef struct {
`
126
119
`wchar_t path_env; / PATH environment variable */
`
127
120
`wchar_t home; / PYTHONHOME environment variable */
`
`@@ -142,7 +135,7 @@ typedef struct {
`
142
135
``
143
136
`static const wchar_t delimiter[2] = {DELIM, '\0'};
`
144
137
`static const wchar_t separator[2] = {SEP, '\0'};
`
145
``
`-
static PyPathConfig path_config = {.module_search_path = NULL};
`
``
138
`+
static _PyPathConfig _Py_path_config = _PyPathConfig_INIT;
`
146
139
``
147
140
``
148
141
`/* Get file status. Encode the path to the locale encoding. */
`
`@@ -592,10 +585,10 @@ calculate_reduce_exec_prefix(PyCalculatePath *calculate, wchar_t *exec_prefix)
`
592
585
``
593
586
``
594
587
`static _PyInitError
`
595
``
`-
calculate_program_name(PyCalculatePath *calculate, PyPathConfig *config)
`
``
588
`+
calculate_program_full_path(PyCalculatePath *calculate, _PyPathConfig *config)
`
596
589
`{
`
597
``
`-
wchar_t program_name[MAXPATHLEN+1];
`
598
``
`-
memset(program_name, 0, sizeof(program_name));
`
``
590
`+
wchar_t program_full_path[MAXPATHLEN+1];
`
``
591
`+
memset(program_full_path, 0, sizeof(program_full_path));
`
599
592
``
600
593
`#ifdef APPLE
`
601
594
`#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
`
`@@ -612,7 +605,7 @@ calculate_program_name(PyCalculatePath *calculate, PyPathConfig *config)
`
612
605
` * $PATH isn't exported, you lose.
`
613
606
` */
`
614
607
`if (wcschr(calculate->program_name, SEP)) {
`
615
``
`-
wcsncpy(program_name, calculate->program_name, MAXPATHLEN);
`
``
608
`+
wcsncpy(program_full_path, calculate->program_name, MAXPATHLEN);
`
616
609
` }
`
617
610
`#ifdef APPLE
`
618
611
`/* On Mac OS X, if a script uses an interpreter of the form
`
`@@ -628,10 +621,10 @@ calculate_program_name(PyCalculatePath *calculate, PyPathConfig *config)
`
628
621
`else if(0 == _NSGetExecutablePath(execpath, &nsexeclength) &&
`
629
622
`execpath[0] == SEP)
`
630
623
` {
`
631
``
`-
size_t r = mbstowcs(program_name, execpath, MAXPATHLEN+1);
`
``
624
`+
size_t r = mbstowcs(program_full_path, execpath, MAXPATHLEN+1);
`
632
625
`if (r == (size_t)-1 || r > MAXPATHLEN) {
`
633
626
`/* Could not convert execpath, or it's too long. */
`
634
``
`-
program_name[0] = '\0';
`
``
627
`+
program_full_path[0] = '\0';
`
635
628
` }
`
636
629
` }
`
637
630
`#endif /* APPLE */
`
`@@ -645,44 +638,44 @@ calculate_program_name(PyCalculatePath *calculate, PyPathConfig *config)
`
645
638
`if (len > MAXPATHLEN) {
`
646
639
`len = MAXPATHLEN;
`
647
640
` }
`
648
``
`-
wcsncpy(program_name, path, len);
`
649
``
`-
program_name[len] = '\0';
`
``
641
`+
wcsncpy(program_full_path, path, len);
`
``
642
`+
program_full_path[len] = '\0';
`
650
643
` }
`
651
644
`else {
`
652
``
`-
wcsncpy(program_name, path, MAXPATHLEN);
`
``
645
`+
wcsncpy(program_full_path, path, MAXPATHLEN);
`
653
646
` }
`
654
647
``
655
``
`-
joinpath(program_name, calculate->program_name);
`
656
``
`-
if (isxfile(program_name)) {
`
``
648
`+
joinpath(program_full_path, calculate->program_name);
`
``
649
`+
if (isxfile(program_full_path)) {
`
657
650
`break;
`
658
651
` }
`
659
652
``
660
653
`if (!delim) {
`
661
``
`-
program_name[0] = L'\0';
`
``
654
`+
program_full_path[0] = L'\0';
`
662
655
`break;
`
663
656
` }
`
664
657
`path = delim + 1;
`
665
658
` }
`
666
659
` }
`
667
660
`else {
`
668
``
`-
program_name[0] = '\0';
`
``
661
`+
program_full_path[0] = '\0';
`
669
662
` }
`
670
``
`-
if (program_name[0] != SEP && program_name[0] != '\0') {
`
671
``
`-
absolutize(program_name);
`
``
663
`+
if (program_full_path[0] != SEP && program_full_path[0] != '\0') {
`
``
664
`+
absolutize(program_full_path);
`
672
665
` }
`
673
666
``
674
``
`-
config->program_name = _PyMem_RawWcsdup(program_name);
`
675
``
`-
if (config->program_name == NULL) {
`
``
667
`+
config->program_full_path = _PyMem_RawWcsdup(program_full_path);
`
``
668
`+
if (config->program_full_path == NULL) {
`
676
669
`return _Py_INIT_NO_MEMORY();
`
677
670
` }
`
678
671
`return _Py_INIT_OK();
`
679
672
`}
`
680
673
``
681
674
``
682
675
`static _PyInitError
`
683
``
`-
calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_name)
`
``
676
`+
calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_full_path)
`
684
677
`{
`
685
``
`-
wcsncpy(calculate->argv0_path, program_name, MAXPATHLEN);
`
``
678
`+
wcsncpy(calculate->argv0_path, program_full_path, MAXPATHLEN);
`
686
679
`calculate->argv0_path[MAXPATHLEN] = '\0';
`
687
680
``
688
681
`#ifdef WITH_NEXT_FRAMEWORK
`
`@@ -718,10 +711,10 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_name)
`
718
711
`if (!ismodule(calculate->argv0_path)) {
`
719
712
`/* We are in the build directory so use the name of the
`
720
713
` executable - we know that the absolute path is passed */
`
721
``
`-
wcsncpy(calculate->argv0_path, program_name, MAXPATHLEN);
`
``
714
`+
wcsncpy(calculate->argv0_path, program_full_path, MAXPATHLEN);
`
722
715
` }
`
723
716
`else {
`
724
``
`-
/* Use the location of the library as the program_name */
`
``
717
`+
/* Use the location of the library as the program_full_path */
`
725
718
`wcsncpy(calculate->argv0_path, wbuf, MAXPATHLEN);
`
726
719
` }
`
727
720
`PyMem_RawFree(wbuf);
`
`@@ -730,15 +723,15 @@ calculate_argv0_path(PyCalculatePath *calculate, const wchar_t *program_name)
`
730
723
``
731
724
`#if HAVE_READLINK
`
732
725
`wchar_t tmpbuffer[MAXPATHLEN+1];
`
733
``
`-
int linklen = _Py_wreadlink(program_name, tmpbuffer, MAXPATHLEN);
`
``
726
`+
int linklen = _Py_wreadlink(program_full_path, tmpbuffer, MAXPATHLEN);
`
734
727
`while (linklen != -1) {
`
735
728
`if (tmpbuffer[0] == SEP) {
`
736
729
`/* tmpbuffer should never be longer than MAXPATHLEN,
`
737
730
` but extra check does not hurt */
`
738
731
`wcsncpy(calculate->argv0_path, tmpbuffer, MAXPATHLEN);
`
739
732
` }
`
740
733
`else {
`
741
``
`-
/* Interpret relative to program_name */
`
``
734
`+
/* Interpret relative to program_full_path */
`
742
735
`reduce(calculate->argv0_path);
`
743
736
`joinpath(calculate->argv0_path, tmpbuffer);
`
744
737
` }
`
`@@ -819,7 +812,7 @@ calculate_zip_path(PyCalculatePath *calculate, const wchar_t *prefix)
`
819
812
`static _PyInitError
`
820
813
`calculate_module_search_path(PyCalculatePath *calculate,
`
821
814
`const wchar_t *prefix, const wchar_t *exec_prefix,
`
822
``
`-
PyPathConfig *config)
`
``
815
`+
_PyPathConfig *config)
`
823
816
`{
`
824
817
`/* Calculate size of return buffer */
`
825
818
`size_t bufsz = 0;
`
`@@ -955,14 +948,14 @@ calculate_free(PyCalculatePath *calculate)
`
955
948
``
956
949
``
957
950
`static _PyInitError
`
958
``
`-
calculate_path_impl(PyCalculatePath *calculate, PyPathConfig *config)
`
``
951
`+
calculate_path_impl(PyCalculatePath *calculate, _PyPathConfig *config)
`
959
952
`{
`
960
``
`-
_PyInitError err = calculate_program_name(calculate, config);
`
``
953
`+
_PyInitError err = calculate_program_full_path(calculate, config);
`
961
954
`if (_Py_INIT_FAILED(err)) {
`
962
955
`return err;
`
963
956
` }
`
964
957
``
965
``
`-
err = calculate_argv0_path(calculate, config->program_name);
`
``
958
`+
err = calculate_argv0_path(calculate, config->program_full_path);
`
966
959
`if (_Py_INIT_FAILED(err)) {
`
967
960
`return err;
`
968
961
` }
`
`@@ -1011,7 +1004,7 @@ calculate_path_impl(PyCalculatePath *calculate, PyPathConfig *config)
`
1011
1004
``
1012
1005
``
1013
1006
`static void
`
1014
``
`-
pathconfig_clear(PyPathConfig *config)
`
``
1007
`+
pathconfig_clear(_PyPathConfig *config)
`
1015
1008
`{
`
1016
1009
`#define CLEAR(ATTR) \
`
1017
1010
` do { \
`
`@@ -1021,7 +1014,7 @@ pathconfig_clear(PyPathConfig *config)
`
1021
1014
``
1022
1015
`CLEAR(config->prefix);
`
1023
1016
`CLEAR(config->exec_prefix);
`
1024
``
`-
CLEAR(config->program_name);
`
``
1017
`+
CLEAR(config->program_full_path);
`
1025
1018
`CLEAR(config->module_search_path);
`
1026
1019
`#undef CLEAR
`
1027
1020
`}
`
`@@ -1032,7 +1025,7 @@ pathconfig_clear(PyPathConfig *config)
`
1032
1025
`_PyInitError
`
1033
1026
`_PyPathConfig_Init(const _PyMainInterpreterConfig *main_config)
`
1034
1027
`{
`
1035
``
`-
if (path_config.module_search_path) {
`
``
1028
`+
if (_Py_path_config.module_search_path) {
`
1036
1029
`/* Already initialized */
`
1037
1030
`return _Py_INIT_OK();
`
1038
1031
` }
`
`@@ -1045,7 +1038,7 @@ _PyPathConfig_Init(const _PyMainInterpreterConfig *main_config)
`
1045
1038
` goto done;
`
1046
1039
` }
`
1047
1040
``
1048
``
`-
PyPathConfig new_path_config;
`
``
1041
`+
_PyPathConfig new_path_config;
`
1049
1042
`memset(&new_path_config, 0, sizeof(new_path_config));
`
1050
1043
``
1051
1044
`err = calculate_path_impl(&calculate, &new_path_config);
`
`@@ -1054,7 +1047,7 @@ _PyPathConfig_Init(const _PyMainInterpreterConfig *main_config)
`
1054
1047
` goto done;
`
1055
1048
` }
`
1056
1049
``
1057
``
`-
path_config = new_path_config;
`
``
1050
`+
_Py_path_config = new_path_config;
`
1058
1051
`err = _Py_INIT_OK();
`
1059
1052
``
1060
1053
`done:
`
`@@ -1064,8 +1057,13 @@ _PyPathConfig_Init(const _PyMainInterpreterConfig *main_config)
`
1064
1057
``
1065
1058
``
1066
1059
`static void
`
1067
``
`-
calculate_path(void)
`
``
1060
`+
pathconfig_global_init(void)
`
1068
1061
`{
`
``
1062
`+
if (_Py_path_config.module_search_path) {
`
``
1063
`+
/* Already initialized */
`
``
1064
`+
return;
`
``
1065
`+
}
`
``
1066
+
1069
1067
`_PyInitError err;
`
1070
1068
`_PyMainInterpreterConfig config = _PyMainInterpreterConfig_INIT;
`
1071
1069
``
`@@ -1084,7 +1082,7 @@ calculate_path(void)
`
1084
1082
`void
`
1085
1083
`_PyPathConfig_Fini(void)
`
1086
1084
`{
`
1087
``
`-
pathconfig_clear(&path_config);
`
``
1085
`+
pathconfig_clear(&_Py_path_config);
`
1088
1086
`}
`
1089
1087
``
1090
1088
``
`@@ -1093,58 +1091,50 @@ void
`
1093
1091
`Py_SetPath(const wchar_t *path)
`
1094
1092
`{
`
1095
1093
`if (path == NULL) {
`
1096
``
`-
pathconfig_clear(&path_config);
`
``
1094
`+
pathconfig_clear(&_Py_path_config);
`
1097
1095
`return;
`
1098
1096
` }
`
1099
1097
``
1100
``
`-
PyPathConfig new_config;
`
1101
``
`-
new_config.program_name = _PyMem_RawWcsdup(Py_GetProgramName());
`
``
1098
`+
_PyPathConfig new_config;
`
``
1099
`+
new_config.program_full_path = _PyMem_RawWcsdup(Py_GetProgramName());
`
1102
1100
`new_config.exec_prefix = _PyMem_RawWcsdup(L"");
`
1103
1101
`new_config.prefix = _PyMem_RawWcsdup(L"");
`
1104
1102
`new_config.module_search_path = _PyMem_RawWcsdup(path);
`
1105
1103
``
1106
``
`-
pathconfig_clear(&path_config);
`
1107
``
`-
path_config = new_config;
`
``
1104
`+
pathconfig_clear(&_Py_path_config);
`
``
1105
`+
_Py_path_config = new_config;
`
1108
1106
`}
`
1109
1107
``
1110
1108
``
1111
1109
`wchar_t *
`
1112
1110
`Py_GetPath(void)
`
1113
1111
`{
`
1114
``
`-
if (!path_config.module_search_path) {
`
1115
``
`-
calculate_path();
`
1116
``
`-
}
`
1117
``
`-
return path_config.module_search_path;
`
``
1112
`+
pathconfig_global_init();
`
``
1113
`+
return _Py_path_config.module_search_path;
`
1118
1114
`}
`
1119
1115
``
1120
1116
``
1121
1117
`wchar_t *
`
1122
1118
`Py_GetPrefix(void)
`
1123
1119
`{
`
1124
``
`-
if (!path_config.module_search_path) {
`
1125
``
`-
calculate_path();
`
1126
``
`-
}
`
1127
``
`-
return path_config.prefix;
`
``
1120
`+
pathconfig_global_init();
`
``
1121
`+
return _Py_path_config.prefix;
`
1128
1122
`}
`
1129
1123
``
1130
1124
``
1131
1125
`wchar_t *
`
1132
1126
`Py_GetExecPrefix(void)
`
1133
1127
`{
`
1134
``
`-
if (!path_config.module_search_path) {
`
1135
``
`-
calculate_path();
`
1136
``
`-
}
`
1137
``
`-
return path_config.exec_prefix;
`
``
1128
`+
pathconfig_global_init();
`
``
1129
`+
return _Py_path_config.exec_prefix;
`
1138
1130
`}
`
1139
1131
``
1140
1132
``
1141
1133
`wchar_t *
`
1142
1134
`Py_GetProgramFullPath(void)
`
1143
1135
`{
`
1144
``
`-
if (!path_config.module_search_path) {
`
1145
``
`-
calculate_path();
`
1146
``
`-
}
`
1147
``
`-
return path_config.program_name;
`
``
1136
`+
pathconfig_global_init();
`
``
1137
`+
return _Py_path_config.program_full_path;
`
1148
1138
`}
`
1149
1139
``
1150
1140
`#ifdef __cplusplus
`