]> granicus.if.org Git - php/commitdiff
PHP glob() will now emulate GLOB_ONLYDIR on non-GNU systems
authorHartmut Holzgraefe <hholzgra@php.net>
Thu, 3 Jul 2003 14:34:02 +0000 (14:34 +0000)
committerHartmut Holzgraefe <hholzgra@php.net>
Thu, 3 Jul 2003 14:34:02 +0000 (14:34 +0000)
ext/standard/dir.c

index b775ffa712bb198271702b6e03a4907457d0a828..c22eb673ab0f72f6f394c7aaab7ef50d6a864099 100644 (file)
@@ -141,9 +141,6 @@ PHP_MINIT_FUNCTION(dir)
 #ifdef GLOB_BRACE
        REGISTER_LONG_CONSTANT("GLOB_BRACE", GLOB_BRACE, CONST_CS | CONST_PERSISTENT);
 #endif
-#ifdef GLOB_ONLYDIR
-       REGISTER_LONG_CONSTANT("GLOB_ONLYDIR", GLOB_ONLYDIR, CONST_CS | CONST_PERSISTENT);
-#endif
 #ifdef GLOB_MARK
        REGISTER_LONG_CONSTANT("GLOB_MARK", GLOB_MARK, CONST_CS | CONST_PERSISTENT);
 #endif
@@ -156,6 +153,17 @@ PHP_MINIT_FUNCTION(dir)
 #ifdef GLOB_NOESCAPE
        REGISTER_LONG_CONSTANT("GLOB_NOESCAPE", GLOB_NOESCAPE, CONST_CS | CONST_PERSISTENT);
 #endif
+
+#ifndef GLOB_ONLYDIR
+#define GLOB_ONLYDIR (1<<30)
+#define GLOB_EMULATE_ONLYDIR
+#define GLOB_FLAGMASK (~GLOB_ONLYDIR)
+#else
+#define GLOB_FLAGMASK (~0)
+#endif
+
+       REGISTER_LONG_CONSTANT("GLOB_ONLYDIR", GLOB_ONLYDIR, CONST_CS | CONST_PERSISTENT);
+
 #endif
 
        return SUCCESS;
@@ -386,7 +394,7 @@ PHP_FUNCTION(glob)
 #endif
 
        globbuf.gl_offs = 0;
-       if (0 != (ret = glob(pattern, flags, NULL, &globbuf))) {
+       if (0 != (ret = glob(pattern, flags & GLOB_FLAGMASK, NULL, &globbuf))) {
 #ifdef GLOB_NOMATCH
                if (GLOB_NOMATCH == ret) {
                        /* Linux handles no matches as an error condition, but FreeBSD
@@ -421,6 +429,19 @@ PHP_FUNCTION(glob)
 
        array_init(return_value);
        for (n = 0; n < globbuf.gl_pathc; n++) {
+#ifdef GLOB_EMULATE_ONLYDIR
+               if (flags & GLOB_ONLYDIR) {
+                       struct stat s;
+
+                       if (0 != stat(globbuf.gl_pathv[n], &s)) {
+                               continue;
+                       }
+
+                       if (!S_ISDIR(s.st_mode)) {
+                               continue;
+                       }
+               }
+#endif
                add_next_index_string(return_value, globbuf.gl_pathv[n]+cwd_skip, 1);
        }