]> TLD Linux GIT Repositories - packages/php.git/blobdiff - php-config-file-scan-dir.patch
- PHP_5_4 branch from PLD
[packages/php.git] / php-config-file-scan-dir.patch
diff --git a/php-config-file-scan-dir.patch b/php-config-file-scan-dir.patch
new file mode 100644 (file)
index 0000000..a01906e
--- /dev/null
@@ -0,0 +1,155 @@
+--- php-5.4.0RC3/main/php_ini.c~       2011-12-10 03:26:15.000000000 +0200
++++ php-5.4.0RC3/main/php_ini.c        2011-12-10 03:26:54.901295707 +0200
+@@ -376,6 +376,7 @@
+       char *open_basedir;
+       int free_ini_search_path = 0;
+       zend_file_handle fh;
++      static const char paths_separator[] = { ZEND_PATHS_SEPARATOR, 0 };
+       if (zend_hash_init(&configuration_hash, 0, NULL, (dtor_func_t) config_zval_dtor, 1) == FAILURE) {
+               return FAILURE;
+@@ -398,7 +399,6 @@
+               int search_path_size;
+               char *default_location;
+               char *env_location;
+-              static const char paths_separator[] = { ZEND_PATHS_SEPARATOR, 0 };
+ #ifdef PHP_WIN32
+               char *reg_location;
+               char phprc_path[MAXPATHLEN];
+@@ -608,72 +608,86 @@
+       /* Scan and parse any .ini files found in scan path if path not empty. */
+       if (!sapi_module.php_ini_ignore && php_ini_scanned_path_len) {
+-              struct dirent **namelist;
+               int ndir, i;
+               struct stat sb;
+               char ini_file[MAXPATHLEN];
+-              char *p;
++              char *p, *last, *path_copy, *ini_path = NULL;
+               zend_file_handle fh2;
+               zend_llist scanned_ini_list;
+               zend_llist_element *element;
+               int l, total_l = 0;
+-              if ((ndir = php_scandir(php_ini_scanned_path, &namelist, 0, php_alphasort)) > 0) {
+-                      zend_llist_init(&scanned_ini_list, sizeof(char *), (llist_dtor_func_t) free_estring, 1);
+-                      memset(&fh2, 0, sizeof(fh2));
+-
+-                      for (i = 0; i < ndir; i++) {
+-
+-                              /* check for any file with .ini extension */
+-                              if (!(p = strrchr(namelist[i]->d_name, '.')) || (p && strcmp(p, ".ini"))) {
+-                                      free(namelist[i]);
+-                                      continue;
+-                              }
+-                              /* Reset active ini section */
+-                              RESET_ACTIVE_INI_HASH();
+-
+-                              if (IS_SLASH(php_ini_scanned_path[php_ini_scanned_path_len - 1])) {
+-                                      snprintf(ini_file, MAXPATHLEN, "%s%s", php_ini_scanned_path, namelist[i]->d_name);
+-                              } else {
+-                                      snprintf(ini_file, MAXPATHLEN, "%s%c%s", php_ini_scanned_path, DEFAULT_SLASH, namelist[i]->d_name);
+-                              }
+-                              if (VCWD_STAT(ini_file, &sb) == 0) {
+-                                      if (S_ISREG(sb.st_mode)) {
+-                                              if ((fh2.handle.fp = VCWD_FOPEN(ini_file, "r"))) {
+-                                                      fh2.filename = ini_file;
+-                                                      fh2.type = ZEND_HANDLE_FP;
+-
+-                                                      if (zend_parse_ini_file(&fh2, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash TSRMLS_CC) == SUCCESS) {
+-                                                              /* Here, add it to the list of ini files read */
+-                                                              l = strlen(ini_file);
+-                                                              total_l += l + 2;
+-                                                              p = estrndup(ini_file, l);
+-                                                              zend_llist_add_element(&scanned_ini_list, &p);
++              /* List of found ini files */
++              zend_llist_init(&scanned_ini_list, sizeof(char *), (llist_dtor_func_t) free_estring, 1);
++
++              /* Split by paths_separator and load ini-files from all paths */
++              path_copy = estrdup(php_ini_scanned_path);
++              ini_path  = php_strtok_r(path_copy, paths_separator, &last);
++
++              while (ini_path != NULL) {
++                      struct dirent **namelist;
++                      int ini_path_len = strlen(ini_path);
++
++                      if ((ndir = php_scandir(ini_path, &namelist, 0, php_alphasort)) > 0) {
++                              memset(&fh2, 0, sizeof(fh2));
++
++                              for (i = 0; i < ndir; i++) {
++                                      /* check for any file with .ini extension */
++                                      if (!(p = strrchr(namelist[i]->d_name, '.')) || (p && strcmp(p, ".ini"))) {
++                                              free(namelist[i]);
++                                              continue;
++                                      }
++                                      /* Reset active ini section */
++                                      RESET_ACTIVE_INI_HASH();
++
++                                      if (IS_SLASH(ini_path[ini_path_len - 1])) {
++                                              snprintf(ini_file, MAXPATHLEN, "%s%s", ini_path, namelist[i]->d_name);
++                                      } else {
++                                              snprintf(ini_file, MAXPATHLEN, "%s%c%s", ini_path, DEFAULT_SLASH, namelist[i]->d_name);
++                                      }
++                                      if (VCWD_STAT(ini_file, &sb) == 0) {
++                                              if (S_ISREG(sb.st_mode)) {
++                                                      if ((fh2.handle.fp = VCWD_FOPEN(ini_file, "r"))) {
++                                                              fh2.filename = ini_file;
++                                                              fh2.type = ZEND_HANDLE_FP;
++
++                                                              /* Reset active ini section */
++                                                              RESET_ACTIVE_INI_HASH();
++
++                                                              if (zend_parse_ini_file(&fh2, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash TSRMLS_CC) == SUCCESS) {
++                                                                      /* Here, add it to the list of ini files read */
++                                                                      l = strlen(ini_file);
++                                                                      total_l += l + 2;
++                                                                      p = estrndup(ini_file, l);
++                                                                      zend_llist_add_element(&scanned_ini_list, &p);
++                                                              }
+                                                       }
+                                               }
+                                       }
++                                      free(namelist[i]);
+                               }
+-                              free(namelist[i]);
++                              free(namelist);
+                       }
+-                      free(namelist);
+-
+-                      if (total_l) {
+-                              int php_ini_scanned_files_len = (php_ini_scanned_files) ? strlen(php_ini_scanned_files) + 1 : 0;
+-                              php_ini_scanned_files = (char *) realloc(php_ini_scanned_files, php_ini_scanned_files_len + total_l + 1);
+-                              if (!php_ini_scanned_files_len) {
+-                                      *php_ini_scanned_files = '\0';
+-                              }
+-                              total_l += php_ini_scanned_files_len;
+-                              for (element = scanned_ini_list.head; element; element = element->next) {
+-                                      if (php_ini_scanned_files_len) {
+-                                              strlcat(php_ini_scanned_files, ",\n", total_l);
+-                                      }
+-                                      strlcat(php_ini_scanned_files, *(char **)element->data, total_l);
+-                                      strlcat(php_ini_scanned_files, element->next ? ",\n" : "\n", total_l);
++                      ini_path = php_strtok_r(NULL, paths_separator, &last);
++              }
++
++              if (total_l) {
++                      int php_ini_scanned_files_len = (php_ini_scanned_files) ? strlen(php_ini_scanned_files) + 1 : 0;
++                      php_ini_scanned_files = (char *) realloc(php_ini_scanned_files, php_ini_scanned_files_len + total_l + 1);
++                      if (!php_ini_scanned_files_len) {
++                              *php_ini_scanned_files = '\0';
++                      }
++                      total_l += php_ini_scanned_files_len;
++                      for (element = scanned_ini_list.head; element; element = element->next) {
++                              if (php_ini_scanned_files_len) {
++                                      strlcat(php_ini_scanned_files, ",\n", total_l);
+                               }
++                              strlcat(php_ini_scanned_files, *(char **)element->data, total_l);
++                              strlcat(php_ini_scanned_files, element->next ? ",\n" : "\n", total_l);
+                       }
+-                      zend_llist_destroy(&scanned_ini_list);
+               }
++              efree(path_copy);
++              zend_llist_destroy(&scanned_ini_list);
+       } else {
+               /* Make sure an empty php_ini_scanned_path ends up as NULL */
+               php_ini_scanned_path = NULL;