]> granicus.if.org Git - php/commitdiff
- Store min/max timestamp of entries while building manifest and use max
authorMarcus Boerger <helly@php.net>
Thu, 2 Mar 2006 22:44:39 +0000 (22:44 +0000)
committerMarcus Boerger <helly@php.net>
Thu, 2 Mar 2006 22:44:39 +0000 (22:44 +0000)
  value for a/c/m-time of dirirectory stats.

ext/phar/phar.c
ext/phar/tests/020.phpt
ext/phar/tests/022.phpt
ext/phar/tests/phar_oo_002.phpt
ext/phar/tests/phar_oo_test.inc

index 01ec4970a72f5faa869c4d95d88e9135a66eee1d..b8221954aec2f84b06e1ca8545a1da18897b5569 100644 (file)
@@ -114,6 +114,8 @@ typedef struct _phar_archieve_data {
        size_t                   internal_file_start;
        zend_bool                has_compressed_files;
        HashTable                manifest;
+       php_uint32               min_timestamp;
+       php_uint32               max_timestamp;
        php_stream               *fp;
 } phar_archieve_data;
 
@@ -121,7 +123,7 @@ typedef struct _phar_archieve_data {
 typedef struct _phar_entry_data {
        phar_archieve_data       *phar;
        php_stream               *fp;
-       phar_entry_info      *internal_file;
+       phar_entry_info          *internal_file;
 } phar_entry_data;
 
 /* archieve php object */
@@ -452,6 +454,8 @@ static int phar_open_file(php_stream *fp, char *fname, int fname_len, char *alia
        zend_hash_init(&mydata.manifest, sizeof(phar_entry_info),
                zend_get_hash_value, destroy_phar_manifest, 0);
        offset = 0;
+       mydata.min_timestamp = 0;
+       mydata.max_timestamp = 0;
        for (manifest_index = 0; manifest_index < manifest_count; manifest_index++) {
                if (buffer + 4 > endbuffer) {
                        MAPPHAR_FAIL("internal corruption of phar \"%s\" (truncated manifest entry)")
@@ -467,6 +471,16 @@ static int phar_open_file(php_stream *fp, char *fname, int fname_len, char *alia
                buffer += entry.filename_len;
                PHAR_GET_32(buffer, entry.uncompressed_filesize);
                PHAR_GET_32(buffer, entry.timestamp);
+               if (offset == 0) {
+                       mydata.min_timestamp = entry.timestamp;
+                       mydata.max_timestamp = entry.timestamp;
+               } else {
+                       if (mydata.min_timestamp > entry.timestamp) {
+                               mydata.min_timestamp = entry.timestamp;
+                       } else if (mydata.max_timestamp < entry.timestamp) {
+                               mydata.max_timestamp = entry.timestamp;
+                       }
+               }
                PHAR_GET_32(buffer, entry.compressed_filesize);
                PHAR_GET_32(buffer, entry.crc32);
                entry.offset_within_phar = offset;
@@ -1087,23 +1101,9 @@ static int phar_flush(php_stream *stream TSRMLS_DC) /* {{{ */
 }
 /* }}} */
 
-static void phar_dostat(phar_entry_info *data, php_stream_statbuf *ssb, zend_bool is_dir, char *alias,
-                       int alias_len TSRMLS_DC);
-
-static int phar_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC) /* {{{ */
-{
-       phar_entry_data *data;
-       /* If ssb is NULL then someone is misbehaving */
-       if (!ssb) return -1;
-
-       data = (phar_entry_data *)stream->abstract;
-       phar_dostat(data->internal_file, ssb, 0, data->phar->alias, data->phar->alias_len TSRMLS_CC);
-       return 0;
-}
-/* }}} */
-
-static void phar_dostat(phar_entry_info *data, php_stream_statbuf *ssb, zend_bool is_dir, char *alias,
-                       int alias_len TSRMLS_DC) /* {{{ */
+ /* {{{ phar_dostat */
+static void phar_dostat(phar_archieve_data *phar, phar_entry_info *data, php_stream_statbuf *ssb, 
+                       zend_bool is_dir, char *alias, int alias_len TSRMLS_DC)
 {
        char *tmp;
        int tmp_len;
@@ -1128,13 +1128,13 @@ static void phar_dostat(phar_entry_info *data, php_stream_statbuf *ssb, zend_boo
                ssb->sb.st_size = 0;
                ssb->sb.st_mode |= S_IFDIR; /* regular directory */
 #ifdef NETWARE
-               ssb->sb.st_mtime.tv_sec = 0;
-               ssb->sb.st_atime.tv_sec = 0;
-               ssb->sb.st_ctime.tv_sec = 0;
+               ssb->sb.st_mtime.tv_sec = phar->max_timestamp;
+               ssb->sb.st_atime.tv_sec = phar->max_timestamp;
+               ssb->sb.st_ctime.tv_sec = phar->max_timestamp;
 #else
-               ssb->sb.st_mtime = 0;
-               ssb->sb.st_atime = 0;
-               ssb->sb.st_ctime = 0;
+               ssb->sb.st_mtime = phar->max_timestamp;
+               ssb->sb.st_atime = phar->max_timestamp;
+               ssb->sb.st_ctime = phar->max_timestamp;
 #endif
        }
 
@@ -1164,6 +1164,18 @@ static void phar_dostat(phar_entry_info *data, php_stream_statbuf *ssb, zend_boo
 }
 /* }}}*/
 
+static int phar_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_DC) /* {{{ */
+{
+       phar_entry_data *data;
+       /* If ssb is NULL then someone is misbehaving */
+       if (!ssb) return -1;
+
+       data = (phar_entry_data *)stream->abstract;
+       phar_dostat(data->phar, data->internal_file, ssb, 0, data->phar->alias, data->phar->alias_len TSRMLS_CC);
+       return 0;
+}
+/* }}} */
+
 static int phar_stream_stat(php_stream_wrapper *wrapper, char *url, int flags,
                                  php_stream_statbuf *ssb, php_stream_context *context TSRMLS_DC) /* {{{ */
 {
@@ -1198,13 +1210,13 @@ static int phar_stream_stat(php_stream_wrapper *wrapper, char *url, int flags,
        if ((phar = phar_get_archieve(resource->host, strlen(resource->host), NULL, 0 TSRMLS_CC)) != NULL) {
                if (*internal_file == '\0') {
                        /* root directory requested */
-                       phar_dostat(NULL, ssb, 1, phar->alias, phar->alias_len TSRMLS_CC);
+                       phar_dostat(phar, NULL, ssb, 1, phar->alias, phar->alias_len TSRMLS_CC);
                        php_url_free(resource);
                        return 0;
                }
                /* search through the manifest of files, and if we have an exact match, it's a file */
                if (SUCCESS == zend_hash_find(&phar->manifest, internal_file, strlen(internal_file), (void**)&entry)) {
-                       phar_dostat(entry, ssb, 0, phar->alias, phar->alias_len TSRMLS_CC);
+                       phar_dostat(phar, entry, ssb, 0, phar->alias, phar->alias_len TSRMLS_CC);
                } else {
                        /* search for directory (partial match of a file) */
                        zend_hash_internal_pointer_reset(&phar->manifest);
@@ -1215,7 +1227,7 @@ static int phar_stream_stat(php_stream_wrapper *wrapper, char *url, int flags,
                                        if (0 == memcmp(internal_file, key, strlen(internal_file))) {
                                                /* directory found, all dirs have the same stat */
                                                if (key[strlen(internal_file)] == '/') {
-                                                       phar_dostat(NULL, ssb, 1, phar->alias, phar->alias_len TSRMLS_CC);
+                                                       phar_dostat(phar, NULL, ssb, 1, phar->alias, phar->alias_len TSRMLS_CC);
                                                        break;
                                                }
                                        }
index 1ae17adf4224e7f9eb37f7b1e2f40e28cbe17e4a..a9cbbca7b2f7a6734d1895efcb0c3a09418e6393 100644 (file)
@@ -105,11 +105,11 @@ array(26) {
   [7]=>
   int(0)
   [8]=>
-  int(0)
+  int(%d)
   [9]=>
-  int(0)
+  int(%d)
   [10]=>
-  int(0)
+  int(%d)
   [11]=>
   int(-1)
   [12]=>
@@ -131,11 +131,11 @@ array(26) {
   ["size"]=>
   int(0)
   ["atime"]=>
-  int(0)
+  int(%d)
   ["mtime"]=>
-  int(0)
+  int(%d)
   ["ctime"]=>
-  int(0)
+  int(%d)
   ["blksize"]=>
   int(-1)
   ["blocks"]=>
index c914dbea6a0799beb1557e71aa6dcff3ac8489de..5835640fa3b31f63af7bbad664e300fdca031dff 100644 (file)
@@ -71,7 +71,10 @@ var_dump(ftell($fp));
 fclose($fp);
 ?>
 --CLEAN--
-<?php unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php'); ?>
+<?php
+unlink(dirname(__FILE__) . '/' . basename(__FILE__, '.clean.php') . '.phar.php');
+exit(0);
+ ?>
 --EXPECT--
 int(0)
 fseek($fp, 1)int(0)
index c229264f7a86aae1ba0f872d300c4aa28dcedcfb..f937f4b9e26f3888e69a52d7ac08e5355c84ea74 100755 (executable)
@@ -21,6 +21,9 @@ foreach($phar as $name => $ent)
        var_dump($ent->isFile());
        var_dump($ent->isDir());
        var_dump($ent->isLink());
+       var_dump($ent->getCTime());
+       var_dump($ent->getMTime());
+       var_dump($ent->getATime());
 }
 
 echo "==RECURSIVE==\n";
@@ -54,6 +57,9 @@ bool(false)
 bool(true)
 bool(false)
 bool(false)
+int(1141214400)
+int(1141214400)
+int(1141214400)
 string(32) "phar://*/phar_oo_test.phar.php/b"
 string(1) "b"
 int(0)
@@ -64,6 +70,9 @@ bool(false)
 bool(false)
 bool(true)
 bool(false)
+int(1141214400)
+int(1141214400)
+int(1141214400)
 string(36) "phar://*/phar_oo_test.phar.php/b.php"
 string(5) "b.php"
 int(32)
@@ -74,6 +83,9 @@ bool(false)
 bool(true)
 bool(false)
 bool(false)
+int(1141214400)
+int(1141214400)
+int(1141214400)
 string(36) "phar://*/phar_oo_test.phar.php/e.php"
 string(5) "e.php"
 int(32)
@@ -84,6 +96,9 @@ bool(false)
 bool(true)
 bool(false)
 bool(false)
+int(1141214400)
+int(1141214400)
+int(1141214400)
 ==RECURSIVE==
 string(36) "phar://*/phar_oo_test.phar.php/a.php"
 string(5) "a.php"
index d5933a19f573dc39e56dfacb0aac84db3a1c51e9..fc79a18edf327eaa00c6d0bb02045ee7565c7d8f 100755 (executable)
@@ -1,5 +1,7 @@
 <?php
 
+ini_set('date.timezone', 'GMT');
+
 $fname = dirname(__FILE__) . '/phar_oo_test.phar.php';
 $pname = 'phar://' . $fname;
 $file = '<?php include "' . $pname . '/a.php"; __HALT_COMPILER(); ?>';
@@ -14,7 +16,7 @@ $files['e.php']   = '<?php echo "This is e.php\n"; ?>';
 $manifest = '';
 foreach($files as $name => $cont) {
        $len = strlen($cont);
-       $manifest .= pack('V', strlen($name)) . $name . pack('VVVVC', $len, time(), $len, crc32($cont), 0x00);
+       $manifest .= pack('V', strlen($name)) . $name . pack('VVVVC', $len, mktime (12, 0, 0, 3, 1, 2006), $len, crc32($cont), 0x00);
 }
 $alias = 'alias';
 $manifest = pack('VnV', count($files), 0x0800, strlen($alias)) . $alias . $manifest;