}
/* }}} */
-PHPAPI int _php_glob_stream_get_count(php_stream *stream STREAMS_DC TSRMLS_DC) /* {{{ */
+PHPAPI int _php_glob_stream_get_count(php_stream *stream, int *pflags STREAMS_DC TSRMLS_DC) /* {{{ */
{
glob_s_t *pglob = (glob_s_t *)stream->abstract;
-
- return pglob ? pglob->glob.gl_pathc : 0;
+
+ if (pglob) {
+ if (pflags) {
+ *pflags = pglob->flags;
+ }
+ return pglob->glob.gl_pathc;
+ } else {
+ if (pflags) {
+ *pflags = 0;
+ }
+ return 0;
+ }
}
/* }}} */
int options, char **opened_path, php_stream_context *context STREAMS_DC TSRMLS_DC)
{
glob_s_t *pglob;
- int ret;
+ int ret, path_len;
char *tmp, *pos;
if (((options & STREAM_DISABLE_OPEN_BASEDIR) == 0) && php_check_open_basedir(path TSRMLS_CC)) {
if (!strncmp(path, "glob://", sizeof("glob://")-1)) {
path += sizeof("glob://")-1;
+ path_len = strlen(path);
if (opened_path) {
- *opened_path = estrdup(path);
+ *opened_path = estrndup(path, path_len);
}
+ } else {
+ path_len = strlen(path);
}
pglob = ecalloc(sizeof(*pglob), 1);
}
}
-#ifdef GLOB_APPEND
- if ((pglob->flags & GLOB_APPEND) == 0)
-#endif
- {
- if (pglob->glob.gl_pathc) {
- php_glob_stream_path_split(pglob, pglob->glob.gl_pathv[0], 1, &tmp TSRMLS_CC);
- } else {
- php_glob_stream_path_split(pglob, path, 1, &tmp TSRMLS_CC);
- }
- }
-
pos = path;
if ((tmp = strrchr(pos, '/')) != NULL) {
pos = tmp+1;
pglob->pattern_len = strlen(pos);
pglob->pattern = estrndup(pos, pglob->pattern_len);
+ if (strcspn(path, "*?") < (path_len - pglob->pattern_len)) {
+ pglob->flags |= GLOB_APPEND;
+ }
+
+ if (pglob->glob.gl_pathc) {
+ php_glob_stream_path_split(pglob, pglob->glob.gl_pathv[0], 1, &tmp TSRMLS_CC);
+ } else {
+ php_glob_stream_path_split(pglob, path, 1, &tmp TSRMLS_CC);
+ }
+
return php_stream_alloc(&php_glob_stream_ops, pglob, 0, mode);
}
/* }}} */
PHPAPI char* _php_glob_stream_get_pattern(php_stream *stream, int copy, int *plen STREAMS_DC TSRMLS_DC);
#define php_glob_stream_get_pattern(stream, copy, plen) _php_glob_stream_get_pattern((stream), (copy), (plen) STREAMS_CC TSRMLS_CC)
-PHPAPI int _php_glob_stream_get_count(php_stream *stream STREAMS_DC TSRMLS_DC);
-#define php_glob_stream_get_count(stream) _php_glob_stream_get_count((stream) STREAMS_CC TSRMLS_CC)
+PHPAPI int _php_glob_stream_get_count(php_stream *stream, int *pflags STREAMS_DC TSRMLS_DC);
+#define php_glob_stream_get_count(stream, pflags) _php_glob_stream_get_count((stream), (pflags) STREAMS_CC TSRMLS_CC)
END_EXTERN_C()