Diff for /embedaddon/php/ext/phar/phar_object.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2012/05/29 12:34:41 version 1.1.1.3, 2013/07/22 01:31:59
Line 2 Line 2
   +----------------------------------------------------------------------+    +----------------------------------------------------------------------+
   | phar php single-file executable PHP extension                        |    | phar php single-file executable PHP extension                        |
   +----------------------------------------------------------------------+    +----------------------------------------------------------------------+
  | Copyright (c) 2005-2012 The PHP Group                                |  | Copyright (c) 2005-2013 The PHP Group                                |
   +----------------------------------------------------------------------+    +----------------------------------------------------------------------+
   | This source file is subject to version 3.01 of the PHP license,      |    | This source file is subject to version 3.01 of the PHP license,      |
   | that is bundled with this package in the file LICENSE, and is        |    | that is bundled with this package in the file LICENSE, and is        |
Line 58  static int phar_file_type(HashTable *mimes, char *file Line 58  static int phar_file_type(HashTable *mimes, char *file
   
 static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char *basename, int request_uri_len TSRMLS_DC) /* {{{ */  static void phar_mung_server_vars(char *fname, char *entry, int entry_len, char *basename, int request_uri_len TSRMLS_DC) /* {{{ */
 {  {
 #if PHP_MAJOR_VERSION >= 6  
         int is_unicode = 0;  
 #endif  
         HashTable *_SERVER;          HashTable *_SERVER;
         zval **stuff;          zval **stuff;
         char *path_info;          char *path_info;
Line 76  static void phar_mung_server_vars(char *fname, char *e Line 73  static void phar_mung_server_vars(char *fname, char *e
         _SERVER = Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]);          _SERVER = Z_ARRVAL_P(PG(http_globals)[TRACK_VARS_SERVER]);
   
         /* PATH_INFO and PATH_TRANSLATED should always be munged */          /* PATH_INFO and PATH_TRANSLATED should always be munged */
 #if PHP_MAJOR_VERSION >= 6  
         if (phar_find_key(_SERVER, "PATH_INFO", sizeof("PATH_INFO"), (void **) &stuff TSRMLS_CC)) {  
                 if (Z_TYPE_PP(stuff) == IS_UNICODE) {  
                         is_unicode = 1;  
                         zval_unicode_to_string(*stuff TSRMLS_CC);  
                 } else {  
                         is_unicode = 0;  
                 }  
 #else  
         if (SUCCESS == zend_hash_find(_SERVER, "PATH_INFO", sizeof("PATH_INFO"), (void **) &stuff)) {          if (SUCCESS == zend_hash_find(_SERVER, "PATH_INFO", sizeof("PATH_INFO"), (void **) &stuff)) {
 #endif  
   
                 path_info = Z_STRVAL_PP(stuff);                  path_info = Z_STRVAL_PP(stuff);
                 code = Z_STRLEN_PP(stuff);                  code = Z_STRLEN_PP(stuff);
   
Line 96  static void phar_mung_server_vars(char *fname, char *e Line 82  static void phar_mung_server_vars(char *fname, char *e
   
                         MAKE_STD_ZVAL(temp);                          MAKE_STD_ZVAL(temp);
                         ZVAL_STRINGL(temp, path_info, code, 0);                          ZVAL_STRINGL(temp, path_info, code, 0);
#if PHP_MAJOR_VERSION >= 6
                        if (is_unicode) { 
                                zval_string_to_unicode(*stuff TSRMLS_CC); 
                        } 
#endif 
                         zend_hash_update(_SERVER, "PHAR_PATH_INFO", sizeof("PHAR_PATH_INFO"), &temp, sizeof(zval **), NULL);                          zend_hash_update(_SERVER, "PHAR_PATH_INFO", sizeof("PHAR_PATH_INFO"), &temp, sizeof(zval **), NULL);
                 }                  }
         }          }
   
 #if PHP_MAJOR_VERSION >= 6  
         if (phar_find_key(_SERVER, "PATH_TRANSLATED", sizeof("PATH_TRANSLATED"), (void **) &stuff TSRMLS_CC)) {  
                 if (Z_TYPE_PP(stuff) == IS_UNICODE) {  
                         is_unicode = 1;  
                         zval_unicode_to_string(*stuff TSRMLS_CC);  
                 } else {  
                         is_unicode = 0;  
                 }  
 #else  
         if (SUCCESS == zend_hash_find(_SERVER, "PATH_TRANSLATED", sizeof("PATH_TRANSLATED"), (void **) &stuff)) {          if (SUCCESS == zend_hash_find(_SERVER, "PATH_TRANSLATED", sizeof("PATH_TRANSLATED"), (void **) &stuff)) {
 #endif  
   
                 path_info = Z_STRVAL_PP(stuff);                  path_info = Z_STRVAL_PP(stuff);
                 code = Z_STRLEN_PP(stuff);                  code = Z_STRLEN_PP(stuff);
                 Z_STRLEN_PP(stuff) = spprintf(&(Z_STRVAL_PP(stuff)), 4096, "phar://%s%s", fname, entry);                  Z_STRLEN_PP(stuff) = spprintf(&(Z_STRVAL_PP(stuff)), 4096, "phar://%s%s", fname, entry);
   
                 MAKE_STD_ZVAL(temp);                  MAKE_STD_ZVAL(temp);
                 ZVAL_STRINGL(temp, path_info, code, 0);                  ZVAL_STRINGL(temp, path_info, code, 0);
#if PHP_MAJOR_VERSION >= 6
                if (is_unicode) { 
                        zval_string_to_unicode(*stuff TSRMLS_CC); 
                } 
#endif 
                 zend_hash_update(_SERVER, "PHAR_PATH_TRANSLATED", sizeof("PHAR_PATH_TRANSLATED"), (void *) &temp, sizeof(zval **), NULL);                  zend_hash_update(_SERVER, "PHAR_PATH_TRANSLATED", sizeof("PHAR_PATH_TRANSLATED"), (void *) &temp, sizeof(zval **), NULL);
         }          }
   
Line 136  static void phar_mung_server_vars(char *fname, char *e Line 103  static void phar_mung_server_vars(char *fname, char *e
         }          }
   
         if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_REQUEST_URI) {          if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_REQUEST_URI) {
 #if PHP_MAJOR_VERSION >= 6  
                 if (phar_find_key(_SERVER, "REQUEST_URI", sizeof("REQUEST_URI"), (void **) &stuff TSRMLS_CC)) {  
                 if (Z_TYPE_PP(stuff) == IS_UNICODE) {  
                         is_unicode = 1;  
                         zval_unicode_to_string(*stuff TSRMLS_CC);  
                 } else {  
                         is_unicode = 0;  
                 }  
 #else  
                 if (SUCCESS == zend_hash_find(_SERVER, "REQUEST_URI", sizeof("REQUEST_URI"), (void **) &stuff)) {                  if (SUCCESS == zend_hash_find(_SERVER, "REQUEST_URI", sizeof("REQUEST_URI"), (void **) &stuff)) {
 #endif  
   
                         path_info = Z_STRVAL_PP(stuff);                          path_info = Z_STRVAL_PP(stuff);
                         code = Z_STRLEN_PP(stuff);                          code = Z_STRLEN_PP(stuff);
   
Line 156  static void phar_mung_server_vars(char *fname, char *e Line 112  static void phar_mung_server_vars(char *fname, char *e
   
                                 MAKE_STD_ZVAL(temp);                                  MAKE_STD_ZVAL(temp);
                                 ZVAL_STRINGL(temp, path_info, code, 0);                                  ZVAL_STRINGL(temp, path_info, code, 0);
#if PHP_MAJOR_VERSION >= 6
                                if (is_unicode) { 
                                        zval_string_to_unicode(*stuff TSRMLS_CC); 
                                } 
#endif 
                                 zend_hash_update(_SERVER, "PHAR_REQUEST_URI", sizeof("PHAR_REQUEST_URI"), (void *) &temp, sizeof(zval **), NULL);                                  zend_hash_update(_SERVER, "PHAR_REQUEST_URI", sizeof("PHAR_REQUEST_URI"), (void *) &temp, sizeof(zval **), NULL);
                         }                          }
                 }                  }
         }          }
   
         if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_PHP_SELF) {          if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_PHP_SELF) {
 #if PHP_MAJOR_VERSION >= 6  
                 if (phar_find_key(_SERVER, "PHP_SELF", sizeof("PHP_SELF"), (void **) &stuff TSRMLS_CC)) {  
                 if (Z_TYPE_PP(stuff) == IS_UNICODE) {  
                         is_unicode = 1;  
                         zval_unicode_to_string(*stuff TSRMLS_CC);  
                 } else {  
                         is_unicode = 0;  
                 }  
 #else  
                 if (SUCCESS == zend_hash_find(_SERVER, "PHP_SELF", sizeof("PHP_SELF"), (void **) &stuff)) {                  if (SUCCESS == zend_hash_find(_SERVER, "PHP_SELF", sizeof("PHP_SELF"), (void **) &stuff)) {
 #endif  
   
                         path_info = Z_STRVAL_PP(stuff);                          path_info = Z_STRVAL_PP(stuff);
                         code = Z_STRLEN_PP(stuff);                          code = Z_STRLEN_PP(stuff);
   
Line 187  static void phar_mung_server_vars(char *fname, char *e Line 128  static void phar_mung_server_vars(char *fname, char *e
   
                                 MAKE_STD_ZVAL(temp);                                  MAKE_STD_ZVAL(temp);
                                 ZVAL_STRINGL(temp, path_info, code, 0);                                  ZVAL_STRINGL(temp, path_info, code, 0);
#if PHP_MAJOR_VERSION >= 6
                                if (is_unicode) { 
                                        zval_string_to_unicode(*stuff TSRMLS_CC); 
                                } 
#endif 
                                 zend_hash_update(_SERVER, "PHAR_PHP_SELF", sizeof("PHAR_PHP_SELF"), (void *) &temp, sizeof(zval **), NULL);                                  zend_hash_update(_SERVER, "PHAR_PHP_SELF", sizeof("PHAR_PHP_SELF"), (void *) &temp, sizeof(zval **), NULL);
                         }                          }
                 }                  }
         }          }
   
         if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_SCRIPT_NAME) {          if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_SCRIPT_NAME) {
 #if PHP_MAJOR_VERSION >= 6  
                 if (phar_find_key(_SERVER, "SCRIPT_NAME", sizeof("SCRIPT_NAME"), (void **) &stuff TSRMLS_CC)) {  
                 if (Z_TYPE_PP(stuff) == IS_UNICODE) {  
                         is_unicode = 1;  
                         zval_unicode_to_string(*stuff TSRMLS_CC);  
                 } else {  
                         is_unicode = 0;  
                 }  
 #else  
                 if (SUCCESS == zend_hash_find(_SERVER, "SCRIPT_NAME", sizeof("SCRIPT_NAME"), (void **) &stuff)) {                  if (SUCCESS == zend_hash_find(_SERVER, "SCRIPT_NAME", sizeof("SCRIPT_NAME"), (void **) &stuff)) {
 #endif  
   
                         path_info = Z_STRVAL_PP(stuff);                          path_info = Z_STRVAL_PP(stuff);
                         code = Z_STRLEN_PP(stuff);                          code = Z_STRLEN_PP(stuff);
                         ZVAL_STRINGL(*stuff, entry, entry_len, 1);                          ZVAL_STRINGL(*stuff, entry, entry_len, 1);
   
                         MAKE_STD_ZVAL(temp);                          MAKE_STD_ZVAL(temp);
                         ZVAL_STRINGL(temp, path_info, code, 0);                          ZVAL_STRINGL(temp, path_info, code, 0);
#if PHP_MAJOR_VERSION >= 6
                        if (is_unicode) { 
                                zval_string_to_unicode(*stuff TSRMLS_CC); 
                        } 
#endif 
                         zend_hash_update(_SERVER, "PHAR_SCRIPT_NAME", sizeof("PHAR_SCRIPT_NAME"), (void *) &temp, sizeof(zval **), NULL);                          zend_hash_update(_SERVER, "PHAR_SCRIPT_NAME", sizeof("PHAR_SCRIPT_NAME"), (void *) &temp, sizeof(zval **), NULL);
                 }                  }
         }          }
   
         if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_SCRIPT_FILENAME) {          if (PHAR_GLOBALS->phar_SERVER_mung_list & PHAR_MUNG_SCRIPT_FILENAME) {
 #if PHP_MAJOR_VERSION >= 6  
                 if (phar_find_key(_SERVER, "SCRIPT_FILENAME", sizeof("SCRIPT_FILENAME"), (void **) &stuff TSRMLS_CC)) {  
                 if (Z_TYPE_PP(stuff) == IS_UNICODE) {  
                         is_unicode = 1;  
                         zval_unicode_to_string(*stuff TSRMLS_CC);  
                 } else {  
                         is_unicode = 0;  
                 }  
 #else  
                 if (SUCCESS == zend_hash_find(_SERVER, "SCRIPT_FILENAME", sizeof("SCRIPT_FILENAME"), (void **) &stuff)) {                  if (SUCCESS == zend_hash_find(_SERVER, "SCRIPT_FILENAME", sizeof("SCRIPT_FILENAME"), (void **) &stuff)) {
 #endif  
   
                         path_info = Z_STRVAL_PP(stuff);                          path_info = Z_STRVAL_PP(stuff);
                         code = Z_STRLEN_PP(stuff);                          code = Z_STRLEN_PP(stuff);
                         Z_STRLEN_PP(stuff) = spprintf(&(Z_STRVAL_PP(stuff)), 4096, "phar://%s%s", fname, entry);                          Z_STRLEN_PP(stuff) = spprintf(&(Z_STRVAL_PP(stuff)), 4096, "phar://%s%s", fname, entry);
   
                         MAKE_STD_ZVAL(temp);                          MAKE_STD_ZVAL(temp);
                         ZVAL_STRINGL(temp, path_info, code, 0);                          ZVAL_STRINGL(temp, path_info, code, 0);
#if PHP_MAJOR_VERSION >= 6
                        if (is_unicode) { 
                                zval_string_to_unicode(*stuff TSRMLS_CC); 
                        } 
#endif 
                         zend_hash_update(_SERVER, "PHAR_SCRIPT_FILENAME", sizeof("PHAR_SCRIPT_FILENAME"), (void *) &temp, sizeof(zval **), NULL);                          zend_hash_update(_SERVER, "PHAR_SCRIPT_FILENAME", sizeof("PHAR_SCRIPT_FILENAME"), (void *) &temp, sizeof(zval **), NULL);
                 }                  }
         }          }
Line 942  PHP_METHOD(Phar, webPhar) Line 849  PHP_METHOD(Phar, webPhar)
                 if (ext) {                  if (ext) {
                         ++ext;                          ++ext;
   
 #if PHP_MAJOR_VERSION >= 6  
                         if (phar_find_key(Z_ARRVAL_P(mimeoverride), ext, strlen(ext)+1, (void **) &val TSRMLS_CC)) {  
 #else  
                         if (SUCCESS == zend_hash_find(Z_ARRVAL_P(mimeoverride), ext, strlen(ext)+1, (void **) &val)) {                          if (SUCCESS == zend_hash_find(Z_ARRVAL_P(mimeoverride), ext, strlen(ext)+1, (void **) &val)) {
 #endif  
                                 switch (Z_TYPE_PP(val)) {                                  switch (Z_TYPE_PP(val)) {
                                         case IS_LONG:                                          case IS_LONG:
                                                 if (Z_LVAL_PP(val) == PHAR_MIME_PHP || Z_LVAL_PP(val) == PHAR_MIME_PHPS) {                                                  if (Z_LVAL_PP(val) == PHAR_MIME_PHP || Z_LVAL_PP(val) == PHAR_MIME_PHPS) {
Line 960  PHP_METHOD(Phar, webPhar) Line 863  PHP_METHOD(Phar, webPhar)
                                                         RETURN_FALSE;                                                          RETURN_FALSE;
                                                 }                                                  }
                                                 break;                                                  break;
 #if PHP_MAJOR_VERSION >= 6  
                                         case IS_UNICODE:  
                                                 zval_unicode_to_string(*(val) TSRMLS_CC);  
                                                 /* break intentionally omitted */  
 #endif  
                                         case IS_STRING:                                          case IS_STRING:
                                                 mime_type = Z_STRVAL_PP(val);                                                  mime_type = Z_STRVAL_PP(val);
                                                 code = PHAR_MIME_OTHER;                                                  code = PHAR_MIME_OTHER;
Line 1015  PHP_METHOD(Phar, mungServer) Line 913  PHP_METHOD(Phar, mungServer)
   
         for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(mungvalues)); SUCCESS == zend_hash_has_more_elements(Z_ARRVAL_P(mungvalues)); zend_hash_move_forward(Z_ARRVAL_P(mungvalues))) {          for (zend_hash_internal_pointer_reset(Z_ARRVAL_P(mungvalues)); SUCCESS == zend_hash_has_more_elements(Z_ARRVAL_P(mungvalues)); zend_hash_move_forward(Z_ARRVAL_P(mungvalues))) {
                 zval **data = NULL;                  zval **data = NULL;
 #if PHP_MAJOR_VERSION >= 6  
                 zval *unicopy = NULL;  
 #endif  
   
                 if (SUCCESS != zend_hash_get_current_data(Z_ARRVAL_P(mungvalues), (void **) &data)) {                  if (SUCCESS != zend_hash_get_current_data(Z_ARRVAL_P(mungvalues), (void **) &data)) {
                         zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "unable to retrieve array value in Phar::mungServer()");                          zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "unable to retrieve array value in Phar::mungServer()");
                         return;                          return;
                 }                  }
   
 #if PHP_MAJOR_VERSION >= 6  
                 if (Z_TYPE_PP(data) == IS_UNICODE) {  
                         MAKE_STD_ZVAL(unicopy);  
                         *unicopy = **data;  
                         zval_copy_ctor(unicopy);  
                         INIT_PZVAL(unicopy);  
                         zval_unicode_to_string(unicopy TSRMLS_CC);  
                         data = &unicopy;  
                 }  
 #endif  
   
                 if (Z_TYPE_PP(data) != IS_STRING) {                  if (Z_TYPE_PP(data) != IS_STRING) {
                         zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Non-string value passed to Phar::mungServer(), expecting an array of any of these strings: PHP_SELF, REQUEST_URI, SCRIPT_FILENAME, SCRIPT_NAME");                          zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "Non-string value passed to Phar::mungServer(), expecting an array of any of these strings: PHP_SELF, REQUEST_URI, SCRIPT_FILENAME, SCRIPT_NAME");
                         return;                          return;
Line 1056  PHP_METHOD(Phar, mungServer) Line 940  PHP_METHOD(Phar, mungServer)
                 if (Z_STRLEN_PP(data) == sizeof("SCRIPT_FILENAME")-1 && !strncmp(Z_STRVAL_PP(data), "SCRIPT_FILENAME", sizeof("SCRIPT_FILENAME")-1)) {                  if (Z_STRLEN_PP(data) == sizeof("SCRIPT_FILENAME")-1 && !strncmp(Z_STRVAL_PP(data), "SCRIPT_FILENAME", sizeof("SCRIPT_FILENAME")-1)) {
                         PHAR_GLOBALS->phar_SERVER_mung_list |= PHAR_MUNG_SCRIPT_FILENAME;                          PHAR_GLOBALS->phar_SERVER_mung_list |= PHAR_MUNG_SCRIPT_FILENAME;
                 }                  }
 #if PHP_MAJOR_VERSION >= 6  
                 if (unicopy) {  
                         zval_ptr_dtor(&unicopy);  
                 }  
 #endif  
         }          }
 }  }
 /* }}} */  /* }}} */
Line 2020  PHP_METHOD(Phar, buildFromDirectory) Line 1899  PHP_METHOD(Phar, buildFromDirectory)
         pass.count = 0;          pass.count = 0;
         pass.ret = return_value;          pass.ret = return_value;
         pass.fp = php_stream_fopen_tmpfile();          pass.fp = php_stream_fopen_tmpfile();
           if (pass.fp == NULL) {
                   zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "phar \"%s\" unable to create temporary file", phar_obj->arc.archive->fname);
                   return;
           }
   
         if (phar_obj->arc.archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->arc.archive) TSRMLS_CC)) {          if (phar_obj->arc.archive->is_persistent && FAILURE == phar_copy_on_write(&(phar_obj->arc.archive) TSRMLS_CC)) {
                 zval_ptr_dtor(&iteriter);                  zval_ptr_dtor(&iteriter);
Line 2100  PHP_METHOD(Phar, buildFromIterator) Line 1983  PHP_METHOD(Phar, buildFromIterator)
         pass.ret = return_value;          pass.ret = return_value;
         pass.count = 0;          pass.count = 0;
         pass.fp = php_stream_fopen_tmpfile();          pass.fp = php_stream_fopen_tmpfile();
           if (pass.fp == NULL) {
                   zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "phar \"%s\": unable to create temporary file", phar_obj->arc.archive->fname);
                   return;
           }
   
         if (SUCCESS == spl_iterator_apply(obj, (spl_iterator_apply_func_t) phar_build, (void *) &pass TSRMLS_CC)) {          if (SUCCESS == spl_iterator_apply(obj, (spl_iterator_apply_func_t) phar_build, (void *) &pass TSRMLS_CC)) {
                 phar_obj->arc.archive->ufp = pass.fp;                  phar_obj->arc.archive->ufp = pass.fp;
Line 2432  static zval *phar_convert_to_other(phar_archive_data * Line 2319  static zval *phar_convert_to_other(phar_archive_data *
                 zend_get_hash_value, NULL, 0);                  zend_get_hash_value, NULL, 0);
   
         phar->fp = php_stream_fopen_tmpfile();          phar->fp = php_stream_fopen_tmpfile();
           if (phar->fp == NULL) {
                   zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "unable to create temporary file");
                   return NULL;
           }
         phar->fname = source->fname;          phar->fname = source->fname;
         phar->fname_len = source->fname_len;          phar->fname_len = source->fname_len;
         phar->is_temporary_alias = source->is_temporary_alias;          phar->is_temporary_alias = source->is_temporary_alias;
Line 5037  PHP_METHOD(PharFileInfo, getContent) Line 4928  PHP_METHOD(PharFileInfo, getContent)
   
         phar_seek_efp(link, 0, SEEK_SET, 0, 0 TSRMLS_CC);          phar_seek_efp(link, 0, SEEK_SET, 0, 0 TSRMLS_CC);
         Z_TYPE_P(return_value) = IS_STRING;          Z_TYPE_P(return_value) = IS_STRING;
 #if PHP_MAJOR_VERSION >= 6  
         Z_STRLEN_P(return_value) = php_stream_copy_to_mem(fp, (void **) &(Z_STRVAL_P(return_value)), link->uncompressed_filesize, 0);  
 #else  
         Z_STRLEN_P(return_value) = php_stream_copy_to_mem(fp, &(Z_STRVAL_P(return_value)), link->uncompressed_filesize, 0);          Z_STRLEN_P(return_value) = php_stream_copy_to_mem(fp, &(Z_STRVAL_P(return_value)), link->uncompressed_filesize, 0);
 #endif  
   
         if (!Z_STRVAL_P(return_value)) {          if (!Z_STRVAL_P(return_value)) {
                 Z_STRVAL_P(return_value) = estrndup("", 0);                  Z_STRVAL_P(return_value) = estrndup("", 0);

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>