svn: /php/php-src/ branches/PHP_5_3/NEWS branches/PHP_5_3/ext/zip/zip_stream.c trunk/ext/zip/zip_stream.c

From: Date: Wed, 03 Nov 2010 21:48:08 +0000
Subject: svn: /php/php-src/ branches/PHP_5_3/NEWS branches/PHP_5_3/ext/zip/zip_stream.c trunk/ext/zip/zip_stream.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-63751@lists.php.net to get a copy of this message
pajoye Wed, 03 Nov 2010 21:48:08 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=305063 Log: - add stat support for zip:// Changed paths: U php/php-src/branches/PHP_5_3/NEWS U php/php-src/branches/PHP_5_3/ext/zip/zip_stream.c U php/php-src/trunk/ext/zip/zip_stream.c Modified: php/php-src/branches/PHP_5_3/NEWS =================================================================== --- php/php-src/branches/PHP_5_3/NEWS 2010-11-03 20:22:08 UTC (rev 305062) +++ php/php-src/branches/PHP_5_3/NEWS 2010-11-03 21:48:08 UTC (rev 305063) @@ -7,6 +7,7 @@ - Reverted fix for bug #51176 (Static calling in non-static method behaves like $this->). (Felipe) +- Added stat support for zip stream. (Pierre) - Added follow_location (enabled by default) option for the http stream support. (Pierre) - Added new character sets to mysqlnd, which are available in MySQL 5.5 Modified: php/php-src/branches/PHP_5_3/ext/zip/zip_stream.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/zip/zip_stream.c 2010-11-03 20:22:08 UTC (rev 305062) +++ php/php-src/branches/PHP_5_3/ext/zip/zip_stream.c 2010-11-03 21:48:08 UTC (rev 305063) @@ -95,13 +95,91 @@ } /* }}} */ +static int php_zip_ops_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC) /* {{{ */ +{ + struct zip_stat sb; + const char *path = stream->orig_path; + int path_len = strlen(stream->orig_path); + char *file_basename; + size_t file_basename_len; + char file_dirname[MAXPATHLEN]; + struct zip *za; + struct zip_file *zf = NULL; + char *fragment; + int fragment_len; + int err; + + fragment = strchr(path, '#'); + if (!fragment) { + return -1; + } + + + if (strncasecmp("zip://", path, 6) == 0) { + path += 6; + } + + fragment_len = strlen(fragment); + + if (fragment_len < 1) { + return -1; + } + path_len = strlen(path); + if (path_len >= MAXPATHLEN) { + return -1; + } + + memcpy(file_dirname, path, path_len - fragment_len); + file_dirname[path_len - fragment_len] = '\0'; + + php_basename((char *)path, path_len - fragment_len, NULL, 0, &file_basename, &file_basename_len TSRMLS_CC); + fragment++; + + if (ZIP_OPENBASEDIR_CHECKPATH(file_dirname)) { + efree(file_basename); + return -1; + } + + za = zip_open(file_dirname, ZIP_CREATE, &err); + if (za) { + memset(ssb, 0, sizeof(php_stream_statbuf)); + if (zip_stat(za, fragment, ZIP_FL_NOCASE, &sb) != 0) { + efree(file_basename); + return -1; + } + zip_close(za); + + if (path[path_len-1] != '/') { + ssb->sb.st_size = sb.size; + ssb->sb.st_mode |= S_IFREG; /* regular file */ + } else { + ssb->sb.st_size = 0; + ssb->sb.st_mode |= S_IFDIR; /* regular directory */ + } + + ssb->sb.st_mtime = sb.mtime; + ssb->sb.st_atime = sb.mtime; + ssb->sb.st_ctime = sb.mtime; + ssb->sb.st_nlink = 1; + ssb->sb.st_rdev = -1; +#ifndef PHP_WIN32 + ssb->sb.st_blksize = -1; + ssb->sb.st_blocks = -1; +#endif + ssb->sb.st_ino = -1; + } + efree(file_basename); + return 0; +} +/* }}} */ + php_stream_ops php_stream_zipio_ops = { php_zip_ops_write, php_zip_ops_read, php_zip_ops_close, php_zip_ops_flush, "zip", NULL, /* seek */ NULL, /* cast */ - NULL, /* stat */ + php_zip_ops_stat, /* stat */ NULL /* set_option */ }; Modified: php/php-src/trunk/ext/zip/zip_stream.c =================================================================== --- php/php-src/trunk/ext/zip/zip_stream.c 2010-11-03 20:22:08 UTC (rev 305062) +++ php/php-src/trunk/ext/zip/zip_stream.c 2010-11-03 21:48:08 UTC (rev 305063) @@ -95,13 +95,91 @@ } /* }}} */ +static int php_zip_ops_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC) /* {{{ */ +{ + struct zip_stat sb; + const char *path = stream->orig_path; + int path_len = strlen(stream->orig_path); + char *file_basename; + size_t file_basename_len; + char file_dirname[MAXPATHLEN]; + struct zip *za; + struct zip_file *zf = NULL; + char *fragment; + int fragment_len; + int err; + + fragment = strchr(path, '#'); + if (!fragment) { + return -1; + } + + + if (strncasecmp("zip://", path, 6) == 0) { + path += 6; + } + + fragment_len = strlen(fragment); + + if (fragment_len < 1) { + return -1; + } + path_len = strlen(path); + if (path_len >= MAXPATHLEN) { + return -1; + } + + memcpy(file_dirname, path, path_len - fragment_len); + file_dirname[path_len - fragment_len] = '\0'; + + php_basename((char *)path, path_len - fragment_len, NULL, 0, &file_basename, &file_basename_len TSRMLS_CC); + fragment++; + + if (ZIP_OPENBASEDIR_CHECKPATH(file_dirname)) { + efree(file_basename); + return -1; + } + + za = zip_open(file_dirname, ZIP_CREATE, &err); + if (za) { + memset(ssb, 0, sizeof(php_stream_statbuf)); + if (zip_stat(za, fragment, ZIP_FL_NOCASE, &sb) != 0) { + efree(file_basename); + return -1; + } + zip_close(za); + + if (path[path_len-1] != '/') { + ssb->sb.st_size = sb.size; + ssb->sb.st_mode |= S_IFREG; /* regular file */ + } else { + ssb->sb.st_size = 0; + ssb->sb.st_mode |= S_IFDIR; /* regular directory */ + } + + ssb->sb.st_mtime = sb.mtime; + ssb->sb.st_atime = sb.mtime; + ssb->sb.st_ctime = sb.mtime; + ssb->sb.st_nlink = 1; + ssb->sb.st_rdev = -1; +#ifndef PHP_WIN32 + ssb->sb.st_blksize = -1; + ssb->sb.st_blocks = -1; +#endif + ssb->sb.st_ino = -1; + } + efree(file_basename); + return 0; +} +/* }}} */ + php_stream_ops php_stream_zipio_ops = { php_zip_ops_write, php_zip_ops_read, php_zip_ops_close, php_zip_ops_flush, "zip", NULL, /* seek */ NULL, /* cast */ - NULL, /* stat */ + php_zip_ops_stat, /* stat */ NULL /* set_option */ };

« previous php.cvs (#63751) next »